38 支持 #
本章简要介绍维护方面的任务。您将了解到如何更新 AppArmor®,还会获得一个可用手册页的列表,这些手册页提供有关如何使用 AppArmor 所提供的命令行工具的基本帮助。查错一节提供了使用 AppArmor 时会遇到的一些常见问题及其解决方法。请遵循本章中的指导报告 AppArmor 的缺陷或提出增强请求。
38.1 联机更新 AppArmor #
我们采用与 SUSE Linux Enterprise Server 的任何其他更新相同的方式提供 AppArmor 软件包更新。您可以像检索和应用 SUSE Linux Enterprise Server 随附的任何其他软件包一样来检索和应用这些更新。
38.2 使用手册页 #
您可以使用手册页。在终端中输入 man apparmor 打开 AppArmor 手册页。手册页分布在编号为 1 到 8 的部分中。每个部分针对一种类别的文档:
|
部分 |
类别 |
|---|---|
|
1 |
用户命令 |
|
2 |
系统调用 |
|
3 |
库函数 |
|
4 |
设备驱动程序信息 |
|
5 |
配置文件格式 |
|
6 |
游戏 |
|
7 |
高级概念 |
|
8 |
管理员命令 |
区号用于对各个手册页进行区分。例如,exit(2) 描述退出系统调用,而 exit(3) 描述退出 C 库函数。
AppArmor 手册页包括:
aa-audit(8)aa-autodep(8)aa-complain(8)aa-decode(8)aa-disable(8)aa-easyprof(8)aa-enforce(8)aa-enxec(8)aa-genprof(8)aa-logprof(8)aa-notify(8)aa-status(8)aa-unconfined(8)aa_change_hat(8)logprof.conf(5)apparmor.d(5)apparmor.vim(5)apparmor(7)apparmor_parser(8)apparmor_status(8)
38.3 更多信息 #
http://wiki.apparmor.net 上提供了有关 AppArmor 产品的详细信息。所安装系统的 /usr/share/doc/manual 中提供了 AppArmor 的产品文档。
我们提供了 AppArmor 邮件列表,用户可向其发送邮件或加入其中,以与开发人员沟通。有关详细信息,请参见https://lists.ubuntu.com/mailman/listinfo/apparmor。
38.4 查错 #
本节列出了使用 AppArmor 时可能出现的最常见问题和错误消息。
38.4.1 如何应对应用程序行为异常? #
如果您注意到应用程序行为异常或其他类型的应用程序问题,应当先检查日志文件中的拒绝消息,以确定 AppArmor 对应用程序的限制是否过于严格。如果检测到有拒绝消息指出 AppArmor 对应用程序或服务的限制过于严格,请更新您的配置文件,以正确处理应用程序的用例。请使用 aa-logprof 执行此操作(第 34.7.3.9 节 “aa-logprof — 扫描系统日志”)。
如果您决定在不受 AppArmor 保护的情况下运行应用程序或服务,请从 /etc/apparmor.d 中去除应用程序的配置文件,或将其移到其他位置。
38.4.2 我的配置文件似乎不再正常工作... #
如果您一直在使用旧版的 AppArmor,后来更新了系统(但保留了旧的配置文件集),您可能会发现,在更新之前运行很正常的某些应用程序现在却出现奇怪的行为,或者无法运行。
此版本的 AppArmor 为配置文件语法和 AppArmor 工具引入了一组新功能,这可能会给旧版 AppArmor 配置文件造成问题。这些功能包括:
文件锁定
网络访问控制
SYS_PTRACE功能目录路径访问
当前版本的 AppArmor 可调解文件锁定,并为此引入了新的权限模式 (k)。如果请求文件锁定权限的应用程序受到旧版配置文件的限制,而这些配置文件并未显式包含用于锁定文件的权限,则这些应用程序可能会行为异常或完全失败。如果您怀疑存在这种情况,请在 /var/log/audit/audit.log 下的日志文件中检查如下所示的项:
type=AVC msg=audit(1389862802.727:13939): apparmor="DENIED" \ operation="file_lock" parent=2692 profile="/usr/bin/opera" \ name="/home/tux/.qt/.qtrc.lock" pid=28730 comm="httpd2-prefork" \ requested_mask="::k" denied_mask="::k" fsuid=30 ouid=0
按如下所述使用 aa-logprof 命令更新配置文件。
第 31.5 节 “网络访问控制”中所述的基于网络系列和类型规范的新网络访问控制语法可能导致应用程序行为异常甚至无法运行。如果您发现网络相关的应用程序出现奇怪的行为,请在 /var/log/audit/audit.log 下的日志文件中检查如下所示的项:
type=AVC msg=audit(1389864332.233:13947): apparmor="DENIED" \ operation="socket_create" family="inet" parent=29985 profile="/bin/ping" \ sock_type="raw" pid=30251 comm="ping"
此日志项表示我们的示例应用程序(在本例中为 /bin/ping)无法获取用于打开网络连接的 AppArmor 权限。为确保应用程序能够进行网络访问,需要显式指明此权限。要将配置文件更新为使用新语法,请按如下所述使用 aa-logprof 命令。
如果进程尝试访问 /proc/PID/fd/* 中的文件,当前内核需要 SYS_PTRACE 功能。新配置文件需要该文件项和该功能项,而旧配置文件只需要该文件项。例如,旧语法中的以下语句
/proc/*/fd/** rw,
将转换为新语法中的以下规则:
capability SYS_PTRACE, /proc/*/fd/** rw,
要将配置文件更新为使用新语法,请按如下所述使用 YaST 更新配置文件向导或 aa-logprof 命令。
在此版本的 AppArmor 中,对配置文件规则语法进行了几项更改,以便更好地将目录访问与文件访问区分开来。因此,在旧版本中与文件路径和目录路径匹配的某些规则现在可能只与文件路径匹配。这可能导致 AppArmor 无法访问某个关键目录,从而触发应用程序的行为异常和各种日志消息。以下示例重点指出了路径语法最重要的更改。
使用旧语法时,下面的规则将允许访问 /proc/net 中的文件和目录。它只允许目录访问操作读取该目录中的项,而不授予对该目录下的文件或目录的访问权限。例如,星号 (*) 将会匹配 /proc/net/dir/foo,但由于 foo 是 dir 下的一个文件或目录,因此无法访问它。
/proc/net/* r,
要使用新语法获得相同的行为,需要使用两条规则,而不是一条。第一条规则允许访问 /proc/net 下的文件,第二条规则允许访问 /proc/net 下的目录。目录访问只可用于列出内容,而不能实际访问该目录下的文件或目录。
/proc/net/* r, /proc/net/*/ r,
下面的规则在新旧语法中的工作方式类似,允许访问 /proc/net 下的文件和目录(但不允许访问 /proc/net/ 的目录列表本身):
/proc/net/** r,
要在新语法中使用上述表达式区分文件访问和目录访问,需使用以下两条规则:第一条规则仅允许递归访问 /proc/net 下的目录,而第二条规则仅显式允许进行递归文件访问。
/proc/net/**/ r, /proc/net/**[^/] r,
下面的规则在新旧语法中的工作方式类似,允许访问 /proc/net 下以 foo 开头的文件和目录:
/proc/net/foo** r,
要在新语法中区分文件访问和目录访问并使用 ** 通配模式,需使用以下两条规则:第一条规则在旧语法中会同时匹配文件和目录,而在新语法中只会匹配文件,因为没有尾随斜线。第二条规则在旧语法中既不匹配文件也不匹配目录,而在新语法中只会匹配目录:
/proc/net/**foo r, /proc/net/**foo/ r,
以下规则说明了 ? 通配模式的用法变化。在旧语法中,第一条规则会同时匹配文件和目录(四个字符,最后一个字符可以是除斜线以外的任何字符)。在新语法中,它只匹配文件(没有尾随斜线)。第二条规则在旧配置文件语法中不匹配任何内容,而在新语法中只会匹配目录。最后一条规则显式匹配名为 bar(/proc/net/foo? 下)的文件。使用旧语法时,此规则将应用于文件和目录:
/proc/net/foo? r, /proc/net/foo?/ r, /proc/net/foo?/bar r,
要查找并解决语法更改相关的问题,请在更新后花些时间检查您要保留的配置文件,并按如下所述继续处理您保留了其配置文件的每个应用程序:
将应用程序的配置文件置于控诉模式:
>sudoaa-complain/path/to/application系统会对违反当前配置文件的所有操作生成日志项,但不会强制执行该配置文件,并且应用程序的行为不受限制。
运行涵盖您需要其能够执行的所有任务的应用程序。
根据运行应用程序时生成的日志项更新配置文件:
>sudoaa-logprof/path/to/application将生成的配置文件重新置于强制模式:
>sudoaa-enforce/path/to/application
38.4.3 使用 Apache 解决问题 #
安装其他 Apache 模块(例如 apache2-mod_apparmor)或者对 Apache 做出配置更改后,再次构建 Apache 的配置文件,以确定是否需要向配置文件添加额外的规则。如果您不再次构建 Apache 的配置文件,Apache 可能无法正常启动,或者无法为网页提供服务。
38.4.4 如何从使用的配置文件列表中排除特定的配置文件? #
运行 aa-disable
PROGRAMNAME 可以禁用 PROGRAMNAME 的配置文件。此命令会创建指向 /etc/apparmor.d/disable/ 中的配置文件的符号链接。要重新激活配置文件,请删除该链接,并运行 systemctl reload apparmor。
38.4.5 我是否可以管理未安装在我系统上的应用程序的配置文件? #
要使用 AppArmor 管理配置文件,您需要有权访问运行应用程序的系统的日志。因此,只要您有权访问运行应用程序的计算机,就无需在配置文件构建主机上运行该应用程序。您可以在一个系统上运行应用程序,将日志(/var/log/audit.log,如果未安装 audit,则为 journalctl | grep -i apparmor > path_to_logfile)传输到配置文件构建主机,然后运行 aa-logprof -f
PATH_TO_LOGFILE。
38.4.6 如何找出和修复 AppArmor 语法错误 #
手动编辑 AppArmor 配置文件可能会产生语法错误。如果您的配置文件中存在语法错误,尝试启动或重启动 AppArmor 时,会显示类似下面的错误结果。此示例显示了整个分析程序错误的语法。
# systemctl start apparmor.service
Loading AppArmor profiles AppArmor parser error in /etc/apparmor.d/usr.sbin.squid \
at line 410: syntax error, unexpected TOK_ID, expecting TOK_MODE
Profile /etc/apparmor.d/usr.sbin.squid failed to load使用 AppArmor YaST 工具时,会有一条图形错误消息指出哪个配置文件包含错误,并要求您予以修复。
要修复语法错误,请以 root 身份在终端窗口中登录,打开配置文件,然后更正语法。使用 systemctl reload apparmor 重新装载配置文件集。
vi 中的 AppArmor 语法高亮显示
SUSE Linux Enterprise Server 上的编辑器 vi 支持 AppArmor 配置文件的语法高亮显示功能。包含语法错误的行的背景将会显示为红色。
38.5 报告 AppArmor 的 Bug #
AppArmor 的开发人员热切希望能够提供最高品质的产品。您的反馈和 bug 报告有助于我们保持较高的品质。当您在 AppArmor 中遇到 bug 时,请提交此产品的 bug 报告:
在网页浏览器中转到 http://bugzilla.suse.com/ 并单击。
输入您的 SUSE 帐户数据并单击。如果您没有 SUSE 帐户,请单击并提供所需的数据。
如果您的问题已有报告,请查看此错误报告,必要时在报告中添加其它信息。
如果您的问题尚无报告,请在顶部导航栏中选择进入页面。
选择要提交错误的产品。对于您而言,这应该是您的产品的发行版。单击“提交”
选择产品版本、组件(在本例中为 AppArmor)、硬件平台和严重性。
输入一个用于描述问题的简短标题,然后在下面添加更详尽的说明,包括日志文件。您可以在 bug 报告中创建附件,以提供屏幕截图、日志文件或测试案例。
输入所有详细信息后,单击以将报告发送到开发人员。
