如何通过Seccomp在Docker中设置白名单以限制容器高危系统调用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计743个文字,预计阅读时间需要3分钟。
在Docker中使用Seccomp进行白名单限制,核心不是禁用危险调用,而是只释放真正需要的调用——默认拒绝所有,再逐个添加。这种模式比黑名单更安全,也更可控。
白名单策略必须满足三个硬性结构要求
Seccomp配置是纯JSON,字段名大小写敏感,缺一不可:
-
default_action:必须设为
"SCMP_ACT_ERRNO"(拒绝并返回错误)或"SCMP_ACT_KILL"(直接终止进程),不能拼错成defaultAction或defaultaction -
architectures:至少包含宿主机架构,例如
["SCMP_ARCH_X86_64"];ARM容器需加"SCMP_ARCH_AARCH64",漏掉会导致容器根本启不来 -
syscalls:必须是数组,每个元素含
names(字符串数组)和action(如"SCMP_ACT_ALLOW"),不能写成syscall或name
关键系统调用白名单要按运行时实际需求选
盲目删减会直接导致容器崩溃。比如Go程序启动就依赖clone和epoll_wait,Node.js也频繁使用epoll_ctl;而openat、read、close、fstat、statx是绝大多数语言读配置、加载库、查进程状态的基础,禁掉openat连ls和ps都会失败。
- 先用
strace -f -e trace=raw_syscall -p $(pidof your-app)抓真实调用序列 - 对Go/Node.js容器,至少保留
clone、epoll_wait、epoll_ctl、epoll_pwait - 基础文件操作组建议固定保留:
openat、read、close、statx、fstat、getdents64
高危系统调用应显式拦截而非依赖默认策略
Docker默认策略已禁用约44个高风险调用,但生产环境不能依赖它。建议在白名单中主动覆盖以下调用,确保万无一失:
-
ptrace:防止调试注入与内存篡改,设"action":"SCMP_ACT_ERRNO" -
mount、umount2:阻断挂载逃逸路径 -
chroot、setns、unshare:关闭命名空间操控能力 -
reboot、swapon、swapoff:避免影响宿主机资源管理
配置文件路径与权限必须由daemon视角验证
Docker daemon以root身份运行,它看不到你当前终端下的相对路径或~。常见报错open profile.json: no such file基本都源于此。
- 把配置存到
/etc/docker/seccomp.json这类daemon可读路径 - 执行
sudo chmod 644 /etc/docker/seccomp.json确保可读 - 运行容器时用绝对路径:
docker run --security-opt seccomp=/etc/docker/seccomp.json ... - 校验JSON语法:
jq -n -f /etc/docker/seccomp.json >/dev/null || echo "invalid"
本文共计743个文字,预计阅读时间需要3分钟。
在Docker中使用Seccomp进行白名单限制,核心不是禁用危险调用,而是只释放真正需要的调用——默认拒绝所有,再逐个添加。这种模式比黑名单更安全,也更可控。
白名单策略必须满足三个硬性结构要求
Seccomp配置是纯JSON,字段名大小写敏感,缺一不可:
-
default_action:必须设为
"SCMP_ACT_ERRNO"(拒绝并返回错误)或"SCMP_ACT_KILL"(直接终止进程),不能拼错成defaultAction或defaultaction -
architectures:至少包含宿主机架构,例如
["SCMP_ARCH_X86_64"];ARM容器需加"SCMP_ARCH_AARCH64",漏掉会导致容器根本启不来 -
syscalls:必须是数组,每个元素含
names(字符串数组)和action(如"SCMP_ACT_ALLOW"),不能写成syscall或name
关键系统调用白名单要按运行时实际需求选
盲目删减会直接导致容器崩溃。比如Go程序启动就依赖clone和epoll_wait,Node.js也频繁使用epoll_ctl;而openat、read、close、fstat、statx是绝大多数语言读配置、加载库、查进程状态的基础,禁掉openat连ls和ps都会失败。
- 先用
strace -f -e trace=raw_syscall -p $(pidof your-app)抓真实调用序列 - 对Go/Node.js容器,至少保留
clone、epoll_wait、epoll_ctl、epoll_pwait - 基础文件操作组建议固定保留:
openat、read、close、statx、fstat、getdents64
高危系统调用应显式拦截而非依赖默认策略
Docker默认策略已禁用约44个高风险调用,但生产环境不能依赖它。建议在白名单中主动覆盖以下调用,确保万无一失:
-
ptrace:防止调试注入与内存篡改,设"action":"SCMP_ACT_ERRNO" -
mount、umount2:阻断挂载逃逸路径 -
chroot、setns、unshare:关闭命名空间操控能力 -
reboot、swapon、swapoff:避免影响宿主机资源管理
配置文件路径与权限必须由daemon视角验证
Docker daemon以root身份运行,它看不到你当前终端下的相对路径或~。常见报错open profile.json: no such file基本都源于此。
- 把配置存到
/etc/docker/seccomp.json这类daemon可读路径 - 执行
sudo chmod 644 /etc/docker/seccomp.json确保可读 - 运行容器时用绝对路径:
docker run --security-opt seccomp=/etc/docker/seccomp.json ... - 校验JSON语法:
jq -n -f /etc/docker/seccomp.json >/dev/null || echo "invalid"

