守护进程的远程接口
Docker 守护进程默认只监听本机的 unix socket,通过文件权限控制访问。一旦让它监听 TCP,2375 端口是不做认证的:任何能连通该端口的人都能创建特权容器、挂载宿主目录,效果等同于拿到宿主机 root。确需远程访问时应使用 2376 端口并开启 TLS 双向校验,同时用网络 ACL 限制来源,把这一层暴露面压到最小。
基本信息
| 端口约定 | 2375 明文且无认证,2376 为 TLS 端口 |
|---|---|
| 检查命令 | ss -ltnp | grep -E '2375|2376' |
| 加固方式 | --tlsverify 配合 CA、服务端证书与客户端证书 |
| 推荐做法 | 仅本机使用时保持默认的 unix socket |
典型使用场景
- 上线前安全自查:确认没有多余的 TCP 监听端口暴露在外
- 集中构建环境:跨主机调用守护进程时使用证书校验的加密通道
- 事故复盘:确认暴露窗口与来源范围,评估影响面
- 基线核查:把监听地址与 TLS 配置纳入巡检项
- 历史脚本清理:排查遗留在脚本里的无认证监听参数
检查与加固
检查与加固
# 看有没有监听在 TCP 上
ss -ltnp | grep -E '2375|2376'
# 找配置来源:daemon.json 与 systemd 单元
grep -r 'tcp://' /etc/docker/daemon.json /etc/systemd/system/docker.service.d/ 2>/dev/null
# systemd drop-in 片段示意(放在 /etc/systemd/system/docker.service.d/ 下)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem
# 改完重载并确认监听端口与校验生效
systemctl daemon-reload && systemctl restart docker配置方式与风险
| 配置方式 | 认证能力 | 风险 |
|---|---|---|
| unix socket(默认) | 宿主文件权限 | 仅本机可达,暴露面最小 |
| tcp 加 2375 | 无认证 | 任何人可控制守护进程,等同宿主 root |
| tcp 加 2376 且 tlsverify | 校验证书链与客户端身份 | 证书私钥与签发流程需要保护 |
| tcp 加 2376 不带 verify | 只加密不校验客户端 | 客户端证书泄露即可被冒用 |
把监听地址写成 0.0.0.0:2375 等于把宿主机控制权公开在网络上,出现这类配置应按高危事件处理:先切断网络访问,再补证书与来源限制。
证书只签服务端、不校验客户端时,通道虽加密但仍可被持有任何有效客户端证书的人滥用,双向校验才是完整方案。