AppArmor - 内核增强功能,用于将程序限制在一组有限的资源中。
描述
AppArmor 是内核增强功能,用于将程序限制在一组有限的资源中。AppArmor 独特的安全模型是将访问控制属性绑定到程序,而不是绑定到用户。
AppArmor 限制通过 apparmor_parser(8) 加载到内核中的配置文件提供,通常通过 apparmor.service systemd 单元提供,使用方式如下:
# systemctl start apparmor
# systemctl reload apparmor
AppArmor 可以以两种模式运行:强制执行模式和宽松模式(或学习模式):
强制执行模式 - 以强制执行模式加载的配置文件将强制执行配置文件中定义的策略,并将策略违反尝试报告给 syslogd。
宽松模式 - 以“宽松”模式加载的配置文件不会强制执行策略。相反,它将报告策略违反尝试。这种模式对于开发配置文件非常方便。要管理各个配置文件的宽松模式,可以使用 aa-complain(8) 和 aa-enforce(8) 实用程序。这些实用程序将程序名称作为参数。
配置文件传统上存储在 /etc/apparmor.d/ 目录中的文件中,文件名约定是用“.”替换路径名中的“/”(不包括根目录“/”),以便更轻松地管理配置文件(例如,/usr/sbin/nscd 文件的配置文件名为 usr.sbin.nscd)。
配置文件在 exec(3) 时应用于进程(如 execve(2) 系统调用所见):一旦为程序加载了配置文件,该程序将在下一次 exec(3) 时受到限制。如果进程已经在配置文件下运行,并且在内核中替换了该配置文件,则更新后的配置文件会立即应用于该进程。另一方面,已经以非限制模式运行的进程无法进行限制。
AppArmor 支持 Linux 内核的 securityfs 文件系统,并公开当前加载的配置文件的列表;要挂载该文件系统:
# mount -tsecurityfs securityfs /sys/kernel/security
$ cat /sys/kernel/security/apparmor/profiles
/usr/bin/mutt
/usr/bin/gpg
...
通常,init 脚本会在尚未完成的情况下挂载 securityfs。
AppArmor 还限制了受限制的进程可以执行的特权操作,即使该进程以 root 用户身份运行。受限制的进程无法调用以下系统调用:
create_module(2) delete_module(2) init_module(2) ioperm(2) iopl(2) ptrace(2) reboot(2) setdomainname(2) sethostname(2) swapoff(2) swapon(2) sysctl(2)
宽松模式
AppArmor 可以“允许”访问配置文件中没有规则的资源,并记录触发该操作的消息。这称为宽松模式。重要的是要注意,配置文件中存在的规则仍然适用,因此允许规则仍然会使审核消息保持静默或强制审核消息,并且拒绝规则仍然会导致拒绝和拒绝消息保持静默(请参阅“如果出现问题,请关闭拒绝审核静默”)。
可以使用宽松模式以增量方式开发配置文件,在应用程序执行时。可以记录的访问内容可以添加到配置文件中,然后可以进一步执行该应用程序,以发现还需要进行的进一步添加。由于 AppArmor 允许访问,因此应用程序的行为方式与 AppArmor 未对其进行限制时相同。
警告:在启用期间,宽松模式不提供任何安全性,仅提供审核。不应在敌对环境中或不良行为可能会被记录并添加到配置文件中,就好像它们是应用程序应使用的资源访问一样。
请注意,对于新的或空的配置文件,宽松模式可能会非常嘈杂,但对于开发良好的配置文件,它可能不会记录任何内容。如果宽松模式生成过多的日志消息,请参阅“审核速率限制”。
要将配置文件及其可能包含的任何子配置文件或“hat”配置文件设置为宽松模式,请使用
aa-complain /etc/apparmor.d/<the-application>
要手动将特定配置文件设置为宽松模式,请添加“宽松”标志,然后手动重新加载配置文件:
profile foo flags=(complain) { ... }
请注意,“宽松”标志还必须手动添加到该配置文件的任何“hat”或子配置文件中,否则它们将继续使用先前的模式。
要全局启用宽松模式,请运行:
echo -n complain > /sys/module/apparmor/parameters/mode
或者,要在启动时设置,请添加:
apparmor.mode=complain
作为内核启动参数。
警告:全局设置宽松模式会禁用所有 AppArmor 安全保护。这在调试或配置文件开发期间可能很有用,但以每个配置文件的形式选择性地设置它会更安全。
错误
当受限制的进程尝试访问其没有权限访问的文件时,内核将通过审核报告一条消息,类似于:
audit(1386511672.612:238): apparmor="DENIED" operation="exec"
parent=7589 parent=7589 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=(none) ses=1 comm="process_name" exe=/path/to/executable audit_time=1393972032.612 audit_pid=7589 audit_pid=7589
key="audit_key"
operation="exec"
resource="pathname"
resource_node="parent"
success="no"
或
audit(1386511672.612:239): apparmor="PERMIT" operation="exec"
parent=7589 parent=7589 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=(none) ses=1 comm="process_name" exe=/path/to/executable audit_time=1393972032.612 audit_pid=7589 audit_pid=7589
key="audit_key"
operation="exec"
resource="pathname"
resource_node="parent"
success="yes"
调试
AppArmor 提供了几个用于记录更多信息的设施,这些信息可以帮助调试配置文件。
启用调试模式
当启用调试模式时,AppArmor 会将一些额外的消息记录到 dmesg(不是通过审核子系统)。例如,日志将说明是否应用了环境清理。
要启用调试模式,请运行:
echo 1 > /sys/module/apparmor/parameters/debug
或者,要在启动时设置,请添加:
apparmor.debug=1
作为内核启动参数。
关闭拒绝审核静默
默认情况下,触发“拒绝”规则的操作不会被记录。这称为拒绝审核静默。
要关闭拒绝审核静默,请运行:
echo -n noquiet >/sys/module/apparmor/parameters/audit
或者,要在启动时设置,请添加:
apparmor.audit=noquiet
作为内核启动参数。
强制审核模式
AppArmor 可以记录针对配置文件中配置的每个规则触发的所有操作的消息。这称为强制审核模式。
警告!强制审核模式即使对于单个配置文件也可能非常嘈杂,更不用说在全局启用的情况下。
要将特定配置文件设置为强制审核模式,请添加“审核”标志:
profile foo flags=(audit) { ... }
要全局启用强制审核模式,请运行:
echo -n all > /sys/module/apparmor/parameters/audit
或者,要在启动时设置,请添加:
apparmor.audit=all
作为内核启动参数。
审核速率限制
如果 auditd 进程未运行,为了避免丢失过多的额外日志消息,您可能需要通过执行以下操作来关闭速率限制:
echo 0 > /proc/sys/kernel/printk_ratelimit
但即使这样,内核环缓冲区也可能会溢出,并且您可能会丢失消息。
否则,如果 auditd 正在运行,请参阅 auditd(8) 和 auditd.conf(5)。
文件
/etc/apparmor.d/
/var/cache/apparmor/
/var/log/audit/audit.log
/var/log/messages
参见
apparmor_parser(8), aa_change_hat(2), apparmor.d(5), aa-autodep(1), clean(1), auditd(8), aa-unconfined(8), aa-enforce(1), aa-complain(1) 和 [https://wiki.apparmor.net]。