Dockerfile不能配置内核参数白名单,需通过运行时机制实现:①seccomp限制系统调用;②capabilities最小化权限;③sysctl设置允许的内核参数。
dockerfile 本身不能直接配置内核参数白名单。它不是运行时环境的控制入口,而是用于构建镜像的声明式脚本,不参与容器启动时的内核级安全策略加载。
真正能实现“内核参数白名单”效果的,是容器运行阶段通过 Docker 守护进程和启动参数施加的运行时加固机制,包括 seccomp、capabilities、sysctls、no-new-privileges 等。这些需在 docker run 或编排文件(如 docker-compose.yml)中显式指定,而非写在 Dockerfile 里。
下面分三类关键机制说明如何落地:
✅ 1. Seccomp 系统调用白名单(最核心的内核行为过滤)
Seccomp 是 Linux 内核提供的机制,可精确限制容器内进程能执行哪些系统调用,相当于给内核接口设了一道白名单门禁。
-
准备策略文件(例如
seccomp-restrictive.json):{ "defaultAction": "SCMP_ACT_ERRNO", "syscalls": [ { "name": "read", "action": "SCMP_ACT_ALLOW" }, { "name": "write", "action": "SCMP_ACT_ALLOW" }, { "name": "openat", "action": "SCMP_ACT_ALLOW" }, { "name": "exit_group", "action": "SCMP_ACT_ALLOW" } ] }这表示:只允许极少数基础调用,其余全部拒绝并返回错误。
-
运行时启用(不在 Dockerfile,而在启动命令或 compose 中):
docker run --security-opt seccomp=./seccomp-restrictive.json nginx:alpine
⚠️ 注意:Docker 默认已启用一个较宽松的 seccomp 配置;若要真正收紧,必须显式指定自定义 JSON 文件,并确保
defaultAction设为SCMP_ACT_ERRNO或SCMP_ACT_KILL。
✅ 2. Linux Capabilities 白名单(最小权限原则)
Capabilities 将 root 权限拆解为细粒度能力项(如 CAP_NET_BIND_SERVICE),默认容器会 drop 大部分危险项,但应显式声明所需项,避免依赖默认行为。
-
禁止所有能力,再按需添加(推荐):
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE alpine sh -c "nc -lvp 8080"
-
在
docker-compose.yml中等效写法:services: app: image: alpine cap_drop: - ALL cap_add: - NET_BIND_SERVICE
✅ 关键点:
--cap-drop=ALL+ 显式--cap-add才构成能力白名单逻辑;仅--cap-add是追加,不解决默认残留风险。
✅ 3. 安全 sysctl 参数(内核运行时调优白名单)
Docker 允许以白名单方式设置部分 sysctl 参数(仅限 net.* 和 kernel.msg* 等无特权组),用于加固网络或 IPC 行为。
-
启动时指定(仅支持白名单中的 key):
docker run --sysctl net.ipv4.ip_forward=0 --sysctl net.core.somaxconn=1024 nginx
-
支持的
sysctl列表由 Docker 编译时固定,可通过以下命令查看:docker info | grep -i "experimental\|sysctl" # 或查阅官方文档:https://docs.docker.com/engine/reference/commandline/run/#sysctl
⚠️ 不支持
kernel.shmmax、vm.swappiness等需 root 权限的参数 —— 这些必须在宿主机层面配置,不属于容器白名单范畴。
不复杂但容易忽略


















