创建带apparmor的docker容器需两步:先在宿主机准备并加载自定义profile(如用bane生成toml配置,保存至/etc/apparmor.d/后执行sudo apparmor_parser -r加载),再通过docker run --security-opt apparmor=profile_name显式启用;默认使用docker-default策略,但自定义策略可提供更强进程级访问控制。

创建带 AppArmor 的 Docker 容器,核心是两步:宿主机上准备好 AppArmor Profile,并在 docker run 时通过 --security-opt 显式启用。默认情况下 Docker 会加载 docker-default 策略,但若需更强控制,必须手动指定自定义 profile。
确保宿主机已启用 AppArmor
AppArmor 不是 Docker 自带功能,而是依赖 Linux 内核模块和用户态工具:
- 确认内核已启用:
cat /sys/module/apparmor/parameters/enabled应输出Y - 安装工具包(Ubuntu/Debian):
sudo apt-get install apparmor apparmor-utils - 检查状态:
sudo aa-status,确保有 profile 加载且处于 enforce 模式
准备并加载自定义 AppArmor Profile
Profile 是文本文件,定义容器进程能访问哪些路径、执行哪些操作。推荐用 Bane 自动生成(支持 TOML 格式),或手写:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 保存 profile 到
/etc/apparmor.d/docker-java(命名需不含点,如docker-java) - 加载它:
sudo apparmor_parser -r /etc/apparmor.d/docker-java - 验证是否生效:
sudo aa-status | grep docker-java
示例片段(限制 Spring Boot 应用):
profile docker-java flags=(attach_disconnected,mediate_deleted) {
#include <abstractions>
/app/*.jar mr,
/app/config/** r,
/app/logs/** rw,
deny /proc/*/mem r,
deny /sys/** r,
}</abstractions>启动容器时启用 AppArmor 策略
使用 --security-opt apparmor=xxx 指定 profile 名(不是文件路径):
- 启用自定义策略:
docker run --security-opt apparmor=docker-java openjdk:17-jre-slim java -jar /app/app.jar - 禁用默认策略(不推荐):
--security-opt apparmor=unconfined - 查看容器实际使用的 profile:
docker exec -it cat /proc/1/attr/current,应显示类似docker-java (enforce)
配合其他安全机制效果更佳
AppArmor 是纵深防御的一环,单独使用不够:
- 搭配非 root 用户运行:
docker run --user 1001:1001 --security-opt apparmor=docker-java ... - 结合 seccomp 限制系统调用:
--security-opt seccomp=./seccomp.json - 避免挂载敏感宿主机路径,尤其
/proc、/sys、/dev










