容器横向渗透攻击防护加固服务器配置:容器横向渗透攻击防护

为什么容器会产生横向渗透风险

容器默认共享宿主机的内核,同一个 Docker 网桥下的容器可以互相通信。
一旦某个容器被入侵,攻击者很容易通过内部网络扫描并攻击其他容器,或者提升权限逃逸到宿主机。横向渗透攻击就是利用这种容器间的信任关系逐步扩大战果。
下面从零开始演示如何加固服务器配置。

准备条件:检查环境并备份数据

  • 操作系统:CentOS 7.9 / Ubuntu 20.04(本文以 Ubuntu 为例)
  • Docker 版本:建议 20.10 以上,命令中用 docker version 查看
  • 已安装 Docker,并且当前用户能执行 docker 命令(如需 sudo 则自行调整)
  • 重要:操作前先备份重要容器和数据卷,避免配置失误导致服务中断

四步加固配置:从网络到内核

第一步:隔离容器网络,禁止默认桥接通信

Docker 安装后会自动创建一个 docker0 桥接网络,所有容器默认都连在上面。第一步就是不让容器自动加入这个公共网络。

  1. 编辑 Docker 的 daemon 配置文件 /etc/docker/daemon.json(如果文件不存在则新建):
   {
     "bridge": "none",
     "iptables": true,
     "icc": false
   }
  • "bridge": "none" 让 Docker 不自动创建默认桥接网络
  • "icc": false 禁止容器间默认通信(icc = inter-container communication)
  1. 重启 Docker 服务:sudo systemctl restart docker
  2. 之后每次运行容器时,应显式指定使用自定义网络(见下一步)。

第二步:使用用户定义的网络并控制连接

不用默认桥接后,新建一个自定义网络,并只将需要通信的容器加入同一个网络。
这样其他容器无法扫描到该网络内的容器。

docker network create --driver bridge --subnet 172.20.0.0/24 secure_net

运行容器时指定 --network secure_net。
例如:

docker run -d --name web --network secure_net nginx:alpine

如果需要容器之间通信,可以显式将容器连接到同一网络(使用 docker network connect)。

第三步:限制 Capabilities 和 Seccomp,防止权限提升

即使网络隔离,容器内的进程仍然可能拥有不必要的 Linux 能力(capabilities)。
建议去掉默认赋予的危险能力,并启用 Seccomp 安全策略。

运行容器时加上 --security-opt no-new-privileges 和 --cap-drop=ALL 先丢掉所有能力,再按需添加。
例如:

docker run -d --name app \
  --network secure_net \
  --security-opt no-new-privileges:true \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  nginx:alpine

同时可以启用 Docker 默认的 Seccomp 配置文件:

docker run -d --name app \
  --security-opt seccomp=/path/to/default.json \
  ...

Docker 自带一个默认的 seccomp 配置文件(/usr/share/docker/default-seccomp.json),直接引用即可。

第四步:使用非 root 用户运行容器进程

默认容器内的进程以 root 身份运行,极大增加逃逸风险。
建议在 Dockerfile 中指定普通用户,或者在运行容器时使用 --user 参数。

例如运行一个 Alpine 容器,用 nobody 用户:

docker run -d --name myapp --user 65534:65534 alpine sleep 3600

如果使用官方镜像(如 nginx),可以查阅其文档,通常有预置的 nginx 用户,直接 --user nginx 即可。

避坑说明:这些配置可能影响正常服务

  • 禁止 icc 后,如果之前容器依赖互相通信(例如 nginx 反向代理 php-fpm),必须显式连接同一自定义网络,否则访问失败。
  • --cap-drop=ALL 后,很多容器功能会受限,比如 nginx 无法绑定 80 端口,需要加 --cap-add=NET_BIND_SERVICE。建议先列出真实所需的能力,参考 Docker 文档。
  • Seccomp 策略:如果容器使用了系统调用但未在默认配置中放行,可能导致程序崩溃。建议先在测试环境运行一段时间,观察日志。
  • 非 root 用户:如果容器需要写日志或操作某些特权目录(如挂载卷),注意目录权限要提前设置。

验证加固效果:几个简单测试

  1. 测试容器间默认通信是否被禁止:
  • 启动两个容器,不指定网络(会尝试加入默认桥接,但已被禁用)。应该无法 ping 通对方的 IP。
  • 如果 docker run --rm alpine ping 172.17.0.2 提示网络不可达或超时,说明隔离生效。
  1. 检查自定义网络内的通信:
  • 将两个容器都加入 secure_net,它们可以互相 ping 通。只加入一个的则无法 ping。
  1. 验证 capabilities 限制:
  • 进入容器 docker exec -it app sh,执行 cat /proc/1/status | grep CapPrm,查看结果。如果 00000000... 说明大部分能力已被丢弃。
  1. 检查用户权限:
  • 容器内执行 whoami 或 id,确认是普通用户而不是 root。

通过以上步骤,你已经为服务器上的容器环境构筑了基础的横向渗透攻击防护。
建议定期检查 Docker 的安全配置变更,并结合防火墙(如 ufw)进一步限制外部访问。
如果遇到容器启动异常,优先回看避坑部分的说明。

常见问题解答

Q:启用 icc: false 后,我的单机容器怎么连外网?
A:不影响连接外网。icc 仅控制容器间通信,容器仍可通过宿主机的 iptables 访问外部。

Q:我已经有运行中的容器,怎么应用这些配置?
A:需要删除容器后重新创建。生产环境请先规划停机窗口,或新建测试容器确认无误再迁移。

Q:这些配置会影响 Kubernetes 吗?
A:如果 Docker 被 Kubernetes 使用,建议在 Kubernetes 层面(如 NetworkPolicy、PodSecurityPolicy)控制,Docker daemon 的 icc 配置可能被覆盖。本教程适用于独立 Docker 环境。

分享到:
上一篇
AIOps智能故障自愈服务器自动处理告警
下一篇
K8s集群Ingress Nginx高危漏洞一键修复实操指南
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意