挂载 docker.sock 的风险是什么
把宿主机的 /var/run/docker.sock 挂进容器,等价于把宿主 Docker 的控制权交给容器内进程。Docker 守护进程接受通过该套接字发来的指令,因此容器内的进程可以创建新容器并挂载宿主机根目录、读取全部镜像与其中的凭据、访问其他容器的文件系统,从而从容器内取得宿主机级别的控制能力。这个模式在持续集成与自动化运维场景中很常见,因为方便,甚至经常与特权模式一起出现。
基本信息
| 涉及路径 | /var/run/docker.sock(宿主 Docker 守护进程套接字) |
|---|---|
| 典型场景 | CI/CD 构建、自动化部署、容器内管理其他容器 |
| 危害层级 | 等价于宿主机 root 权限 |
| 替代方案 | API 封装服务、专用最小权限代理、rootless 模式 |
典型使用场景
- 盘点现有容器:找出挂载了 docker.sock 的实例并评估必要性
- CI 构建场景评估改用不存在宿主套接字的构建方式,如按需创建隔离构建环境
- 需要动态创建容器的应用改为经 API 封装服务间接调用,而不是直接持有套接字
- 无法避免挂载时改用只读方式并限制容器权限,同时把构建机与生产宿主分开
- 安全基线检查中把挂载套接字与特权模式列为同一类高危配置
风险面排查
风险面排查
# 列出容器的挂载来源,检查是否出现 docker.sock
docker inspect <容器名> \
--format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'
# 批量筛出所有挂载了宿主套接字的容器
docker ps -q | xargs -I{} docker inspect {} \
--format '{{.Name}} {{range .Mounts}}{{.Source}} {{end}}' | grep 'docker.sock'
# 同时检查是否开启了特权模式
docker ps -q | xargs -I{} docker inspect -f '{{.Name}} {{.HostConfig.Privileged}}' {} | grep true收敛方向与代价
| 方向 | 做法 | 权衡 |
|---|---|---|
| 评估必要性 | 多数场景可用 API 封装替代直接挂载 | 需开发一个中间服务 |
| 只读挂载 | 挂载时加 :ro,限制写入操作 | 仍可读取全部镜像与容器信息 |
| 限制权限 | 不配合 privileged,收敛能力集 | 部分运维操作会受限 |
| rootless / 专用代理 | 使用 rootless Docker 或最小权限代理 | 改造工作量较大 |
CI/CD 构建场景是这类配置最集中的地方:应把构建机单独池化并与生产宿主彻底隔离,让构建任务的失控风险不落到生产节点上。
挂载套接字后又给容器 privileged,两层权限叠加,效果等于直接把宿主机 root 交出去,容器隔离在此配置下基本失效。