apparmor 通过“按需放行、显式拒绝”从空白策略起步,仅添加必要规则,补足系统层防护;需验证覆盖状态、编写最小化策略、分阶段加载调试,并可结合 systemd 进一步加固。

AppArmor 限制服务进程权限的核心是“按需放行、显式拒绝”,不是靠默认宽松再收紧,而是从空白策略起步,只加真正需要的规则。它不替代服务自身的权限逻辑(比如 MariaDB 的 GRANT),而是补上操作系统层的兜底防护。
确认服务已被 AppArmor 覆盖
很多服务(尤其是非系统包安装的)默认没有 AppArmor 策略。先验证是否已加载:
- 运行 sudo aa-status | grep -i "mysqld\|mariadbd\|endlessh\|zapret",看是否出现在“enforced”列表里
- 检查 /etc/apparmor.d/ 下有无对应文件,如 usr.sbin.mysqld 或 usr.local.bin.endlessh
- 若无,可安装补充包:sudo apt install apparmor-profiles-extra(Debian/Ubuntu)
编写最小化策略文件
策略文件名要匹配二进制路径(/ 替换为 .),内容聚焦三类关键项:
-
文件路径:只允许读写必要目录,例如
/var/lib/mysql/** rwk,/etc/mysql/my.cnf r,/var/log/mysql/*.log w,deny /tmp/** w,deny /root/** rwlkx, -
网络行为:按服务实际绑定方式设限,例如仅本地通信就写
network inet stream,,禁 IPv6 就不写inet6;避免泛写network unix,或raw -
系统能力(capability):删掉明显不需要的,如
capability dac_override,、capability sys_admin,;保留运行必需的,如capability setuid, setgid,
分阶段加载与调试
直接 enforce 容易导致服务启动失败。推荐流程:
- 先用投诉模式加载:sudo apparmor_parser -r -C /etc/apparmor.d/usr.sbin.mysqld
- 重启服务:sudo systemctl restart mariadb
- 查拒绝日志:sudo dmesg | grep avc | tail -15 或 sudo journalctl -t kernel | grep avc | tail -10
- 根据日志补规则(比如缺
/proc/sys/kernel/osrelease r就加上),再重新加载为 enforce 模式:sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
与 systemd 配合加固(可选但推荐)
AppArmor 是第一道防线,systemd 提供第二层约束:
- 在服务单元文件中启用:PrivateTmp=yes、ProtectSystem=strict、NoNewPrivileges=true
- 对 endlessh、zapret 这类网络工具,还可加 RestrictAddressFamilies=AF_UNIX AF_INET,禁止 IPv6 和其他协议族
- 确保 AppArmor profile 名与 --security-opt apparmor=xxx 中指定的完全一致(不是文件名,是 profile 行定义的名字)











