AppArmor 是一款 Linux 内核安全模块,它通过 强制访问控制 (MAC) 来增强传统的 自主访问控制 (DAC) 模型。AppArmor 的目标是 限制应用程序的权限,从而 保护操作系统和应用程序 免受内部和外部威胁,包括零日攻击。它通过定义 每个应用程序的安全配置文件 来实现此目的,这些配置文件指定了应用程序可以访问的资源和允许的操作。
简单来说,AppArmor 就像是给你的应用程序穿上了一层“盔甲”,防止它们在受到攻击时“为非作歹”。即使应用程序存在漏洞,AppArmor 也能通过限制其行为,来阻止漏洞被利用。AppArmor 的核心思想是将访问控制属性绑定到程序而不是用户。
在传统的 自主访问控制 (DAC) 模型中,系统管理员将所有权和访问权限分配给文件系统中的文件和资源。应用程序通过其所属用户的身份来访问资源。而在 强制访问控制 (MAC) 模型下,系统管理员可以为应用程序或进程定义严格的访问规则,应用程序无法绕过这些规则。AppArmor 提供了这种强制访问控制机制,使得即使是拥有根权限的用户也无法绕过安全策略。
AppArmor 的主要功能可以概括为以下几点:
AppArmor 的应用场景非常广泛,包括但不限于:
大多数 Linux 发行版 (如 Debian, Ubuntu, OpenSUSE) 默认都预装了 AppArmor。你可以通过运行 aa-status
命令来检查是否已安装。
如果未安装,可以使用发行版的包管理器进行安装,例如在 Ubuntu 或 Debian 上:
sudo apt install apparmor apparmor-utils apparmor-profiles
AppArmor 配置文件存储在 /etc/apparmor.d/
目录中。每个配置文件都与一个特定的应用程序相关联,并定义了该应用程序可以访问的文件、目录、网络资源和功能。
配置文件通常以应用程序的完整路径命名,并将 /
替换为 .
。例如,/bin/ping
的配置文件是 /etc/apparmor.d/bin.ping
。
AppArmor 配置文件可以使用 抽象 (abstractions) 来简化编写过程。抽象是预定义的规则集合,可以包含在多个配置文件中。例如,abstractions/base
文件包含了许多共享库的访问规则。
AppArmor 还支持 tunables
文件,允许定义可在多个配置文件中使用的变量。
使用 aa-complain
命令将配置文件设置为抱怨模式,使用 aa-enforce
命令将其设置为强制模式。
sudo aa-complain /path/to/bin # 将指定应用程序的配置文件置于抱怨模式
sudo aa-enforce /path/to/bin # 将指定应用程序的配置文件置于强制模式
使用 aa-genprof
命令为新的应用程序创建配置文件。
sudo aa-genprof /path/to/executable
运行此命令后,在另一个终端窗口中运行该应用程序。aa-genprof
将监视应用程序的行为,并建议添加到配置文件中的规则。你可以使用 s
键扫描日志,f
键完成配置。
aa-logprof
工具可以扫描日志文件,查找 AppArmor 审核消息,并更新配置文件,让你根据实际使用情况调整规则。
在创建配置文件时,应该先制定测试计划,并将测试用例分成多个小步骤。标准测试用例包括:启动程序、停止程序、重新加载程序,以及测试 init 脚本支持的所有命令。
使用 apparmor_parser
命令将配置文件加载到内核中。
sudo apparmor_parser -a /etc/apparmor.d/profile.name # 加载配置文件
sudo apparmor_parser -r /etc/apparmor.d/profile.name # 重新加载配置文件
-a
选项用于加载配置文件, -r
选项用于重新加载配置文件。
可以使用 systemctl
命令重新加载所有配置文件。
sudo systemctl reload apparmor.service
注意:apparmor_parser -r
和 apparmor_parser -R
是不同的命令。-r
用于重新加载配置文件,-R
用于禁用配置文件。
要禁用配置文件,请在 /etc/apparmor.d/disable/
目录下创建一个指向配置文件的符号链接,然后使用 apparmor_parser -R
命令。
sudo ln -s /etc/apparmor.d/profile.name /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/profile.name
要重新启用已禁用的配置文件,请删除 /etc/apparmor.d/disable/
目录中的符号链接,然后使用 apparmor_parser -a
命令重新加载该配置文件。
sudo rm /etc/apparmor.d/disable/profile.name
cat /etc/apparmor.d/profile.name | sudo apparmor_parser -a
要禁用 AppArmor 服务,请使用以下命令:
sudo systemctl stop apparmor.service
sudo systemctl disable apparmor.service
要重新启用 AppArmor 服务,请使用以下命令:
sudo systemctl enable apparmor.service
sudo systemctl start apparmor.service
AppArmor 配置文件是简单的文本文件,位于 /etc/apparmor.d/
目录中。它们包含以下主要元素:
#include
指令可以包含其他文件中的规则,以便重用配置。例如:#include <tunables/global>
。/bin/ping mixr
表示允许 /bin/ping
文件具有读 (r)、执行 (x) 和内存映射 (m) 的权限。capability net_raw
表示允许应用程序访问 CAP_NET_RAW
功能。r
: 读取权限。w
: 写入权限。x
: 执行权限。m
: 允许 mmap(2)
调用时使用 PROT_EXEC
。l
: 链接权限。ux
: 无约束执行。Ux
: 无约束执行,并清除环境。px
: 离散配置文件执行。Px
: 离散配置文件执行,并清除环境。ix
: 继承执行权限。deny
: 明确拒绝指定的访问权限。例如,一个简单的 /etc/apparmor.d/bin.ping
配置文件可能如下所示:
#include <tunables/global>
/bin/ping flags=(complain) {
#include <abstractions/base>
#include <abstractions/consoles>
#include <abstractions/nameservice>
capability net_raw,
capability setuid,
network inet raw,
/bin/ping mixr,
/etc/modules.conf r,
}
#include <tunables/global>
: 包含 tunables/global
文件中的规则。/bin/ping flags=(complain)
: 指定 /bin/ping
的路径,并将模式设置为 “抱怨”。capability net_raw
: 允许应用程序访问 CAP_NET_RAW
功能。/bin/ping mixr
: 允许应用程序对 /bin/ping
文件进行读取、执行和内存映射。/etc/modules.conf r
: 允许应用程序读取 /etc/modules.conf
文件。在配置文件中,可以使用 owner
关键字来指定对特定文件或目录的访问权限,例如 owner /etc/nginx/modules-enabled/ r
表示只有 /etc/nginx/modules-enabled/
的所有者才能读取该目录。
syslog
, auditd
, kernel log
, journald
) 中。 你可以使用 aa-logprof
工具来分析日志,并根据需要更新配置文件。dmesg
或其他收集内核消息的日志来查看 AppArmor 拒绝访问的记录。注意,只有非显式拒绝的访问会被记录。aa-notify
工具显示图形通知。conffiles
,在相关包更新后,可能会收到 conffile
提示,或被自动更新覆盖。tunables
文件来定义变量,以便在多个配置文件中使用。例如,可以在 /etc/apparmor.d/tunables/home
中定义自定义的 “home” 目录规则。/etc/apparmor.d/local/
目录中创建本地覆盖规则,从而避免在更新时丢失自定义规则。network inet raw
来允许程序使用原始套接字),但是,它不能像防火墙一样阻止所有网络连接。AppArmor 是一个强大的 Linux 安全工具,可以用来增强系统的安全性。通过理解 AppArmor 的工作原理,并使用提供的工具,可以为应用程序创建自定义的配置文件,从而限制其权限,并保护你的系统免受潜在的威胁。在实际操作中,请务必仔细设计和测试配置文件,以确保安全性和功能性的平衡。AppArmor 不仅可以用于保护服务器,还可以用于保护桌面系统和嵌入式系统等各种环境。
希望这份指南能帮助你更好地理解和使用 AppArmor。
补充说明:
#
号用于添加注释.aa-status
, aa-complain
, aa-enforce
, aa-genprof
, aa-logprof
, apparmor_parser
等,可以帮助用户管理和配置 AppArmor。unconfined
状态表示应用程序在没有 AppArmor 限制的情况下运行。