Docker Registry 暴露风险是什么
用官方 registry:2 镜像自建仓库时,若没有配置认证,任何能访问服务的人都可以调用 Registry HTTP API v2:/v2/_catalog 会列出全部仓库名,标签与镜像层可被匿名拉取。镜像层里常常包含构建期的环境文件、内网地址、依赖清单乃至写死在镜像中的凭据。更麻烦的是删除接口默认可用,未认证暴露时镜像可能被直接删除,影响发布链路可用性。
基本信息
| 组件 | Docker Distribution(registry:2 官方镜像) |
|---|---|
| 默认端口 | 5000(通常经 Nginx 反代到 443) |
| 关键接口 | /v2/、/v2/_catalog、/v2/<name>/tags/list |
| 认证方式 | htpasswd 基础认证、令牌认证或改用 Harbor 等方案 |
| 常见误配 | 未启用 auth、未挂载证书、删除 API 未关闭 |
典型使用场景
- 新建自建仓库后先做匿名访问测试,确认 /v2/ 返回 401
- 给仓库配置 TLS,避免凭据与镜像层在网络上明文传输
- 为不同团队分配独立账号,避免全公司共用一个推送凭据
- 评估从 registry:2 迁移到带 RBAC 与扫描能力的 Harbor
- 下线旧仓库时清理 DNS 记录与反向代理配置,避免残留入口
匿名访问测试
匿名访问测试
curl -s -o /dev/null -w '%{http_code}\n' https://registry.example.com/v2/
curl -s -o /dev/null -w '%{http_code}\n' https://registry.example.com/v2/_catalog
# 期望未认证返回 401
curl -s https://registry.example.com/v2/_catalog | head -c 300
# 返回 200 且带仓库列表,说明认证未启用配置要点(compose 片段)
配置要点(compose 片段)
registry:
image: registry:2
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
REGISTRY_HTTP_TLS_KEY: /certs/domain.key
volumes:
- ./auth:/auth:ro # htpasswd 凭据文件
- ./certs:/certs:ro # 证书,避免明文传输加固项与效果
| 加固项 | 效果 | 注意 |
|---|---|---|
| 启用 htpasswd | 拦截未认证拉取与推送 | 改配置后必须重启容器才生效 |
| 启用 TLS | 保护凭据与镜像层传输 | 证书过期需纳入监控 |
| 来源限制 | 只允许构建网段访问 | 公网入口改走网关鉴权 |
| 关闭删除 API | 防止镜像被误删或恶意删除 | 需按版本确认开关名称 |
registry:2 只提供仓库存储与基础认证:若需要漏洞扫描、项目隔离与审计日志,直接改用 Harbor 这类上层方案比在 registry 上叠加组件更省事。
镜像层一旦可被匿名拉取,等于把镜像构建时的全部上下文交出去:排查时应同时评估其中的凭据是否需要按泄露流程更换。