apparmor通过路径白名单与强制模式实现精准约束,锁定容器可读写执行资源范围并实时拦截越权行为。其声明式配置不依赖复杂上下文,适用于金融、政务等高审计要求场景;需启用内核模块、加载定制策略文件、编写防篡改规则(如根文件系统只读、禁用敏感路径访问与危险能力)、结合seccomp双重拦截,并通过/proc/1/attr/current验证生效状态。

AppArmor 能为容器构建防篡改的运行时沙箱,关键不在于“全封闭”,而在于“精准约束”——用路径白名单锁定可读、可写、可执行的资源范围,并结合强制模式(Enforce)实时拦截越权行为。它不依赖复杂上下文,而是通过声明式配置文件直接控制进程行为,适合金融、政务等对策略可审计性要求高的场景。
一、启用 AppArmor 并加载定制策略
默认 Docker 使用 docker-default 策略,仅提供基础防护。要实现防篡改,必须为容器指定独立策略文件:
- 确保宿主机已启用 AppArmor:运行
aa-status查看状态,若未启用需在内核启动参数中加入apparmor=1 security=apparmor - 将策略文件(如
/etc/apparmor.d/docker.myapp)部署到所有节点,并执行sudo apparmor_parser -r /etc/apparmor.d/docker.myapp加载 - 启动容器时显式绑定策略:
docker run --security-opt apparmor=docker.myapp my-image;Kubernetes 中则在 PodSecurityContext 设置apparmor.security.beta.kubernetes.io/pod: runtime/default或指定 profile 名
二、编写防篡改核心规则(以 Web 应用为例)
策略文件需严格限制文件系统写入、禁止敏感路径访问、禁用危险能力调用。以下为典型防篡改片段:
-
根文件系统只读化:添加
/usr/** r,、/etc/** r,,但明确拒绝写入:/usr/** w,→ 改为deny /usr/** w,;对/var/log等日志目录使用tmpfs挂载后,在策略中仅允许/tmp/** rw, -
阻断敏感路径挂载与穿透:显式拒绝访问
/proc、/sys、/dev下非必需子路径,例如:deny /proc/sys/** w,、deny /sys/fs/cgroup/** w, -
禁止动态代码加载与模块操作:添加
deny capability sys_module,、deny capability sys_admin,,并禁用ptrace和mount系统调用(需配合 seccomp 使用效果更佳)
三、结合 seccomp 实现双重拦截
AppArmor 控制资源路径访问,seccomp 控制系统调用行为。两者协同才能封死篡改链路:
- AppArmor 可阻止进程写入
/etc/passwd,但若容器内进程调用chmod修改自身文件权限,仍可能绕过——此时 seccomp 配置中设"name":"chmod","action":"SCMP_ACT_ERRNO"即可拦截 - Kubernetes 中可通过 annotation 同时启用:
container.apparmor.security.beta.kubernetes.io/my-container: "localhost/docker.myapp"+io.kubernetes.cri.seccomp.bypass: "false" - 推荐使用
defaultAction: SCMP_ACT_ERRNO的白名单模式,仅放行read、write、openat、exit_group等基础调用,彻底切断 shellcode 注入和提权路径
四、验证与持续加固
策略上线后必须验证是否真正生效,而非仅检查语法正确:
- 进入容器执行
cat /proc/1/attr/current,确认输出含docker.myapp (enforce)字样,表明策略已加载且处于强制模式 - 手动测试越权操作:尝试
touch /etc/test、mount -t tmpfs tmpfs /mnt,应返回Permission denied而非静默失败 - 定期用
aa-logprof分析 audit 日志,发现未覆盖的访问请求,迭代补充规则;生产环境避免长期使用complain模式











