容器的安全边界
容器与虚拟机有本质区别。容器共享宿主机内核,隔离靠 namespace 和 cgroups 实现。虚拟机有独立内核,隔离靠硬件虚拟化。 这意味着容器逃逸的后果更严重。一个内核漏洞可能让攻击者从容器直接拿到宿主机权限。以非 root 运行
容器里的进程默认以 root 身份运行。容器内 root 在宿主机上同样是高权限用户。这是最常见的风险来源。能力裁剪
Linux 把 root 权限拆成几十个 capability。容器默认持有其中一批,比如修改网络配置的NET_ADMIN 风险很高。
原则是全部丢弃,再按需加回。
NET_BIND_SERVICE 允许进程绑定 1024 以下的特权端口。普通 Web 服务通常只需要这一个。只读根文件系统
攻击者进入容器后的第一件事往往是写入恶意程序。只读根文件系统可以拦住这一步。1
确认应用的写入路径
先正常跑容器,用
docker diff 找出它写入了哪些目录。2
为这些路径准备挂载
数据目录挂 volume,临时目录挂 tmpfs。
3
加上 --read-only 重启验证
应用报错说明还有遗漏的写路径,补齐挂载再试。
镜像安全
镜像是供应链攻击的入口。三条基本规则:- 固定版本,不用
latest。latest随时可能变,也无法审计。 - 用官方镜像或可信来源的镜像。
- 上线前扫描漏洞。
守护进程安全
Docker 守护进程以 root 运行。能访问docker.sock 就等于拿到了宿主机的 root。
敏感信息管理
密码和密钥不要写进ENV,也不要写进 Dockerfile。它们会留在镜像层里,任何人拿到镜像都能提取。
安全清单
上线前逐项检查:延伸阅读
- Docker 镜像:镜像分层与构建安全
- Docker 资源限制:限制资源也是安全手段
- Docker 生产实践:生产环境加固完整方案
- Kubernetes 安全:RBAC 与 Pod 安全标准