33 从命令行构建配置文件 #
AppArmor® 可让用户使用命令行界面而不是图形界面来管理和配置系统安全性。可以使用 AppArmor 命令行工具来跟踪 AppArmor 的状态,以及创建、删除或修改 AppArmor。
在开始使用 AppArmor 命令行工具管理配置文件之前,请查看第 29 章 “使程序免疫”和第 30 章 “配置文件组件和语法”中提供的 AppArmor 一般简介。
33.1 检查 AppArmor 状态 #
AppArmor 可能会处于以下三种状态中的任何一种:
- 已卸载
AppArmor 未在内核中激活。
- 正在运行
AppArmor 已在内核中激活,并在强制执行 AppArmor 程序策略。
- 已停止
AppArmor 已在内核中激活,但未强制执行策略。
通过检查 /sys/kernel/security/apparmor/profiles
来检测 AppArmor 的状态。如果 cat/sys/kernel/security/apparmor/profiles
报告了一列配置文件,则 AppArmor 正在运行。如果该文件为空且未返回任何消息,则表示 AppArmor 已停止。如果该文件不存在,则表示 AppArmor 已卸载。
使用 systemctl
来管理 AppArmor。您可以使用此工具执行以下操作:
sudo systemctl start apparmor
行为取决于 AppArmor 的状态。如果 AppArmor 未激活,
start
会将其激活并启动,同时将其置于运行状态。如果 AppArmor 已停止,start
会导致重新扫描 AppArmor 配置文件(通常位于/etc/apparmor.d
中)并将其置于运行状态。如果 AppArmor 已在运行,start
会发出警告,而不执行任何操作。注意:已在运行的进程要对已在运行的进程应用 AppArmor 配置文件,需要将其重启动。
sudo systemctl stop apparmor
通过去除内核内存中的所有配置文件来停止正在运行的 AppArmor,这会有效禁用所有访问控制,并将 AppArmor 置于停止状态。如果 AppArmor 已停止,
stop
会尝试再次卸载配置文件,但不会有任何结果。sudo systemctl reload apparmor
导致 AppArmor 模块重新扫描
/etc/apparmor.d
中的配置文件,但不取消限制正在运行的 进程。强制执行新创建的配置文件,并去除/etc/apparmor.d
目录中最近删除的配置文件。
33.2 构建 AppArmor 配置文件 #
AppArmor 模块配置文件定义以纯文本文件的形式储存在 /etc/apparmor.d
目录中。有关这些文件的详细语法说明,请参见第 30 章 “配置文件组件和语法”。
/etc/apparmor.d
目录中的所有文件被解释为配置文件并装载为配置文件。要防止装载配置文件,对此目录中的文件进行重命名不是一种有效的方式。您必须去除此目录中的配置文件,以有效防止读取和评估这些配置文件;或者对配置文件调用 aa-disable
,这会在 /etc/apparmor.d/disabled/
中创建一个符号链接。
您可以使用 vi
等文本编辑器来访问和更改这些配置文件。以下各节包含构建配置文件的详细步骤:
- 添加或创建 AppArmor 配置文件
有关详细信息,请参见 第 33.3 节 “添加或创建 AppArmor 配置文件”
- 编辑 AppArmor 配置文件
有关详细信息,请参见 第 33.4 节 “编辑 AppArmor 配置文件”
- 删除 AppArmor 配置文件
有关详细信息,请参见 第 33.6 节 “删除 AppArmor 配置文件”
33.3 添加或创建 AppArmor 配置文件 #
要为应用程序添加或创建 AppArmor 配置文件,可以使用系统的或独立的配置文件构建方法,视您的需要而定。第 33.7 节 “构建配置文件的两种方式”中详细介绍了这两种方法。
33.4 编辑 AppArmor 配置文件 #
以下步骤说明编辑 AppArmor 配置文件的过程:
如果您当前不是以
root
身份登录的,请在终端窗口中输入su
。出现提示时输入
root
口令。使用
cd /etc/apparmor.d/
转到配置文件目录。输入
ls
以查看所有当前安装的配置文件。在 vim 等文本编辑器中打开配置文件以进行编辑。
完成必要的修改后保存配置文件。
在终端窗口中输入
systemctl reload apparmor
以重启动 AppArmor。
33.5 卸载未知的 AppArmor 配置文件 #
aa-remove-unknown
会卸载未储存在 /etc/apparmor.d
中的所有配置文件,例如,自动生成的 LXD 配置文件。这可能会损害系统的安全性。使用 -n
参数可列出所有将会卸载的配置文件。
要卸载不再位于 /etc/apparmor.d/
中的所有 AppArmor 配置文件,请运行:
tux >
sudo
aa-remove-unknown
您可以列显要去除的配置文件列表:
tux >
sudo
aa-remove-unknown -n
33.6 删除 AppArmor 配置文件 #
以下步骤说明删除 AppArmor 配置文件的过程。
从内核中去除 AppArmor 定义:
tux >
sudo
apparmor_parser -R /etc/apparmor.d/PROFILE
去除定义文件:
tux >
sudo
rm /etc/apparmor.d/PROFILE
tux >
sudo
rm /var/lib/apparmor/cache/PROFILE
33.7 构建配置文件的两种方式 #
掌握第 30 章 “配置文件组件和语法”中介绍的 AppArmor 配置文件语法后,您无需借助工具也能创建配置文件,但需要的工作量比较大。要避免这种情况,请使用 AppArmor 工具来自动创建和优化配置文件。
可采用两种方法创建 AppArmor 配置文件。这两种方法都有可用的工具。
- 独立式配置文件构建
此方法适用于运行时间有限的小型应用程序,如邮件客户端等用户客户端应用程序。有关更多信息,请参考第 33.7.1 节 “独立式配置文件构建”。
- 系统性配置文件构建
此方法适用于一次性为许多程序构建配置文件,还适用于为运行时间长达数日、数周或在重引导后连续运行的应用程序(如 Web 服务器、邮件服务器等网络服务器应用程序)构建配置文件。有关更多信息,请参考第 33.7.2 节 “系统性配置文件构建”。
使用 AppArmor 工具可使自动开发配置文件的过程变得更易于管理。
确定符合您的要求的配置文件构建方式。
执行一次静态分析。根据所选的配置文件构建方法运行
aa-genprof
或aa-autodep
。启用动态学习。为所有构建了配置文件的程序启动学习模式。
33.7.1 独立式配置文件构建 #
独立式配置文件的生成和改进由名为 aa-genprof
的程序来管理。此方法很简单,因为 aa-genprof
会负责处理所有事宜,但在程序测试运行的整个过程中都需要运行 aa-genprof
(在开发配置文件过程中不能重引导计算机),因此适合的场景比较有限。
要使用 aa-genprof
以独立式方法构建配置文件,请参见第 33.7.3.8 节 “aa-genprof — 生成配置文件”。
33.7.2 系统性配置文件构建 #
此方法之所以称为系统性配置文件构建,是因为它会一次性更新系统中所有的配置文件,而不像 aa-genprof
或独立式配置文件构建那样只针对一个或少数几个配置文件。采用系统性配置文件构建方法时,构建和改进配置文件的自动化程度会有所下降,但更灵活。此方法适用于为长时间运行且其行为会在重引导后持续的应用程序构建配置文件,或者一次性为许多程序构建配置文件。
按如下方式为一组应用程序构建 AppArmor 配置文件:
为构成应用程序的各个程序创建配置文件。
尽管此方法是系统性的,但 AppArmor 只监视具有配置文件及其子配置文件的程序。要让 AppArmor 将某个程序考虑在内,您至少应通过
aa-autodep
为此程序创建一个大概的配置文件。要创建此大概的配置文件,请参见第 33.7.3.1 节 “aa-autodep — 创建大概的配置文件”。使相关的配置文件进入学习或提示模式。
在终端窗口中输入以下命令
tux >
sudo
aa-complain /etc/apparmor.d/*(以
root
身份登录后),为所有构建了配置文件的程序激活学习或控诉模式。也可以通过第 32.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。处于学习模式时,访问请求不会被阻止,即使配置文件指示应阻止时也是如此。这样您就可以完整运行若干测试(如步骤 3所示)并了解程序正常运行时的访问需要。通过此信息,您可以确定配置文件的防护程度。
有关使用学习模式和提示模式的具体说明,请参见第 33.7.3.2 节 “aa-complain — 进入控诉或学习模式”。
演习应用程序。
运行应用程序并行使其功能。演习程序的多少功能由您决定,但您必须让程序访问代表其访问要求的每个文件。由于执行不受
aa-genprof
的监督,因此此步骤可以持续数天或数周时间,而且在所有系统重引导后仍会持续。分析日志。
进行系统性配置文件构建时,请直接运行
aa-logprof
,而不要让aa-genprof
来运行它(进行独立式配置文件构建时会如此操作)。aa-logprof
的一般格式如下:tux >
sudo
aa-logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]有关使用
aa-logprof
的详细信息,请参见第 33.7.3.9 节 “aa-logprof — 扫描系统日志”。这样会生成最佳的配置文件。此重复操作方式会捕捉可经过训练并重新载入策略引擎的较小数据集。后续重复操作将生成较少的消息,而且运行速度较快。
编辑配置文件。
您应该查看已生成的配置文件。可以使用文本编辑器打开和编辑
/etc/apparmor.d/
中的配置文件。返回到强制模式。
此时系统会重新强制执行配置文件的规则,而不仅仅是记录信息。此操作可以通过从配置文件中去除
flags=(complain)
文本手动完成,也可以使用aa-enforce
命令自动完成,该命令的工作方式与aa-complain
命令完全相同,只不过会将配置文件设置为强制模式。也可以通过第 32.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。要确保所有配置文件都已解除控诉模式并已置于强制模式,请输入
aa-enforce /etc/apparmor.d/*
。重新扫描所有配置文件。
要让 AppArmor 重新扫描所有配置文件并在内核中更改该强制模式,请输入
systemctl reload apparmor
。
33.7.3 构建配置文件的工具汇总 #
apparmor-utils
RPM 软件包提供了用于构建 AppArmor 配置文件的所有实用程序(储存在 /usr/sbin
中)。每个工具都有不同的用途。
33.7.3.1 aa-autodep — 创建大概的配置文件 #
此工具可为所选的程序或应用程序创建大概的配置文件。您可以为二进制可执行文件和已解释的脚本程序生成大概的配置文件。生成的配置文件之所以称为“大概的配置文件”,是因为它不一定包含 AppArmor 正确限制程序所需的所有配置文件项。最小的 aa-autodep
大概配置文件至少具备基础的 include 指令,它包含大多数程序都需要的基本配置文件项。对于某些类型的程序,aa-autodep
会生成内容更丰富的配置文件。配置文件的生成方式是在命令行上列出的可执行文件上以递归方式调用 ldd(1)
。
要生成大概的配置文件,请使用 aa-autodep
程序。程序参数可以是程序的简单名称(aa-autodep
通过搜索外壳的路径变量找到此名称),也可以是完全限定的路径。程序本身可以是任意类型(ELF 二进制文件、外壳脚本、Perl 脚本,等等)。aa-autodep
会生成一个大概的配置文件,后续的动态配置文件构建过程会对其进行改进。
生成的大概配置文件将写入到 /etc/apparmor.d
目录,并使用 AppArmor 配置文件命名约定,即在程序绝对路径后面命名配置文件,同时将路径中的正斜线 (/
) 字符替换为句点 (.
) 字符。aa-autodep
的一般语法是在终端窗口中输入以下命令:
tux >
sudo
aa-autodep [ -d /PATH/TO/PROFILES ] [PROGRAM1 PROGRAM2...]
如果不输入程序名称,则计算机会提示您输入它(它们)。如果您将配置文件保存在非默认位置,/path/to/profiles 会覆盖 /etc/apparmor.d
的默认位置。
开始构建配置文件前,您必须为作为应用程序一部分的各个主可执行服务创建配置文件(它们启动后不会从属于其它已具备配置文件的程序)。此类程序的查找取决于相关的应用程序。以下是查找此类程序的一些策略:
- 目录
如果需要构建配置文件的所有程序都位于同一个目录内,而且此目录中没有其他程序,只需使用
aa-autodep
/path/to/your/programs/* 命令就可以为此目录中的所有程序创建基本配置文件。- pstree -p
您可以运行应用程序并使用标准的 Linux
pstree
命令找到所有运行中的进程。然后手动搜寻这些程序的位置,并针对每个程序运行aa-autodep
。如果程序在您的路径中,则aa-autodep
会为您找到它们。如果程序不在您的路径中,则标准的 Linux 命令find
可能有助于您查找程序。执行find / -name '
MY_APPLICATION' -print 以确定应用程序的路径(MY_APPLICATION 为示例应用程序)。如果情况适合,您可以使用通配符。
33.7.3.2 aa-complain — 进入控诉或学习模式 #
控诉和学习模式工具 (aa-complain
) 会检测对 AppArmor 配置文件规则的违规,例如构建了配置文件的程序访问配置文件不允许的其他文件。冲突是允许的,但也会被记录。要改进配置文件,请开启控诉模式,对程序运行一套测试以生成反映程序访问需求的日志事件,然后使用 AppArmor 工具对日志进行后处理,以将日志事件转换为改进的配置文件。
手动激活控诉模式(使用命令行)会在配置文件的顶部添加一个标志,因此 /bin/foo
将变成 /bin/foo flags=(complain)
。要使用控诉模式,请打开一个终端窗口,然后以 root
身份输入以下命令:
如果示例程序 (PROGRAM1) 在您的路径中,请使用:
tux >
sudo
aa-complain [PROGRAM1 PROGRAM2 ...]如果程序不在您的路径中,请指定整个路径,如下所示:
tux >
sudo
aa-complain /sbin/PROGRAM1如果配置文件不在
/etc/apparmor.d
中,请输入以下命令以取代默认位置:tux >
sudo
aa-complain /path/to/profiles/PROGRAM1按如下所示指定 /sbin/program1 的配置文件:
tux >
sudo
aa-complain /etc/apparmor.d/sbin.PROGRAM1
上述每条命令都会激活所列配置文件或程序的控诉模式。如果程序名不包含其整个路径,则 aa-complain
命令会搜索该程序的 $PATH
。例如,aa-complain /usr/sbin/*
会查找与 /usr/sbin
中的所有程序关联的配置文件,并将其置于控诉模式。aa-complain /etc/apparmor.d/*
会将 /etc/apparmor.d
中的所有配置文件都置于控诉模式。
YaST 提供了一个用于切换控诉模式和强制模式的图形前端。有关信息,请参见 第 32.4.2 节 “更改单个配置文件的模式”。
33.7.3.3 aa-decode — 解码 AppArmor 日志文件中的十六进制编码字符串 #
aa-decode
将解码 AppArmor 日志输出中的十六进制编码字符串。它还可以处理有关标准输入的审计日志,转换任何十六进制编码的 AppArmor 日志项,并在标准输出中显示这些项。
33.7.3.4 aa-disable — 禁用 AppArmor 安全配置文件 #
使用 aa-disable
可以禁用一个或多个 AppArmor 配置文件的强制模式。此命令将从内核中卸载配置文件,并防止在 AppArmor 启动时装载该配置文件。使用 aa-enforce
或 aa-complain
实用程序可更改此行为。
33.7.3.5 aa-easyprof — 轻松生成配置文件 #
aa-easyprof
提供了便于使用的界面来生成 AppArmor 配置文件。aa-easyprof
支持使用模板和配置文件组来快速构建应用程序的配置文件。尽管 aa-easyprof
有助于生成配置文件,但其实用程序依赖于所用模板、配置文件组和抽象的质量。此外,此工具在创建配置文件方面的限制比手动或使用 aa-genprof
和 aa-logprof
创建配置文件要少一些。
有关详细信息,请参见 aa-easyprof
(8) 的手册页。
33.7.3.6 aa-enforce — 进入强制模式 #
强制模式会检测对 AppArmor 配置文件规则的违规,例如构建了配置文件的程序访问配置文件不允许的文件。违规会被记录下来,并且不会允许此类事件。默认会启用强制模式。如要仅记录违规但仍允许此类事件,请使用控诉模式。
手动激活强制模式(使用命令行)会去除配置文件顶部的 complain 标志,使 /bin/foo flags=(complain)
变成 /bin/foo
。要使用强制模式,请打开一个终端窗口,然后输入以下命令。
如果示例程序 (PROGRAM1) 在您的路径中,请使用:
tux >
sudo
aa-enforce [PROGRAM1 PROGRAM2 ...]如果程序不在您的路径中,请指定整个路径,如下所示:
tux >
sudo
aa-enforce /sbin/PROGRAM1如果配置文件不在 /etc/apparmor.d 中,请输入以下命令以取代默认位置:
tux >
sudo
aa-enforce -d /path/to/profiles/ program1按如下所示指定 /sbin/program1 的配置文件:
tux >
sudo
aa-enforce /etc/apparmor.d/sbin.PROGRAM1
上述命令会激活所列配置文件和程序的强制模式。
如果不输入程序或配置文件的名称,则计算机会提示您输入名称。/path/to/profiles 会取代默认位置 /etc/apparmor.d
。
参数可以是一个程序列表或一个配置文件列表。如果程序名不包含其整个路径,则 aa-enforce
命令会搜索程序的 $PATH
。
YaST 提供了一个用于切换控诉模式和强制模式的图形前端。有关信息,请参见 第 32.4.2 节 “更改单个配置文件的模式”。
33.7.3.7 aa-exec — 使用指定的配置文件限制程序 #
使用 aa-exec
可以启动指定的配置文件和/或配置文件名称空间所限制的程序。如果同时指定了配置文件和名称空间,程序将由新名称空间中的配置文件限制。如果仅指定了配置文件名称空间,将使用当前限制的配置文件名称。如果配置文件和名称空间均未指定,将使用标准的配置文件附件运行命令 — 如同未使用 aa-exec
命令一样。
有关该命令的选项的详细信息,请参见该命令的手册页 man 8 aa-exec
。
33.7.3.8 aa-genprof — 生成配置文件 #
aa-genprof
是用于生成 AppArmor 配置文件的实用程序。它可以对指定的程序运行 aa-autodep
以创建大概配置文件(如果此程序尚不存在配置文件)、将其设置为控诉模式、将其重新装载到 AppArmor、标记日志、提示用户执行程序以及运用其功能。其语法如下所示:
tux >
sudo
aa-genprof [ -d /path/to/profiles ] PROGRAM
要为 Apache Web 服务器程序 httpd2-prefork 创建配置文件,请以 root
身份执行以下操作:
输入
systemctl stop apache2
。接下来,输入
aa-genprof httpd2-prefork
。现在,
aa-genprof
会执行以下操作:使用外壳的路径变量解析 httpd2-prefork 的完整路径。您也可以指定完整路径。在 SUSE Linux Enterprise Server 上,默认的完整路径为
/usr/sbin/httpd2-prefork
。检查 httpd2-prefork 是否已存在配置文件。如果已有,则会被更新。如果不存在,则会使用第 33.7.3 节 “构建配置文件的工具汇总”中所述的
aa-autodep
创建一个配置文件。将此程序的配置文件置于学习或控诉模式,这样会记录配置文件违规,但允许此类违规以便继续操作。日志事件如下所示(请参见
/var/log/audit/audit.log
):type=APPARMOR_ALLOWED msg=audit(1189682639.184:20816): \ apparmor="DENIED" operation="file_mmap" parent=2692 \ profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \ name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \ requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0
如果您未运行审计守护程序,AppArmor 事件将直接记录到
systemd
日记(请参见第 17 章 “journalctl
:查询systemd
日志”):Sep 13 13:20:30 K23 kernel: audit(1189682430.672:20810): \ apparmor="DENIED" operation="file_mmap" parent=2692 \ profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \ name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \ requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0
您也可以使用
dmesg
命令来查看这些事件:audit(1189682430.672:20810): apparmor="DENIED" \ operation="file_mmap" parent=2692 \ profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \ name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \ requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0
使用日志事件的起始标记来标记要考虑的日志。例如:
Sep 13 17:48:52 figwit root: GenProf: e2ff78636296f16d0b5301209a04430d
看到工具的提示时,在另一个终端窗口中运行应用程序,并执行尽可能多的应用程序功能。如此,学习模式便可以记录程序在正常运行时需要访问的文件和目录。例如,在新终端窗口中输入
systemctl start apache2
。执行程序功能后,在
aa-genprof
终端窗口中选择以下可用选项:S 会在
aa-genprof
启动并重新装载配置文件后从标记位置开始对系统日志运行aa-genprof
。如果日志中存在系统事件,AppArmor 会分析学习模式日志文件。这会生成一系列问题,您必须回答这些问题以引导aa-genprof
生成安全配置文件。F 会退出工具。
注意如果出现添加帽子的请求,请进入第 34 章 “使用 ChangeHat 构建 Web 应用程序的配置文件”。
回答两类问题:
构建配置文件的程序访问了配置文件中没有的资源(请参见例 33.1 “学习模式例外:控制对特定资源的访问”)。
构建配置文件的程序执行了一个程序,而安全域转换尚未定义(请参见例 33.2 “学习模式例外:定义项的权限”)。
这两种类别都会生成一系列问题,您必须回答这些问题,以将资源或程序添加到配置文件。例 33.1 “学习模式例外:控制对特定资源的访问”和例 33.2 “学习模式例外:定义项的权限”提供了每种类别的示例。后续步骤将说明回答这些问题时的选项。
处理执行权限非常复杂。您必须决定如何继续处理此项,指定向此项授予哪种执行权限类型:
例 33.1︰ 学习模式例外:控制对特定资源的访问 #Reading log entries from /var/log/audit/audit.log. Updating AppArmor profiles in /etc/apparmor.d. Profile: /usr/sbin/cupsd Program: cupsd Execute: /usr/lib/cups/daemon/cups-lpd Severity: unknown (I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny / Abo(r)t / (F)inish
- 继承 (ix)
子程序继承父程序的配置文件,以与父程序相同的访问控制运行。当被限制的程序需要调用其它被限制的程序时此模式非常实用,无须获得目标程序配置文件的权限或失去当前配置文件的权限。当子程序是助手应用程序(例如,使用
less
作为分页器的/usr/bin/mail
客户端)时,通常使用此模式。- 配置文件 (px/px)
子程序以自己的配置文件运行,此配置文件必须载入内核。如果不存在配置文件,则尝试执行子程序时会因访问被拒而失败。这最适合父程序在调用全局服务的情形,如进行 DNS 查找或通过系统的 MTA 发送邮件时。
选择
(Px) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。- 子项 (cx/cx)
设置目标为子配置文件的转换。它与 px/Px 转换类似,只不过是转换为子配置文件。
选择
(Cx) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。- 未受限 (ux/ux)
对执行的资源不应用任何 AppArmor 配置文件,子项在完全没有限制的情况下运行。
选择AppArmor。请仅在万不得已的情况下才这样做。
(Ux) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。请注意,运行无限制的配置文件会造成安全漏洞,攻击者可能会利用此漏洞来避开- mmap (m)
此权限与
PROT_EXEC
标志结合表示基于配置文件运行的程序可以使用 mmap 系统调用来访问资源。这意味着可以执行其中映射的数据。如果在配置文件构建过程运行期间要求此权限,系统会提示您包含此权限。- 拒绝
在配置文件中添加一条
拒绝
规则,以永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。- 中止
中止
aa-logprof
,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。- 完成
关闭
aa-logprof
,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
例 33.2 “学习模式例外:定义项的权限”演示了 AppArmor 建议允许使用通配模式
/var/run/nscd/*
进行读取,然后使用一个抽象来涵盖常用的 Apache 相关访问规则。例 33.2︰ 学习模式例外:定义项的权限 #Profile: /usr/sbin/httpd2-prefork Path: /var/run/nscd/dbSz9CTr Mode: r Severity: 3 1 - /var/run/nscd/dbSz9CTr [2 - /var/run/nscd/*] (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts Adding /var/run/nscd/* r to profile. Profile: /usr/sbin/httpd2-prefork Path: /proc/11769/attr/current Mode: w Severity: 9 [1 - #include <abstractions/apache2-common>] 2 - /proc/11769/attr/current 3 - /proc/*/attr/current (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts Adding #include <abstractions/apache2-common> to profile.
AppArmor 提供了一个或多个路径或 include。通过输入选项编号选择所需的选项,然后继续执行下一步。
注意AppArmor 菜单中并不会始终显示所有这些选项。
#include
AppArmor 配置文件的此部分代表一个 include 文件,它会获取程序的访问权限。通过使用 include,您可以向程序赋予访问其它程序也需要的目录路径和文件的权限。使用 include 可减小配置文件的大小。选择建议的 include 是不错的做法。
- 通配形式
按下一步所述选择第 30.6 节 “配置文件名称、标志、路径和通配”。
即可访问该部分。有关通配语法的更多信息,请参见- 实际路径
这是程序要正常运行需要访问的实际路径。
选择路径或 include 后,通过选择AppArmor 配置文件中。如果您对显示的目录路径项不满意,也可以使用 对其进行处理。
或 来处理它,将它以项的形式加入到以下选项用于处理学习模式项和构建配置文件:
- 选择 Enter
允许访问选定的目录路径。
- 允许
允许访问指定的目录路径项。AppArmor 会给出文件访问权限建议。有关更多信息,请参考第 30.7 节 “文件权限访问模式”。
- 拒绝
阻止程序访问指定目录路径项的权限。AppArmor 随后会继续处理下一个事件。
- 新建
提示您输入针对此事件的自己的规则,允许指定正则表达式。如果该表达式实际上不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。
- 通配
选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入该路径前面列显的编号,然后决定如何继续处理所选项。
有关通配语法的详细信息,请参见第 30.6 节 “配置文件名称、标志、路径和通配”。
- 保留扩展名的通配
此选项会修改原始目录路径,不过会保留文件扩展名。例如,
/etc/apache2/file.ext
将变成/etc/apache2/*.ext
,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以.ext
为扩展名的所有文件。- 中止
中止
aa-logprof
,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。- 完成
关闭
aa-logprof
,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
要使用
vi
查看并编辑配置文件,请在终端窗口中输入vi /etc/apparmor.d/
PROFILENAME。在 vim 中编辑 AppArmor 配置文件时,如要启用语法高亮显示,请使用:syntax on
命令,然后使用:set syntax=apparmor
命令。有关 vim 和语法高亮显示的详细信息,请参见第 33.7.3.14 节 “apparmor.vim”。重启动 AppArmor,然后使用
systemctl reload apparmor
命令重新装载配置文件集,包括新建的配置文件。
与用于构建 AppArmor 配置文件的图形前端一样,YaST 添加配置文件向导 aa-genprof
也支持使用 /usr/share/apparmor/extra-profiles
下的本地配置文件储存库。
要使用本地储存库中的配置文件,请按如下所示继续操作:
按上文所述启动
aa-genprof
。如果
aa-genprof
找到了非活动的本地配置文件,则终端窗口中会显示以下几行:Profile: /usr/bin/opera [1 - Inactive local profile for /usr/bin/opera] [(V)iew Profile] / (U)se Profile / (C)reate New Profile / Abo(r)t / (F)inish
要使用此配置文件,请按 U( )并执行上文所述的配置文件生成过程。
要在激活配置文件之前对其进行检查,请按 V( )。
要忽略现有的配置文件,请按 C( ),并执行上文所述的配置文件生成过程从头开始创建配置文件。
完成后,按 F( )退出
aa-genprof
并保存更改。
33.7.3.9 aa-logprof — 扫描系统日志 #
aa-logprof
是一个交互式工具,用于查看 /var/log/audit/audit.log
内的日志项中的控诉和强制模式事件,或直接查看 systemd
日记中的此类事件(请参见第 17 章 “journalctl
:查询 systemd
日志”),以及在 AppArmor 安全配置文件中生成新的项。
运行 aa-logprof
后,它会开始扫描在控诉和强制模式下生成的日志文件,如果存在现有配置文件集未涵盖的新安全事件,它会给出修改配置文件的建议。aa-logprof
使用此信息来观察程序行为。
如果某个受限制的程序派生并执行另一个程序,aa-logprof
会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式 ix、px、Px、ux、Ux、cx、Cx 以及命名的配置文件均为用于启动子进程的选项。如果子进程具有单独的配置文件,则默认选择为 Px。如果不存在单独的配置文件,则默认为 ix。系统会对有单独配置文件的子进程运行 aa-autodep
并将其装载到 AppArmor 中(如果它正在运行)。
aa-logprof
退出时,将保存所做的更改以更新配置文件。如果 AppArmor 处于活动状态,将重新装载更新的配置文件;如有任何生成安全事件的进程仍在 null-XXXX 配置文件(在控诉模式下临时创建的独有配置文件)中运行,这些进程将设置为基于其适当配置文件运行。
要运行 aa-logprof
,请以 root
身份登录并在终端窗口中输入 aa-logprof
。以下选项可用于 aa-logprof
:
aa-logprof -d
/path/to/profile/directory/如果配置文件不位于标准目录
/etc/apparmor.d/
下,指定配置文件所处位置的完整路径。aa-logprof -f
/path/to/logfile/如果日志文件不在默认目录或
/var/log/audit/audit.log
中,请指定日志文件所在位置的完整路径。aa-logprof -m "string marker in logfile"
标记
aa-logprof
要在系统日志中查看的起点。aa-logprof
会忽略系统日志中位于指定标记前面的所有事件。如果标记包含空格,必须将标记括在引号中才能正常工作。例如:root #
aa-logprof -m "17:04:21"或
root #
aa-logprof -m e2ff78636296f16d0b5301209a04430d
aa-logprof
将扫描日志,询问您如何处理记录的每个事件。每个问题都会显示一个带有编号的 AppArmor 规则列表,按列表中项目的编号可以添加相应规则。
默认情况下,aa-logprof
会在 /etc/apparmor.d/
中查找配置文件。以 root
身份运行 aa-logprof
往往便足以更新配置文件。不过,您有时可能需要搜索存档的日志文件,例如当程序的执行时间段超过日志轮换期时(日志文件已存档,新的日志文件已开始时)。在这种情况下,您可以输入 zcat -f `ls -1tr
/path/to/logfile*` | aa-logprof -f -。
33.7.3.10 aa-logprof 示例 1 #
下面的示例说明 aa-logprof
如何处理访问 /etc/group
文件的 httpd2-prefork。[]
表示默认选项。
在本示例中,对 /etc/group
的访问是 httpd2-prefork 访问名称服务的一部分。相应的响应是 1
,它包括预定义的 AppArmor 规则集。选择 1
#include
,名称服务软件包会解析与 DNS 查找相关的所有问题,同时使配置文件更不容易损坏,这样对 DNS 配置和关联名称服务配置文件软件包的更改可一次完成,而无需修改许多配置文件。
Profile: /usr/sbin/httpd2-prefork Path: /etc/group New Mode: r [1 - #include <abstractions/nameservice>] 2 - /etc/group [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish
请选择以下响应之一:
- 选择 Enter
触发默认操作,在本示例中为允许访问指定的目录路径项。
- 允许
允许访问指定的目录路径项。AppArmor 会给出文件访问权限建议。有关更多信息,请参见第 30.7 节 “文件权限访问模式”。
- 拒绝
永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。
- 新建
提示您输入您自己对此事件的规则,允许您指定任意形式的常规表达式。如果输入的表达式实际上不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。
- 通配
选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入路径前面列显的编号,然后决定如何继续处理所选项。
有关通配语法的详细信息,请参见第 30.6 节 “配置文件名称、标志、路径和通配”。
- 保留扩展名的通配
此选项会修改原始目录路径,不过会保留文件扩展名。例如,
/etc/apache2/file.ext
将变成/etc/apache2/*.ext
,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以.ext
为扩展名的所有文件。- 中止
中止
aa-logprof
,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。- 完成
关闭
aa-logprof
,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
33.7.3.11 aa-logprof 示例 2 #
例如,在为 vsftpd 构建配置文件时,会看到以下问题:
Profile: /usr/sbin/vsftpd Path: /y2k.jpg New Mode: r [1 - /y2k.jpg] (A)llow / [(D)eny] / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish
此问题中出现了几个要注意的项目。首先,我们注意到 vsftpd 正在询问树顶的路径项,即便默认情况下 SUSE Linux Enterprise Server 上的 vsftpd 是从 /srv/ftp
提供 FTP 文件。这是因为 vsftpd 使用的是 chroot,对于 chroot jail 内部的代码部分,AppArmor 看到的是对 chroot 环境(而非全局绝对路径)的文件访问。
第二个要注意的事项是,您应该授予对该目录中所有 JPEG 文件的 FTP 读取权限,以便可以使用/*.jpg
。这样做会破坏前面授予对单个 .jpg
文件的访问权限的所有规则,并会阻止此后有关访问 .jpg
文件的所有问题。
最后,您应该授予对 FTP 文件的更广泛的访问权限。如果在最后一项中选择aa-logprof
会将建议的路径 /y2k.jpg
替换为 /*
。此外,您应该授予对整个目录树的更多访问权限,在这种情况下,可以使用 路径选项并输入 /**.jpg
(这会授予对整个目录树中所有 .jpg
文件的访问权限)或 /**
(这会授予对目录树中所有文件的访问权限)。
这些项会处理读取访问权限。写权限与此类似,不同的是您在使用写权限的常规表达式时最好更加保守。处理执行权限较为复杂。例 33.1 “学习模式例外:控制对特定资源的访问”中提供了相应示例。
下面的示例将构建 /usr/bin/mail
邮件客户端的配置文件,aa-logprof
已发现 /usr/bin/mail
将 /usr/bin/less
作为助手应用程序执行,用于将长邮件“分页”。结果会显示以下提示:
/usr/bin/nail -> /usr/bin/less (I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny
/usr/bin/mail
的实际可执行文件为 /usr/bin/nail
,这不是印刷错误。
/usr/bin/less
程序可以简单地在长度大于一个屏幕的文本之间滚动,这其实就是 /usr/bin/mail
使用它的原因。 但 less
实际上是一个功能强大的大型程序,使用了许多其他助手应用程序,如 tar
和 rpm
。
对 tar 文件或 RPM 文件运行 less
,它即会显示这些容器的库存。
您不希望阅读邮件时自动运行 rpm
(这会直接导致 Microsoft* Outlook 样式的病毒攻击,因为 RPM 具有安装和修改系统程序的能力),因此这种情况下的最佳选择为使用 。这会使在本文中执行的 less 程序运行于 /usr/bin/mail
的配置文件之下。这会产生两种结果:
您需要将
/usr/bin/less
的所有基本文件权限添加到/usr/bin/mail
的配置文件中。您可以避免将
tar
和rpm
等助手应用程序添加到/usr/bin/
配置文件,这样,当/usr/bin/mail
在此环境中运行/usr/bin/mail/less
时,less 程序要比不受 AppArmor 保护时安全得多。另一个选择是使用 Cx 执行模式。有关执行模式的详细信息,请参见第 30.12 节 “执行模式”。
在其它情况下,您可能想要使用aa-logprof
产生以下影响:
写入配置文件的规则使用 px/Px,这会强制转换到子项自己的配置文件。
aa-logprof
会为子项构造一个配置文件,然后通过将子进程的事件指派到子项的配置文件并向aa-logprof
用户提出问题,开始以构建父配置文件的相同方式构建此配置文件。如果您将子项作为独立程序运行,也会应用该配置文件。
如果某个受限制的程序派生并执行另一个程序,aa-logprof
会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式“继承”、“配置文件”、“未受限”、“子项”、“命名配置文件”,或用于拒绝执行的选项将会显示。
如果子进程具有单独的配置文件,则默认选择为“配置文件”。如果不存在配置文件,则默认选择为“继承”。第 30.7 节 “文件权限访问模式”中介绍了继承选项 (ix
)。
该配置文件选项指示子程序应在其自己的配置文件中运行。一个从属问题会询问是否要清理子程序从父项继承的环境。如果您选择清理环境,AppArmor 配置文件中将会添加执行修饰符 Px
。如果您选择不清理,配置文件中将会添加 px
,这样就不会进行环境清理。如果您选择配置文件执行模式,默认的执行模式为 Px
。
不建议使用未受限执行模式,仅当没有任何其他选项能够可靠地生成程序的配置文件时,才应使用该模式。选择未受限模式会打开一个警告对话框,要求您确认该选择。如果您确认并选择Ux
,请选择 。要在配置文件中改用执行模式 ux
,请选择 。默认选择的值为 Ux
(表示未受限执行模式)。
选择 ux 或 Ux
会造成很大的风险,它不会对子程序的最终执行行为强制执行策略(从安全角度而言)。
33.7.3.12 aa-unconfined — 识别不受保护的进程 #
aa-unconfined
命令会检查系统上的开放网络端口,将其与系统上装载的配置文件集进行比较,并报告不具备 AppArmor 配置文件的网络服务。它需要未被 AppArmor 配置文件限制的 root
特权。
要从 /proc
文件系统中检索进程可执行链接,就必须以 root
身份运行 aa-unconfined
。此程序易受以下竞态条件的影响:
未链接的可执行文件被误处理
进程在
netstat(8)
之间终止,而且进一步的检查被误处理
此程序仅列出使用 TCP 和 UDP 的进程。简而言之,此程序不适用于取证,仅在实验室中辅助构建所有可访问网络的进程的配置文件。
33.7.3.13 aa-notify #
aa-notify
是一个便利的实用程序,它可在桌面环境中显示 AppArmor 通知。如果您不想检查 AppArmor 日志文件,而仅希望桌面告知您违反策略的事件,此实用程序会非常便捷。要启用 AppArmor 桌面通知,请运行 aa-notify
:
tux >
sudo
aa-notify -p -u USERNAME --display DISPLAY_NUMBER
其中,USERNAME 是您登录时使用的用户名,DISPLAY_NUMBER 是您当前使用的 X Window 显示编号,例如 :0
。该进程在后台运行,每当发生拒绝事件时,就会显示通知。
活动的 X Window 显示编号保存在 $DISPLAY
变量中,因此,您可以使用 --display $DISPLAY
来避免查找当前显示编号。
aa-notify GNOME 中的消息
#
您还可以使用 -s DAYS
选项配置 aa-notify
,以显示指定的过去几天的通知摘要。有关 aa-notify
的详细信息,请参见其手册页 man 8 aa-notify
。
33.7.3.14 apparmor.vim #
vim 文本编辑器的语法高亮显示文件会用颜色高亮显示 AppArmor 配置文件的各种功能。利用 vim 和 vim 的 AppArmor 语法模式,您可以看到用颜色高亮显示的配置文件的语义含意。要使用 vim 来查看和编辑配置文件,请在终端窗口中输入 vim。
在 vim 中编辑 AppArmor 配置文件时,如要启用语法颜色标记,请使用 :syntax on
命令,然后使用 :set syntax=apparmor
命令。为确保 vim 将编辑的文件类型正确识别为 AppArmor 配置文件,请将
# vim:ft=apparmor
添加到配置文件的末尾。
vim
对 /etc/apparmor.d/
中的文件自动启用了 AppArmor 高亮显示。
启用此功能时,vim 会对配置文件的行上色:
- 蓝色
评论
- 白色
普通读权限的行
- 棕色
功能语句和“提示”标记
- 黄色
授予写权限的行
- 环保
授予执行权限的行(ix 或 px)
- 红色
授予无限制权限的行 (ux)
- 红色背景
不会正确装载到 AppArmor 模块的语法错误
要获取有关语法突出显示的更多 vim 帮助,请使用 apparmor.vim
和 vim
手册页以及 vim 编辑器内部的 :help 语法。AppArmor 语法储存在
/usr/share/vim/current/syntax/apparmor.vim
中。
33.8 重要的文件名和目录 #
下面的列表包含 AppArmor 框架使用的最重要的文件和目录。如果您打算手动管理配置文件以及对其查错,请确保您了解这些文件和目录:
/sys/kernel/security/apparmor/profiles
表示当前装载的配置文件集的虚拟化文件。
/etc/apparmor/
AppArmor 配置文件的位置。
/usr/share/apparmor/extra-profiles
AppArmor 随附但默认未启用的本地配置文件储存库。
/etc/apparmor.d/
配置文件的位置,采用将路径中的
/
替换为.
(不替换根目录/
)的约定命名,这样可以更方便地管理配置文件。例如,程序/usr/sbin/smbd
的配置文件命名为usr.sbin.smbd
。/etc/apparmor.d/abstractions/
抽象的位置。
/etc/apparmor.d/program-chunks/
程序块的位置。
/proc/*/attr/current
检查此文件可以查看进程的限制状态以及用于限制该进程的配置文件。
ps
auxZ
命令可自动检索这些信息。