1. AppArmor 是什么?
AppArmor是一个内置于 Linux 内核的强制访问控制系统。可以把它理解成一个应用程序的“安全带”或“安全监狱”。它的核心思想是 “只允许程序做它该做的事”。- 传统 Linux 权限模型的问题: 一个程序(例如,一个网络服务或浏览器)如果以用户权限或 root 权限运行,它基本上可以访问该用户/root 有权访问的任何文件。如果一个程序被黑客攻破(例如,通过一个漏洞),攻击者就能利用该程序的权限做任何事。
- AppArmor 的解决方案: 为每个应用程序定义一个安全配置文件。这个配置文件明确规定了:
- 这个程序可以读写哪些文件/目录。
- 这个程序可以访问哪些网络端口(和协议)。
- 这个程序可以执行哪些其他程序。
2. AppArmor 的核心概念:配置文件
AppArmor 通过配置文件来工作。配置文件主要有两种模式:- 强制执行模式: 严格遵守配置文件规则。违反规则的操作将被阻止。
- 投诉模式: 在此模式下,AppArmor 不会阻止违反规则的操作,但会将这些操作记录到日志中(通常是
/var/log/syslog或/var/log/audit/audit.log)。这个模式非常有用,用于为现有应用程序“学习”和生成新的配置文件。
/etc/apparmor.d/目录下。文件名通常与二进制程序的路径对应,例如 /usr/sbin/nginx的配置文件可能是 usr.sbin.nginx。
3. AppArmor 在 Ubuntu 中的现状
AppArmor 是 Ubuntu 默认的安全组件,这一点非常重要。- 自 Ubuntu 7.04 以来,AppArmor 就被包含在发行版中。
- 自 Ubuntu 9.10 以来,许多关键的系统服务(如 Apache, Nginx, MySQL, DNSmasq, CUPS 等)都已经预装了现成的、经过良好测试的 AppArmor 配置文件。
- Ubuntu Server 和 Ubuntu Desktop 都默认启用 AppArmor。
4. 基本命令和管理操作
以下是一些常用的 AppArmor 管理命令:| 命令 | 作用 |
|---|---|
sudo systemctl reload apparmor |
重新加载所有配置文件(在修改配置文件后使用)。 |
sudo apparmor_status |
查看 AppArmor 状态和已加载的配置文件列表。 |
sudo aa-complain /path/to/bin |
将某个程序的配置文件设置为投诉模式。例如:sudo aa-complain /usr/sbin/nginx |
sudo aa-enforce /path/to/bin |
将某个程序的配置文件设置为强制执行模式。例如:sudo aa-enforce /usr/sbin/nginx |
sudo aa-unconfined |
列出所有已建立网络连接但没有被 AppArmor 限制的进程。这对于发现潜在的安全风险很有用。 |
5. 一个简单的配置文件示例
让我们看一个非常简单的配置文件例子,假设是给一个叫/usr/local/bin/my_app的程序用的:
r: 读w: 写rw: 读写x: 执行px: 执行另一个程序,并为该程序加载一个独立的配置文件。ix: 执行另一个程序,但不为其加载配置文件(继承当前环境)。ux: 执行另一个程序,但不限制它(危险,仅在必要时使用)。l: 链接
6. AppArmor 与 SELinux 的对比
AppArmor 常被拿来与另一个著名的 MAC 系统 SELinux比较。| 特性 | AppArmor | SELinux |
|---|---|---|
| 配置方法 | 路径基于路径。规则直接指定文件路径(如 /var/www/html/*)。更直观,易于理解和调试。 |
基于标签。每个文件和进程都有一个安全标签(上下文)。规则基于标签匹配。更强大但更复杂。 |
| 学习曲线 | 相对简单。配置文件更易于阅读和编写。 | 相对陡峭。需要理解类型强制、上下文等概念。 |
| 默认使用 | Ubuntu, openSUSE等发行版的默认选择。 | Red Hat, Fedora, CentOS等发行版的默认选择。 |
| 灵活性 | 对于常见用例足够强大和灵活。 | 理论上具有更强的表达能力和更细粒度的控制。 |