容器不是沙箱:权限、挂载与镜像的三个边界
容器共享宿主内核,隔离强度远低于虚拟机。一个特权容器被攻破,基本等于宿主机失守。
最常见的三个错误:--privileged、把 /var/run/docker.sock 挂进容器、用 root 跑应用。
先说结论
去掉 privileged、不挂 docker.sock、非 root 运行、drop 多余 capabilities。
- 按需 --cap-drop ALL 再逐个加
- 根文件系统只读,只挂必要目录
- 应用用非 root 用户运行
- 镜像固定版本并定期扫描漏洞
漏洞是怎么产生的
容器逃逸的常见路径就是「给了不该给的权限」:特权模式、宿主设备、以及 docker.sock。
挂载 docker.sock 等于把容器管理权限交给容器内进程,效果与 root 相同。
修复与验证
修复不是改一行代码,而是四件事一起做:
- 排查 --privileged 与 --pid=host 的使用
- 移除 docker.sock 挂载,改用受限 API 代理
- Dockerfile 里创建非 root 用户并以之运行
- 设置 read_only 与 tmpfs,缩小可写范围
- 镜像扫描(trivy/grype)纳入 CI
攻击面与检测点
按影响面排序,先修影响最大的:
| 配置 | 风险 | 建议 |
|---|---|---|
| --privileged | 等同宿主 root | 禁用 |
| docker.sock 挂载 | 容器可控制宿主 | 禁用或代理 |
| root 用户 | 逃逸后直接 root | 非 root 运行 |
| latest 镜像 | 版本不可控 | 固定 digest |

几个容易踩的坑
下面这些是最常见的错误做法:
- 为了省事加 privileged:调试完忘了删
- 把宿主目录全量挂进去:容器可改系统文件
- 用 root 跑 Web 服务:被 RCE 就是 root
- 相信镜像来源:公共镜像也可能带后门
写在最后
容器安全的第一原则:默认最小权限,需要什么显式给什么。
安全不是一次加固,是持续的假设:假设输入不可信、假设边界会破、假设有人会看错。
评论 (3)
修复清单比漏洞描述有用多了,很多文章只讲怎么打不讲怎么防。
白名单那条永远是最有效的,正则黑名单迟早绕过。
建议再补一条:把这类检查加到 CI 里,靠人记必然漏。
发表评论