跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何在Docker中利用Seccomp自定义规则集严格限制容器内非必要的调用

Docker Seccomp自定义规则需以白名单为核心,严格使用标准JSON字段(default_action、architectures、syscalls),设default_action为SCMP_ACT_ERRNO或SCMP_ACT_KILL,仅放行应用真实所需的系统调用,并通过绝对路径加载、jq校验语法、/proc/self/status确认生效及strace测试拦截效果来确保策略正确执行。 要在Docker中用Seccomp自定义规则集严格限制非必要系统调用,核心是构建一个以白名单为基础、动作明确、路径合规、经实测验证的JSON策略文件,并确保它被Docker daemon正确加载。不能只靠“禁止高危调用”,而要从“只放行必需项”出发。 写对JSON结构和字段名 Seccomp配置必须是标准JSON,且字段名大小写敏感,缺一不可: default_action (不是 defaultAction 或 defaultAction):设为
SCMP_ACT_ERRNO
(默认拒绝并报错)或更严格的
SCMP_ACT_KILL
(直接终止进程) architectures (不是 architecture):必须包含宿主机架构,例如
["SCMP_ARCH_X86_64"]
;多架构部署需补全
SCMP_ARCH_AARCH64
等 syscalls (不是 syscall 或 syscalls_list):是一个对象数组,每个元素含
"name"
(单个调用)或
"names"
(多个调用批量声明)和
"action"
常见错误:手写时把
default_action
写成
defaultAction
,或把
syscalls
拼错为
syscall
,会导致容器启动失败并提示
unknown field "syscall"
。 按运行时语言保留最小必要调用集 盲目禁用会卡死容器——比如禁掉
openat
,Go 程序连自身二进制路径都读不到,直接 panic;Node.js 会因无法初始化 epoll 实例而无法启动 HTTP 服务。 通用基础调用(几乎必留) :
openat
、
read
、
write
、
close
、
statx
、
fstat
、
lseek
、
getpid
、
getuid
、
clock_gettime
Go 容器额外需要 :
clone
(启用 CGO 时创建线程)、
epoll_wait
、
epoll_ctl
、
epoll_create1
Node.js 容器额外需要 :
epoll_wait
、
epoll_ctl
、
epoll_pwait
、
eventfd2
若需调试或日志采集,谨慎放开 :
getrandom
(加密随机数)、
uname
(获取内核信息),但避免
ptrace
、
mount
、
chroot
、
reboot
建议先用
strace -f -e trace=raw_syscall -p $(pidof app)
在测试容器中抓取真实调用,再筛出实际使用的子集,而非照搬网上精简模板。 Docker Sandbox 创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。 下载 路径与权限必须由 daemon 视角确认 Docker daemon 运行在宿主机 root 上下文,它不认你的当前 shell 路径: 配置文件必须使用 绝对路径 ,如
/etc/docker/seccomp-restrict.json
;
./profile.json
或
~/seccomp.json
会被忽略 执行命令时也必须写全路径:
docker run --security-opt seccomp=/etc/docker/seccomp-restrict.json nginx:alpine
确保 daemon 用户(通常是
root
)有读权限:
sudo chmod 644 /etc/docker/seccomp-restrict.json
可用
jq -n -f /etc/docker/seccomp-restrict.json >/dev/null
快速校验 JSON 语法是否合法 验证规则是否真正生效 仅看容器能启动不等于策略起作用。需分层验证: 进容器后执行
cat /proc/self/status | grep Seccomp
:返回值为
2
表示已加载 Filter 模式 测试
ptrace
是否被 kill:
echo $$ && strace -p $$ 2>&1 | head -n1
;若输出含
SIGKILL
或立即退出,说明
SCMP_ACT_KILL
生效;若只是
Operation not permitted
,说明仍为
SCMP_ACT_ERRNO
检查是否被绕过:确认未使用
--privileged
、
--cap-add=SYS_PTRACE
或
--security-opt seccomp=unconfined
启动,这些会完全跳过 Seccomp 不复杂但容易忽略。

相关文章