核心是关闭容器的sysctl权限并禁用sys_admin能力,同时加固宿主机内核参数:禁止使用--sysctl和--privileged,显式--cap-drop=sys_admin;宿主机设置kernel.kptr_restrict=2、kernel.yama.ptrace_scope=1、net.ipv4.ip_forward=0、kernel.randomize_va_space=2等参数并持久化生效。

限制容器修改宿主机内核参数,核心是关闭容器的 sysctl 权限,并禁用相关 capability,同时配合内核参数加固策略。
禁止容器执行 sysctl 修改
Docker 默认不允许容器修改大多数内核参数,但若启动时显式加了 --sysctl 参数(如 --sysctl net.ipv4.ip_forward=1),就会开放部分写入权限。要彻底禁止:
- 启动容器时 不使用
--sysctl参数 - 在
docker run中添加--cap-drop=SYS_ADMIN—— 因为sysctl写操作依赖SYS_ADMINcapability,移除后即使挂载了/proc/sys也无法写入 - 避免使用
--privileged,它会自动授予所有 capabilities,包括SYS_ADMIN
加固宿主机内核参数(防止绕过)
即使容器无法直接调用 sysctl,某些攻击路径仍可能间接影响内核行为。应在宿主机层面固化关键参数:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
kernel.kptr_restrict = 2:隐藏内核符号地址,增加利用难度 -
kernel.yama.ptrace_scope = 1:阻止容器内进程ptrace宿主机或其他容器进程 -
net.ipv4.ip_forward = 0:非网关场景下必须关闭 IP 转发 -
kernel.randomize_va_space = 2:启用完整 ASLR,提升内存漏洞利用门槛
这些参数可通过 /etc/sysctl.conf 持久化,并运行 sysctl --system 生效。
验证是否生效
进入容器后尝试修改任意可写参数(如 echo 1 > /proc/sys/net/ipv4/ip_forward),应返回 Permission denied;同时检查 cat /proc/1/status | grep CapEff,确认 SYS_ADMIN 对应 bit 未置位(即 capability 已被 drop)。
补充建议
对高安全要求场景,还可结合 SELinux 或 AppArmor 策略进一步限制 /proc/sys 的写访问;若使用 Docker Compose,需在 deploy.resources 外显式声明 cap_drop 和禁用 sysctls 字段。










