Docker Socket安全教程
Docker Socket通常位于:
/var/run/docker.sock
它是Docker客户端与守护进程通信的入口。容器如果能够访问该Socket,往往可以创建高权限容器、挂载宿主机目录,最终获得接近Root级别的控制能力。
一、检查哪些容器挂载了Socket
docker inspect \
--format '{{.Name}} {{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}' \
$(docker ps -q)
也应检查Compose文件中是否存在:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
二、不要把只读挂载当成完整保护
下面的写法仍然存在风险:
- /var/run/docker.sock:/var/run/docker.sock:ro
文件系统只读挂载并不能限制Docker API执行创建容器、挂载目录等管理操作,因此不应把它视为安全隔离。
三、减少Socket暴露
建议采取以下措施:
- 不需要Docker管理能力的容器不要挂载Socket
- 为管理工具使用独立主机或受限环境
- 评估使用Docker Socket Proxy限制API路径
- 使用Rootless Docker降低守护进程权限
- 不向网络开放未加密的2375端口
- 远程API必须使用TLS和访问控制
- 定期检查拥有
docker用户组权限的账号
需要注意,加入docker用户组通常等同于获得较高的宿主机管理权限。
四、发现异常挂载怎么处理
先确认容器用途和依赖关系,再在测试环境移除挂载。不要直接修改生产Compose文件后重建容器,以免监控、反向代理或自动部署功能中断。