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

如何在Docker中利用Seccomp自定义规则集禁止特定的网络Socket系统调用

Seccomp通过禁用socket、bind、connect、listen、accept4、sendto、recvfrom等底层系统调用实现网络限制,推荐采用defaultAction: SCMP_ACT_ALLOW配合SCMP_ACT_ERRNO拒绝策略,并确保规则文件路径正确、权限可读。 Seccomp 本身不直接识别“网络”或“Socket”这类语义概念,它只按系统调用名称(syscall name)和参数做过滤。所谓“禁止网络 Socket 系统调用”,实际是指禁用 socket 、 bind 、 connect 、 listen 、 accept4 、 sendto 、 recvfrom 等与网络通信强相关的底层 syscall。但需注意:盲目全禁会导致容器无法启动(如 Go 程序初始化时会尝试读取 /proc/sys/net/ 目录,触发 socket 相关探测),因此必须结合应用行为精准控制。 明确要禁用的核心 Socket 相关系统调用 以下是最常被用于主动建立或管理网络连接的系统调用,属于高风险拦截目标: socket :创建套接字,是所有网络通信起点 bind :绑定地址端口,常用于服务监听 connect :发起客户端连接,攻击者常用其外连 C2 listen 和 accept4 :服务端接受连接,暴露监听面 sendto / recvfrom :UDP 通信主调用,也用于某些原始套接字操作 编写可落地的 Seccomp JSON 规则片段 推荐采用“默认允许 + 显式拒绝”策略(defaultAction: SCMP_ACT_ALLOW),避免白名单遗漏导致容器崩溃。以下规则将阻止任意进程调用 socket 类系统调用,并返回 EPERM 错误:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["socket", "bind", "connect", "listen", "accept4", "sendto", "recvfrom"], "action": "SCMP_ACT_ERRNO" } ] }
说明: • 使用 SCMP_ACT_ERRNO 而非 SCMP_ACT_KILL ,避免因日志采集、健康检查等短暂调用直接杀死进程; • 若需更严格防护(如无任何网络需求的离线计算容器),可改用 SCMP_ACT_KILL ,内核将立即终止违规进程; • 不建议对 getsockopt 、 setsockopt 盲目禁用——它们常被 glibc 或运行时用于查询本地 socket 状态,禁用易致 panic。 Docker Sandbox 创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。 下载 验证规则是否生效并定位失败调用 禁用后若容器异常退出或功能失效,需快速确认是否为 Seccomp 拦截所致: 在宿主机上运行: dmesg -T | grep "SECCOMP" ,查看内核日志中是否有类似 "seccomp killed process" 的记录 进入正在运行的容器,执行: strace -f -e trace=socket,connect,bind 2>&1 | head -20 ,观察哪些调用被阻断及返回值(EPERM 即被 Seccomp 拦截) 使用 dockerinspect 检查
HostConfig.SecurityOpt
是否正确挂载了 seccomp 配置路径 部署注意事项:路径、权限与兼容性 规则文件必须被 Docker daemon 正确加载,否则配置无效: 文件须存放在 daemon 可读路径,例如 /etc/docker/seccomp-no-network.json ,不能用
./
或
~/
确保 root 用户(daemon 运行身份)有读权限: sudo chmod 644 /etc/docker/seccomp-no-network.json 启动容器时显式指定: docker run --security-opt seccomp=/etc/docker/seccomp-no-network.json ... Kubernetes 用户需通过
securityContext.seccompProfile
字段挂载,且 profile 必须预置于节点
/var/lib/kubelet/seccomp/
下

相关文章