容器创建时通过--security-opt加载宿主机预置的AppArmor、SELinux或Seccomp策略文件:AppArmor需提前加载profile;SELinux需启用并指定type/level标签;Seccomp支持内置或自定义JSON过滤syscall;配合no-new-privileges=true禁止提权。

容器创建时指定内核安全策略模板,核心是通过 Docker 的 --security-opt 选项加载 AppArmor、SELinux 或 Seccomp 等内核级安全模块的配置文件。这些不是“运行时动态生成”的策略,而是宿主机上已存在、已加载、经验证可用的安全 profile 或 JSON 策略文件。
指定 AppArmor 模板
AppArmor 依赖预定义的 profile 文件(通常存于 /etc/apparmor.d/),需先确保宿主机启用且 profile 已加载:
- 检查是否启用:
cat /sys/module/apparmor/parameters/enabled应返回Y - 加载自定义 profile:
sudo apparmor_parser -q /etc/apparmor.d/my-nginx-profile - 运行容器时绑定:
docker run --security-opt apparmor=my-nginx-profile nginx - profile 名称(如
my-nginx-profile)是文件末尾的标识名,不是完整路径
指定 SELinux 安全上下文
SELinux 要求宿主机开启并配置好策略,容器启动时通过标签(label)指定上下文:
- 确认 SELinux 运行中:
getenforce返回Enforcing或Permissive - 启动容器时指定类型和级别:
docker run --security-opt label=type:svirt_lxc_net_t --security-opt label=level:s0 nginx - 常用类型包括
svirt_lxc_net_t(容器网络)、container_t(通用容器上下文) - 避免使用
disable或unconfined_u:unconfined_r:unconfined_t:s0等宽松标签
指定 Seccomp 系统调用过滤模板
Seccomp 是最常用于限制内核 syscall 的机制,支持内置默认策略或自定义 JSON 文件:
- 使用 Docker 内置默认策略:
docker run --security-opt seccomp=unconfined(不推荐)或省略该参数(默认启用受限策略) - 加载自定义 JSON 策略:
docker run --security-opt seccomp=./seccomp-restrictive.json nginx - JSON 文件必须符合 Docker Seccomp 规范,含
defaultAction和syscalls数组,例如禁用ptrace和mount - 调试阶段可先用
"action": "SCMP_ACT_LOG"记录拦截行为,再切换为"SCMP_ACT_KILL"
附加加固:禁止运行时提权
配合上述策略,强制关闭容器获取新特权的能力,堵住 setuid/setgid 提权路径:
- 添加
--security-opt no-new-privileges=true - 该选项与 USER 指令、cap-drop 配合效果更佳,即使容器以 root 启动也无法升级权限
- 在 Kubernetes 中对应 Pod 安全上下文字段:
securityContext.allowPrivilegeEscalation: false


















