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安全、容器安全、信息安全意识