首页/安全/漏洞与攻击面速查/Docker Daemon 远程接口风险(2375/2376)
主机与服务风险面53 条

Docker Daemon 远程接口风险(2375/2376)

Docker 守护进程默认只监听 Unix Socket;若配置为 TCP 监听(2375 明文 / 2376 TLS),等价于把主机控制面暴露出去——可达者可以创建特权容器、挂载宿主目录。

漏洞与攻击面速查安全更新于 2026-10-13

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 对公网或大网段开放属于危急级暴露面,应作为最高优先级处理。

易错点

  • 为图方便在开发机上开 2375 且防火墙全通:一台开发机等同于一把主机钥匙
  • 只开 2376 不启用客户端证书校验:单向 TLS 只加密传输,不验证调用者身份
  • 把 docker 组当普通业务组:加入该组的用户可获得等效 root,成员需按特权账号管理
  • daemon.json 与 systemd 的监听参数同时配置:守护进程可能直接启动失败,变更要二选一并验证服务状态
  • 只改宿主机配置忽略编排层:部署模板与编排清单里可能仍带着远程端口映射
  • 收敛后不验证容器业务:检查业务容器是否依赖远程调用,避免直接断开导致发布流水线中断

数据来源与参考

  • Docker 官方文档(Protect the Docker daemon socket)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌