适用场景:本教程适用于AppArmor强制访问控制(MAC)的部署场景,用于为 Nginx、MySQL、Docker 容器等 Linux 应用进程建立细粒度文件/网络访问白名单,防止应用被攻破后越权访问系统资源。适合 Debian/Ubuntu 系服务器的安全加固。
前置条件
- 操作系统:Debian/Ubuntu(内核默认支持 AppArmor),拥有 root 权限
- 已安装目标应用(本教程以 Nginx 为例)
- 了解应用运行所需的目录与端口(如 Nginx 读写 /var/www、监听 80/443)
- 生产环境建议先在测试机完成策略编写
原理说明
AppArmor 是 Linux 内核的强制访问控制(MAC)模块,与 SELinux 同属 LSM(Linux Security Module)体系,但配置思路更简单:基于路径为每个应用定义「允许做什么」的规则集(Profile),规则之外的访问一律拒绝。即使应用进程被攻破(如 Nginx 遭 RCE),AppArmor 仍会将进程限制在最小权限范围内,无法读取 /etc/shadow、/root 等敏感路径。Profile 有 complain(仅记录)与 enforce(强制拦截)两种模式,可平滑灰度上线。
操作步骤
第一步:安装与确认状态
sudo apt update && sudo apt install -y apparmor apparmor-utils
sudo aa-status
确认 AppArmor 已加载且部分服务已有默认策略(如 dhclient)。
第二步:生成应用 Profile
使用 aa-genprof 交互式生成 Nginx 的策略(需另开终端模拟正常访问以收集行为):
sudo aa-genprof nginx
流程中按提示放行合法访问(Allow/Deny),结束后生成 /etc/apparmor.d/usr.sbin.nginx。也可直接手写最小策略,示例:
#include <tunables/global>
profile nginx /usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/nameservice>
/usr/sbin/nginx mr,
/var/www/** r,
/var/log/nginx/*.log w,
/run/nginx.pid rw,
network inet tcp,
}
第三步:加载并启用策略
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
sudo aa-enforce /usr/sbin/nginx
sudo aa-status | grep nginx
输出显示 nginx 进程处于 enforce 模式即生效。若需临时放行(如调试),可切换 complain 模式:
sudo aa-complain /usr/sbin/nginx
第四步:验证越权拦截
模拟攻击验证:尝试让 Nginx worker 读取系统敏感文件(如利用 PHP-FPM 执行 cat /etc/shadow),AppArmor 会拒绝访问并在审计日志中记录:
sudo tail -f /var/log/kern.log | grep -i apparmor
配置验证
验证要点:① aa-status 中 Nginx 处于 enforce 模式;② 正常业务(访问网站、写日志、连数据库)不受影响;③ 越权读取 /etc/shadow、/root/.ssh 被拒绝且日志出现 apparmor="DENIED";④ 重启 Nginx 后策略自动生效(systemctl restart nginx 后再次 aa-status 确认)。
常见问题
FAQ1:AppArmor 导致服务无法启动怎么办?
先切回 complain 模式观察:sudo aa-complain /usr/sbin/nginx,查看 /var/log/kern.log 中 DENIED 记录,将缺失的路径/权限补充进 Profile 后重新 apparmor_parser -r。若急需恢复业务,可 sudo aa-disable /usr/sbin/nginx 临时禁用。
FAQ2:AppArmor 与 Docker/SELinux 冲突吗?
不冲突。Docker 容器自带默认 AppArmor 策略(docker-default),Ubuntu 默认禁用 SELinux,二者不会同时强制;在 Ubuntu 上使用 AppArmor 管理宿主机进程、使用 Docker 自带的 profile 管理容器,互不干扰。若从 SELinux 环境迁移,注意策略语法与内核配置差异。
总结
AppArmor 以路径为核心的策略模型大幅降低了 MAC 落地门槛,是 Ubuntu 服务器加固性价比极高的选择。建议对 Nginx、MySQL、PHP-FPM 等面向公网的进程逐一建立 Profile,遵循「先 complain 观察、再 enforce 拦截」的灰度流程,并纳入配置管理工具统一维护策略文件,实现应用最小权限的常态化管控。