AppArmor 是需手动配置的强制访问控制工具,非开箱即用;须通过 aa-status 验证进程策略状态、检查 /etc/apparmor.d/ 策略文件、按最小化原则设置文件/网络白名单及能力裁剪。

AppArmor 能有效限制应用的网络和文件访问,但必须明确配置、启用并协同其他权限机制才能起作用。它不是开箱即用的“自动防护”,而是需要针对性定义白名单规则的强制访问控制工具。
确认 AppArmor 已启用且策略生效
策略存在 ≠ 策略生效。需三步验证:
- 运行 sudo aa-status,检查输出中是否列出目标进程(如 mysqld、nginx),且状态为 “enforce”
- 查看 /etc/apparmor.d/ 下是否有对应策略文件(如 usr.sbin.mysqld),路径中的斜杠需替换为点号
- 若无策略,可安装补充包:sudo apt install apparmor-profiles-extra,或手动编写后用 sudo apparmor_parser -r /etc/apparmor.d/xxx 加载
文件访问:坚持最小化白名单原则
AppArmor 默认拒绝一切,只放行显式声明的路径。关键做法是:
- 只允许数据库类服务读写必要目录,例如:/var/lib/mysql/** rwk(含子目录、读写+锁)、/etc/mysql/** r、/var/log/mysql/** rw
- 禁止通配符写入高危路径,如 /tmp/** w、/root/**、/home/** w
- 对 socket 文件单独授权,例如:/run/mysqld/mysqld.sock w,避免因权限不足导致服务启动失败
网络访问:按实际用途精确放开
网络规则不依赖 bind-address,但应与之配合设计:
- 若服务仅监听本地(bind-address = 127.0.0.1),策略中只需:network inet stream(允许 IPv4 TCP)
- 显式禁用非必需协议,例如移除 network inet6 stream(除非真用 IPv6)、network netlink raw(防路由信息泄露)
- 不建议开放 network inet dgram(UDP)除非明确需要,如 DNS 查询或监控上报
能力(capability)裁剪不可忽略
很多默认策略保留过多权能,构成潜在提权入口:
- 移除 capability dac_override(绕过文件权限)、capability sys_admin(挂载/卸载、修改内核参数)等高危项
- 保留必要能力,如 capability setuid, setgid(切换到 mysql 用户运行)、capability net_bind_service(绑定 1024 以下端口)
- 注意:AppArmor 的 capability 规则是对进程能力集做 mask,不是授予新能力


















