必须禁用catalog接口并强制所有/v2/路径认证,关闭匿名访问、收敛错误响应、限制ip白名单。registry无反爬功能,需通过配置切断元数据暴露路径,使扫描器无法获取任何有效信息。

要让 Docker Registry 主动拒绝未知扫描行为,关键不是“拦截扫描工具”,而是切断其获取有效信息的路径——即不暴露任何可被枚举或试探的元数据,同时限制未认证请求的响应粒度。Registry 本身不提供“反爬”或“扫描防护”功能,但可通过组合配置实现事实上的拒绝效果。
关闭镜像列表与仓库发现
默认情况下,Registry 的 /v2/_catalog 和 /v2/<repo>/tags/list</repo> 接口允许匿名列出所有仓库和标签,这是扫描器最依赖的入口。必须禁用:
- 在 Registry 配置文件(
config.yml)中显式关闭目录服务:catalog: { enabled: false } - 确保所有
/v2/路径均受认证保护,Nginx 或 Traefik 代理中移除对/v2/_catalog或/v2/*的无条件放行规则 - 避免使用
registry:2默认镜像启动裸服务;生产环境务必挂载自定义配置并验证curl -I http://reg.example.com/v2/_catalog返回 401 或 404
最小化错误响应信息
Registry 对非法请求返回的错误详情(如 404 时暴露仓库是否存在、401 时提示 realm)会辅助扫描器做指纹识别和路径探测。应统一收敛响应:
- 通过反向代理层(如 Nginx)重写错误页:将所有 4xx/5xx 响应体替换为通用提示,例如
{"error":"access denied"},不带路径、仓库名或认证方式说明 - 禁用 Registry 的 debug 模式(确认
log.level不是debug),避免日志中泄露请求上下文 - 避免在 HTTP 响应头中暴露
Server: docker-registry/2.8.1等版本标识,Nginx 可配置server_tokens off;
启用强认证并拒绝匿名访问
未知扫描通常基于未授权请求。只要 Registry 拒绝一切无有效凭证的请求,扫描器就无法获得任何有效响应:
- 禁用匿名拉取:确保
auth配置完整启用,例如使用htpasswd或 Keycloak,且不配置token认证的realm允许匿名回退 - 对所有
/v2/路径强制 Basic 或 Bearer 认证,包括健康检查端点(如/v2/根路径);Nginx 中不要遗漏location = /v2/ { auth_basic ... } - 避免使用
read-only-auth示例中的宽松匹配,例如不要写location /v2/ { ... }却漏掉location = /v2,防止根路径绕过
添加网络层访问控制
从源头减少扫描流量到达 Registry 的机会:
- 在防火墙或云安全组中,仅放行可信 IP 段(如 CI/CD 构建节点、K8s 集群 CIDR、运维跳板机)访问 Registry 端口(如 5000 或 443)
- 若使用 Nginx,可配合
limit_req限制单 IP 请求频率,例如每分钟最多 5 次非 pull/push 请求,防暴力试探 - 不对外暴露 Registry 的管理端口(如
http.debug或 Prometheus metrics 端点),这些常被扫描器用于服务识别











