Docker 远程接口风险是什么
Docker 守护进程默认只监听本机 Unix Socket,此时访问它需要主机的本地权限。一旦改为监听 TCP(2375 明文、2376 TLS),控制面就暴露在网络上:调用者可以列出与启停容器,也可以创建把宿主机根目录挂载进容器的新容器,进而在主机上获得等效 root 的能力,还能读取其他容器里的环境变量与凭据。因此这个端口的暴露面等级与主机凭据相同,管理原则是不对公网开放,需要远程控制时用 TLS 双向认证并限制来源。
基本信息
| 默认形态 | unix:///var/run/docker.sock,仅本机可访问 |
|---|---|
| 风险端口 | 2375 明文 TCP,2376 TLS |
| 开启方式 | systemd 服务加 -H 参数,或 daemon.json 配置 hosts |
| 可造成的危害 | 控制容器、挂载宿主机目录、读取容器内凭据、耗尽主机资源 |
| 等效权限 | 调用者权限与 root 等效,属于主机级控制面 |
| 正确做法 | 保留 Socket 形态;远程需求启用 TLS 双向认证并限来源 |
典型暴露场景
- 开发或测试机为方便远程管理,直接开启 2375 且不限制来源
- CI 流水线通过公网地址调用远端 Docker,把明文端口暴露出去
- 容器编排把守护进程端口映射到宿主机全网卡
- 临时排障开启远程访问后未回收配置
- 云安全组放行 2375/2376 后长期未复核
- 只开 2376 但未启用客户端证书校验,等于仍是开放控制面
暴露核查(对本方资产)
暴露核查(对本方资产)
curl -s --max-time 3 http://<目标IP>:2375/version | head # 返回版本 JSON 说明 2375 可达
ss -ltnp | grep -E '2375|2376' # 在目标主机上确认监听来源
systemctl cat docker | grep -i -e '-H' # 查看服务文件里的监听参数
# daemon.json 里的 hosts 与 systemd 的 -H 参数同时存在会导致守护进程启动失败
# 修正时只需保留一处配置,避免服务无法启动加固要点
加固要点
1. 默认形态:仅保留 unix socket,删除 TCP 监听
2. 确有远程需求:启用 TLS 双向认证(2376)并限制来源
3. 云环境:优先用云厂商容器服务替代裸 Docker 远程面
4. 权限收敛:docker 组等同于提权通道,成员名单需按最小必要维护
5. 变更后从外部视角复测端口不可达,并在服务文件与编排配置中交叉确认三种形态的风险对照
| 形态 | 可达范围 | 风险等级 |
|---|---|---|
| Unix Socket | 仅本机,需要本地权限 | 相对可控,注意组权限管理 |
| 2376 加双向 TLS | 限来源且需证书 | 可控,需维护证书与来源白名单 |
| 2375 明文 | 网络可达即可调用 | 危急,等同于开放主机控制面 |
Docker Daemon 权限与 root 等效;2375 对公网或大网段开放属于危急级暴露面,应作为最高优先级处理。