seccomp配置必须严格使用snake_case字段名(default_action、architectures、syscalls),架构需匹配宿主机,基础调用如openat、clone、epoll_wait不可禁,高危调用如ptrace、mount应优先拦截。

直接禁用高风险系统调用是有效的,但盲目删减会导致容器启动失败或运行时 panic——关键在于保留最小必要集合,再精准拦截危险项。
seccomp.json 字段名大小写和结构必须严格匹配 Docker schema
Docker 只认 default_action、architectures、syscalls 这三个顶层字段,且全为 snake_case。写成 defaultAction 或 syscall 会报错:invalid seccomp profile: unknown field "syscall"。
- 用
jq -e .default_action profile.json >/dev/null快速验证字段是否存在且可读 -
architectures必须显式包含宿主机架构,例如["SCMP_ARCH_X86_64"];漏掉会导致failed to load seccomp profile: architecture not supported -
syscalls是数组,每个元素必须含names(注意是复数)和action,names值为字符串数组,哪怕只禁一个也要写成["ptrace"]
哪些系统调用禁了就“跑不起来”,哪些禁了才真安全
真正该优先拦截的是攻击面大、业务几乎不用的调用,而不是看着名字吓人就一刀切。比如 openat 看似底层,但 Go/Python/Node.js 启动时必调,禁它等于拒绝所有应用加载;而 ptrace、mount、chroot 在绝大多数 Web 服务中完全无正当用途。
- 高危但可安全禁用:
ptrace(调试逃逸)、mount(挂载突破隔离)、reboot(拒绝服务)、capset(提权)、create_module(已废弃但仍有利用链) - 基础但绝不能禁:
openat、read、close、statx、fstat、epoll_wait(Node.js/Go 事件循环依赖)、clone(Go runtime 启动线程) - 需按场景判断:
kill(某些健康检查依赖)、chmod(静态文件服务可能需要)、ioctl(网络或设备操作可能触发)
路径级限制不在 seccomp 能力范围内,别白费劲
seccomp 本身无法判断某个 openat 是在读 /proc/self/status 还是写 /etc/shadow。它的 args 字段虽支持参数过滤,但仅限整数比较(如 fd > 2),对路径字符串无效。
- 想限制文件访问路径,得配合
docker run --read-only --tmpfs /run:rw,size=64m或mount --bind -o ro /host/data /app/data - 想让
mount失败更安静,用"action": "SCMP_ACT_ERRNO"而非SCMP_ACT_KILL,避免容器因一次非法 mount 就被 SIGSYS 杀死 - 测试时先加
"action": "SCMP_ACT_LOG"到可疑调用上,再查dmesg | grep "seccomp"确认是否真被触发
文件路径必须绝对,且 daemon 用户要有读权限
Docker daemon 以 root 身份运行,它看不到你 shell 当前目录下的 ./seccomp.json,也不会展开 ~。常见错误是执行 docker run --security-opt seccomp=profile.json,结果报 open profile.json: no such file or directory。
- 把配置放固定位置,例如
/etc/docker/seccomp.json,然后用--security-opt seccomp=/etc/docker/seccomp.json - 确认权限:
sudo chmod 644 /etc/docker/seccomp.json && sudo chown root:root /etc/docker/seccomp.json - 不要用
docker build阶段 COPY 进镜像——seccomp 是运行时加载的宿主机文件,镜像里放没用
最常被忽略的点:Go 和 Node.js 容器对 clone 和 epoll_wait 的依赖比配置模板里写的更刚性;没留它们,容器可能连 main 函数都没进就挂了。实际部署前,务必用 strace -f -e trace=clone,epoll_wait,openat -p $(pidof your-app) 抓一把真实调用再定名单。











