AppArmor 与容器
AppArmor 是 Ubuntu、Debian 等发行版默认启用的强制访问控制机制。宿主启用后 Docker 会给容器套用 docker-default 策略,限制文件与能力访问;也可以按容器指定自定义策略,或对特定容器临时放宽。
基本信息
| 默认策略 | docker-default,宿主启用 AppArmor 时自动应用 |
|---|---|
| 覆盖方式 | --security-opt apparmor=<策略名> 或 apparmor=unconfined |
| 检查命令 | aa-status 查看已加载策略 |
| 适用平台 | Ubuntu、Debian、SUSE 等启用 AppArmor 的发行版 |
| 作用域 | 策略由宿主加载,容器内无法修改 |
典型使用场景
- 核对线上容器是否真的套用了默认策略
- 需要更严格限制的业务,加载自定义策略后挂到容器上
- 排障时临时用 unconfined 判断问题是否由策略引起
- 安全基线检查:列出未启用策略的容器
- 发行版迁移后确认强制访问控制的落地情况
检查与指定策略
检查与指定策略
sudo aa-status | head -20 # 查看已加载策略与处于 enforcing 的进程
docker run -d --security-opt apparmor=docker-default --name api app/api:1.4.2
docker inspect -f '{{json .HostConfig.SecurityOpt}}' api # 核对容器的策略参数
docker run -d --security-opt apparmor=my-policy --name web nginx:1.27-alpine检查要点
| 关注点 | 正常表现 | 异常表现 |
|---|---|---|
| 宿主策略 | aa-status 里能看到 docker-default | 未启用则该选项无效 |
| 容器参数 | inspect 里能看到 apparmor 项 | 为空说明用的默认策略 |
| 访问行为 | 按策略允许或拒绝 | 被拒时留下审计记录 |
| 排障路径 | 按日志定位具体规则 | 盲目关策略难以定位根因 |
策略由宿主机加载,容器内无法修改;发行版默认策略已覆盖多数加固需求,自定义前先评估是否真的需要。
宿主机未启用 AppArmor(非 Debian 系常见)时该选项不生效,检查输出会明确提示,别默认策略已经生效。
自定义策略调试失败会让容器直接起不来,新策略先在测试机验证加载与运行,再推到生产。
被策略拒绝的访问通常写入系统审计日志,排障时先看日志里的具体规则名,再决定是改策略还是改应用行为。
同一宿主上不同容器可以用不同策略,但策略文件必须先加载到内核;策略缺失会导致容器启动时找不到策略而失败。