apparmor在容器中通过配置文件精准控制进程资源访问,而非开关式防护;需验证内核启用(/sys/module/apparmor/parameters/enabled返回y)、aa-status显示enforce模式、运行时(docker/containerd/k8s)支持并正确加载profile,deny规则应覆盖/etc/、/home/、/proc/sys/**等敏感路径。

AppArmor 在容器环境中不是“开关式”防护,而是靠配置文件精准控制进程能碰什么——它不拦系统调用本身,但能禁止触发调用的资源访问行为,比如不让容器写宿主机的 /home、读取 /etc/shadow,或绑定非授权端口。
确认 AppArmor 已启用并就绪
不是装了就生效,得验证状态和运行时支持:
- 检查内核模块是否加载:
sudo cat /sys/module/apparmor/parameters/enabled,返回 Y 才算开启 - 查看当前 profile 加载情况:
sudo aa-status,确认有 profile 处于 enforce 模式(不是 complain) - 容器运行时需启用 AppArmor:Docker 默认支持;containerd 需确认
/etc/containerd/config.toml中disable_apparmor = false,改完重启 containerd - Kubernetes 用户注意:
kubectl describe node中应显示AppArmor在OS Image或Conditions里被识别
为容器指定自定义 profile(非默认)
Docker 和 Kubernetes 都支持显式挂载 profile,绕过宽松的 docker-default:
- profile 文件必须放在
/etc/apparmor.d/下,命名按路径转点规则,例如容器中运行/usr/local/bin/lingbot,profile 文件名应为usr.local.bin.lingbot - 内容示例(最小化原则):
#include
/usr/local/bin/lingbot {
capability net_bind_service,
/models/** r,
/dev/nvidia* mrw,
deny /etc/** w,
deny /home/** rwx,
} - 加载生效:
sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.lingbot - Docker 启动时绑定:
docker run --security-opt apparmor=usr.local.bin.lingbot ...
Kubernetes Pod 中通过 annotation:container.apparmor.security.beta.kubernetes.io/<container-name>: localhost/usr.local.bin.lingbot</container-name>
用 deny 规则堵住常见越权路径
很多权限问题其实源于默认没禁、而非没放行。几个高频需显式 deny 的位置:
-
敏感系统目录:在 profile 中加
deny /etc/shadow r,、deny /root/** rwx,,防提权读取 -
用户主目录:
deny /home/** rwx,可阻止容器意外或恶意扫描用户文件 -
proc/sys 写操作:
deny @{PROC}/sys/** w,(保留只读),避免篡改内核参数 -
固件与安全模块:
deny /sys/firmware/** rwklx,、deny /sys/kernel/security/** rwklx,
调试与日志定位违规行为
权限被拒时不会直接报 “AppArmor denied”,而是表现为 Permission denied 或 No such file or directory(尤其对路径不存在的 deny)。正确排查方式:
- 实时看拒绝记录:
sudo dmesg -w | grep -i apparmor或查/var/log/syslog中含apparmor="DENIED"的行 - 临时切到 complain 模式调试:
sudo aa-complain /etc/apparmor.d/usr.local.bin.lingbot,运行容器后看哪些访问被记录但未拦截,再补进 enforce profile - 确认 profile 是否被容器实际加载:
docker inspect <container-id> | grep -A5 AppArmor</container-id>,或进入容器执行cat /proc/self/status | grep Seccomp\|AppArmor











