容器逃逸:Docker 安全基础

发布时间:2026-06-29 分类: 安全意识

Docker 很方便,但别忽视安全

Docker 让部署更简单:

  • 一条命令启动服务
  • 环境一致,不再有"我机器上能跑"
  • 微服务架构更灵活

但容器不是"安全沙箱",攻击者可能从容器逃逸到宿主机。


什么是容器逃逸?

容器逃逸 = 攻击者从容器内部,突破隔离,获取宿主机的控制权。

一旦逃逸成功:

  • 攻击者可以控制宿主机
  • 访问宿主机上的所有容器
  • 窃取宿主机上的数据

容器逃逸的 4 种方式

方式一:特权容器

场景: 使用 --privileged 启动容器。

风险:

  • 容器拥有宿主机所有设备的访问权限
  • 可以访问宿主机的文件系统
  • 可以加载内核模块

防范:

  • 不使用 --privileged
  • 只挂载必要的设备
  • 使用 --cap-add 精细控制权限

方式二:挂载 Docker Socket

场景:/var/run/docker.sock 挂载到容器中。

风险:

  • 容器可以通过 Docker Socket 控制宿主机的 Docker
  • 创建新容器、删除容器、访问其他容器的数据

防范:

  • 不挂载 Docker Socket
  • 如必须挂载,严格控制权限

方式三:挂载宿主机文件系统

场景: 将宿主机的根目录挂载到容器中。

风险:

  • 容器可以读写宿主机的所有文件
  • 可以修改 /etc/shadow/etc/sudoers
  • 可以添加 SSH 密钥

防范:

  • 不挂载宿主机根目录
  • 只挂载必要的目录
  • 挂载时使用只读模式

方式四:内核漏洞

场景: 宿主机内核存在漏洞,攻击者从容器利用。

风险:

  • 容器与宿主机共享内核
  • 内核漏洞可能被利用进行逃逸

防范:

  • 及时更新宿主机内核
  • 使用 seccomp 限制系统调用
  • 使用 AppArmor/SELinux 加强隔离

Docker 安全最佳实践

1. 不使用 root 运行容器

RUN useradd -m appuser
USER appuser

2. 使用最小基础镜像

  • 使用 Alpine 或 distroless 镜像
  • 减少攻击面
  • 不安装不必要的工具

3. 不使用 latest 标签

  • 使用具体的版本标签
  • 避免镜像被替换

4. 定期扫描镜像漏洞

  • 使用 Trivy、Clair 等工具扫描
  • 及时更新有漏洞的镜像
  • 使用可信的镜像源

5. 使用只读文件系统

docker run --read-only ...

6. 限制资源

docker run --memory=512m --cpus=1 ...

一句话总结

容器不是安全沙箱,特权容器、挂载 Docker Socket、内核漏洞都可能导致逃逸。不用 root、不用特权、限制挂载、及时更新。


标签: 开发安全、Docker安全、容器安全、信息安全意识