防止容器越权逃逸需四层叠加:非root用户运行(如user: "1001:1001")、capabilities白名单(cap_drop: ["ALL"]后仅add必需项)、只读根文件系统+tmpfs受控写入、严格挂载约束(禁用docker.sock等高危路径)。

防止容器越权逃逸不能靠单一配置,关键在于组合控制:非 root 用户 + 精准 capabilities + 只读文件系统 + 严格挂载约束。这四层叠加后,即使应用层被攻破,攻击者也难以突破容器边界。
用 user 指令强制非 root 运行
在 docker-compose.yml 中为每个服务显式指定 UID:GID,不依赖镜像默认用户:
- 写法必须是数字格式,如 user: "1001:1001",避免使用用户名(镜像内可能不存在)
- 基础镜像需提前创建该用户,例如在 Dockerfile 中添加:
RUN adduser -u 1001 -D appuser && chown -R appuser:appuser /app - 验证方式:进入容器后执行 id,确认 uid/gid 非 0;再查 cat /proc/1/status | grep CapEff,CapEff 值应为 0x0000000000000010(仅 NET_BIND_SERVICE)或更小
用 cap_drop 和 cap_add 实现能力白名单
不要在默认能力集上“加功能”,而是先清空、再按需授予:
- 必须写 cap_drop: ["ALL"],否则默认仍含 CAP_DAC_OVERRIDE、CAP_SYS_CHROOT 等高危能力
- 只添加真正必需的能力,例如 Web 服务只需 cap_add: ["NET_BIND_SERVICE"],禁止添加 SYS_TIME、SYS_PTRACE 等无关项
- 生产环境建议显式排除已知逃逸跳板:
cap_drop: ["ALL", "SYS_ADMIN", "NET_ADMIN", "SYS_MODULE", "SYS_RAWIO"]
启用只读根文件系统与受控临时空间
阻止攻击者向容器内写入恶意二进制或篡改配置:
- 设 read_only: true,使整个 / 文件系统不可写
- 对必须可写的路径,用 tmpfs 显式声明,并限制大小和执行权限:
tmpfs: - /tmp:size=32M,noexec,nosuid,nodev - 确保日志目录(如 /var/log)也通过 tmpfs 或 volume 挂载,避免写满宿主机磁盘
严控挂载与网络暴露面
很多逃逸始于一次不当挂载或端口映射:
- 绝对禁止挂载:/proc、/sys、/var/run/docker.sock、/(宿主机根)
- 挂载数据卷时加 ro 后缀,如 ./data:/data:ro,除非明确需要写入
- 对外暴露端口前,优先走反向代理(如 Nginx 或 Traefik),避免直接映射到容器 80/443;若必须映射,配合 host 网络策略或防火墙规则限制源 IP


















