Docker中Seccomp自定义策略的核心是严格遵循JSON规范、精准放行必要系统调用、使用绝对路径加载配置;必须用小写下划线字段名(如default_action)、包含architectures数组、syscalls为复数形式,禁用ptrace等高危调用但保留openat、clone等运行必需调用,并通过strace分析真实syscall后白名单化配置。

在 Docker 中用 Seccomp 自定义策略限制不安全系统调用,核心是写对 JSON 规则、放行必要调用、路径和权限配准。不是越禁越多就越安全,而是精准控制才能既防风险又保运行。
必须严格遵循的 JSON 结构规范
Seccomp 配置文件只能是标准 JSON,Docker 不识别 YAML 或 TOML。字段名大小写敏感,缺一不可:
- default_action:必须小写下划线,不能写成 defaultAction 或 DefaultAction
- architectures:至少包含宿主机架构,如 ["SCMP_ARCH_X86_64"];漏掉会导致容器直接启动失败
- syscalls:必须是复数形式,不能拼成 syscall 或 syscalls_list
校验语法推荐用 jq:jq -n -f /etc/docker/seccomp.json >/dev/null,报错即说明格式或字段有误。
关键系统调用的取舍逻辑
盲目禁用基础调用会让容器“瘫痪”,而非变安全。重点不是删什么,而是留什么:
- openat、read、close、statx、fstat 是绝大多数语言(包括 Go/Node.js)加载库、读配置、查进程状态的底层依赖,禁掉会导致 ps、ls 失败,甚至 Go 程序 panic
- clone、epoll_wait、epoll_ctl 是 Go runtime 和 Node.js 事件循环必需的,禁用后服务可能无法启动或响应超时
- 高危调用如 ptrace、mount、chroot、reboot、kill(向其他 PID) 应明确设为
SCMP_ACT_ERRNO或SCMP_ACT_KILL
实操建议:先用 strace -f -e trace=raw_syscall -p $(pidof your-app) 抓真实调用,再精简白名单,比凭空猜测更可靠。
路径与权限的常见踩坑点
Docker daemon 运行在宿主机上下文,它读的是自己的文件系统,不是你当前 shell 的工作目录:
- 配置文件必须用 绝对路径,
--security-opt seccomp=profile.json会失败,因为 daemon 找不到相对路径下的文件 - 推荐放在
/etc/docker/seccomp.json,然后启动时指定--security-opt seccomp=/etc/docker/seccomp.json - 确保 daemon 用户(通常是 root)有读权限:
sudo chmod 644 /etc/docker/seccomp.json
启动容器时正确加载策略
命令格式要完整,且需确认 Docker 版本 ≥ 1.10(现代发行版默认满足):
docker run \ --security-opt seccomp=/etc/docker/seccomp.json \ --rm ubuntu:20.04 cat /proc/self/status
若策略生效,尝试执行被禁调用(如 strace -e ptrace true)会返回 EPERM 或直接终止进程,而不是静默忽略。


















