Seccomp:default 是 Docker 自 1.10 版本起默认启用的安全机制,内核支持(CONFIG_SECCOMP=y)即自动生效,禁用约 44 个高风险系统调用(如 ptrace、mount、reboot),允许约 300+ 常用调用,构成生产验证的通用安全基线。

seccomp:default 是 Docker 默认启用的安全机制,它不是“可选开关”,而是从 1.10 版本起就默认加载的策略。只要你的内核支持 Seccomp(CONFIG_SECCOMP=y),且未显式禁用,容器启动时就会自动应用该策略 —— 你不需要做任何事,攻击面已经比裸跑低了约 70%。
如何确认容器确实在用 seccomp:default
很多人以为加了 --security-opt seccomp=unconfined 才算“关掉”,其实更常见的是误删配置或降级 Docker 导致策略失效。
- 运行
docker inspect,输出中应含| grep -A 5 Seccomp "Seccomp": "/usr/share/containers/seccomp.json"或类似路径(取决于发行版);若为null或"unconfined",说明没生效 - 检查宿主机是否真的支持:
grep CONFIG_SECCOMP= /boot/config-$(uname -r),必须返回CONFIG_SECCOMP=y - Docker Desktop 或某些精简版发行版(如 Alpine Linux 的 docker 包)可能默认不带预编译的 seccomp profile,需手动补全
/usr/share/containers/seccomp.json
seccomp:default 禁了哪些调用?为什么不能直接删掉它们
默认策略不是“一刀切禁止所有危险调用”,而是基于白名单 + 显式黑名单组合:允许约 300+ 常用调用,同时明确拒绝约 44 个高风险系统调用(如 ptrace、mount、reboot、chroot、create_module)。
-
ptrace被禁 → 防止调试注入和进程内存读取,但strace在容器内会直接报Operation not permitted -
mount被禁 → 阻断多数容器逃逸路径,但tmpfs挂载仍被允许(因在白名单中) -
chroot和setns被禁 → 关键逃逸链断裂,但不影响chdir这类常规路径切换 - 别试图“删掉黑名单项”来“精简 profile”——默认策略已过大量生产验证;擅自删减可能引入逃逸面,且无性能收益
什么时候该换自定义 profile,而不是依赖 default
default 是通用安全基线,不是万能解。当你的应用有明确、稳定、窄范围的系统调用需求时,才值得定制;否则反而增加维护负担和出错概率。
- 典型适用场景:
nginx容器禁用socket以外的所有网络相关调用;ffmpeg容器只允许mmap、ioctl(用于设备访问)等少数几个 - 错误动因:仅因某次
strace报错就导出 profile 并“删掉报错项”,这等于把防护墙拆掉一块去适配调试工具 - 真正要做的:先用
docker run --security-opt seccomp=unconfined跑通应用,再用docker run --security-opt seccomp=/dev/stdin+jq生成最小 profile,最后人工 review 黑名单项 - 注意:
defaultAction设为SCMP_ACT_ALLOW再逐个SCMP_ACT_ERRNO黑名单,比设为SCMP_ACT_ERRNO再白名单放行更易出错——前者漏一项顶多功能异常,后者漏一项等于开后门
最容易被忽略的兼容性陷阱
seccomp:default 在不同内核版本、Docker 版本、容器运行时(containerd vs dockerd)之间存在细微行为差异,尤其影响 glibc 较新或 musl 构建的镜像。
- Alpine(musl)容器中,
getrandom调用在旧内核( - Docker 24.0+ 默认使用 containerd 1.7+,其 seccomp 加载逻辑更严格:若 JSON 中
name字段写成names(数组形式但只给一个字符串),会静默失败并 fallback 到 unconfined - systemd 容器内若启用
ProtectKernelTunables=yes,会与 seccomp 的sysctl拦截产生冲突,表现为Permission denied而非预期的EPERM
Docker 的 seccomp:default 不是“锦上添花”,而是运行容器的底线配置。它的价值不在你能删掉多少调用,而在于你没意识到自己正被保护着——直到某天你关掉它,然后发现一个本不该逃逸的漏洞突然就能调用 mount 了。











