必须立即下线暴露的Docker Registry并启用TLS+Token认证。停止容器、关闭5000端口、验证连接拒绝;配置htpasswd与config.yml启用Token认证;强制HTTPS或IP白名单;清理泄露镜像并重建安全镜像。

直接暴露未认证的 Docker Registry API,等于把整库镜像的读写权限交到任何人手上。攻击者无需登录、不需密码,就能列出所有仓库、遍历全部标签、下载每一层 blob——源码、密钥、配置全在其中。问题核心不是“怎么修”,而是“必须立刻切断暴露面+重建可信访问路径”。
立即下线暴露端口并验证可访问性
私有 Registry 默认监听 5000 端口且无认证时,最危险的操作是让它继续对外响应。请立即执行:
- 停止 Registry 容器:
docker stop registry或检查是否为 systemd 服务(如systemctl stop docker-registry) - 确认端口已关闭:
ss -tuln | grep :5000或netstat -tuln | grep :5000,确保无监听进程 - 从外部发起探测验证:
curl -I http://your-registry-ip:5000/v2/,应返回连接拒绝(Connection refused),而非200 OK或401 Unauthorized
强制启用身份认证机制
Registry 官方镜像支持 Basic Auth 和 Token Auth 两种主流方式。生产环境必须选 Token;Basic Auth 仅限内网测试且需配合 TLS:
- 用
htpasswd创建用户文件:mkdir -p /opt/registry/auth && htpasswd -Bbn myuser mypass > /opt/registry/auth/htpasswd - 配置
config.yml启用 auth(示例节选):
auth:
htpasswd:
realm: "Registry Realm"
path: /auth/htpasswd - 启动时挂载配置与认证文件:
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry -v /opt/registry/config.yml:/etc/docker/registry/config.yml -v /opt/registry/auth:/auth registry:2
补全传输加密与网络隔离
即使加了认证,明文 HTTP 仍会让用户名密码在传输中被截获。必须同步落实:
- 使用有效 TLS 证书(推荐 Let’s Encrypt 或企业 CA),将 Registry 部署在 HTTPS 域名下(如
reg.example.com) - 若暂无法配证书,至少限制访问来源:
— 在宿主机防火墙中只放行 CI/CD 服务器、运维跳板机 IP:ufw allow from 192.168.10.5 to any port 5000
— 或在反向代理(Nginx / Traefik)层做 IP 白名单 + 认证透传 - 禁用不安全注册表配置:
insecure-registries必须从所有客户端的/etc/docker/daemon.json中彻底移除
清理已泄露内容并审计访问痕迹
暴露期间可能已被扫描或下载。需主动止损:
- 检查 Registry 日志(默认不开启,若已配置
log字段):查找大量/v2/_catalog或/v2/*/tags/list的 GET 请求 - 清空已暴露的敏感镜像(特别是含
.env、secrets.json、config.py的):curl -X DELETE http://localhost:5000/v2/<repo>/manifests/<digest>,再执行垃圾回收 - 重新构建所有受影响镜像:确保新镜像不含源码(用多阶段构建)、不打包
.dockerignore未覆盖的密钥文件,并打新标签推送


















