核心在于阻断凭证在传输和存储环节被截获:强制HTTPS并校验证书、启用mTLS双向认证、凭据不落盘而交由系统密钥环或临时token管理、禁用不安全的Docker守护进程通信方式。
防范中间人攻击窃取 Docker 凭证,核心在于阻断凭证在传输和存储环节被截获的路径。重点不是“配置 Docker Client”本身,而是确保它只通过可信通道通信、不落盘明文凭据,并启用双向身份验证。
Docker Client 默认信任远程 Registry 的 TLS 证书,若未严格校验,攻击者可伪造证书实施中间人攻击。必须确保:
docker login https://registry.example.com),避免因协议降级导致凭证走 HTTP/etc/docker/certs.d/registry.example.com/ca.crt),否则客户端会跳过证书校验仅校验服务端证书不够——攻击者可劫持已认证会话。双向 TLS 要求客户端也提供证书,实现强身份绑定:
cert.pem、key.pem、ca.crt 放入 ~/.docker/certs.d/registry.example.com/
tls.clientauth 并配置信任该 CA即使通信加密,~/.docker/config.json 中 Base64 编码的 auth 字段仍可被本地提权或误挂载容器读取。应绕过该文件存储:
credsStore(如 Linux 上用 pass,macOS 用 osxkeychain,Windows 用 wincred),使 docker login 将 token 存入系统密钥环而非 config.jsoncredHelpers,调用对应 CLI(如 aws ecr get-login-password)动态获取短期 token,不持久化docker login 持久化,改为每次构建前用临时 token 执行 docker login -u AWS -p $(aws ecr get-login-password) https://xxx.dkr.ecr.region.amazonaws.com
Docker Client 默认通过 Unix socket(/var/run/docker.sock)与守护进程通信。若该 socket 权限宽松或被挂入容器,攻击者可直接调用 API 获取镜像层、甚至逃逸:
/var/run/docker.sock 权限为 srw-rw----,且仅属主和 docker 组可访问/var/run/docker.sock 挂载进不可信容器(尤其是 CI runner 容器)-H tcp://0.0.0.0:2375)