容器不是沙箱:权限、挂载与镜像的三个边界

加固 · 3 分钟阅读· 290 次阅读

容器共享宿主内核,隔离强度远低于虚拟机。一个特权容器被攻破,基本等于宿主机失守。

最常见的三个错误:--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 里,靠人记必然漏。

发表评论

验证码

提交后需站长审核,通过后才会显示。