Distribution Auth Type

August 05, 2022

Distribution 是一个按照 OCI 的规范实现的一个制品库管理工具,它提供了三种的认证方式,htpasswdsillytoken,在 Distribution 项目中采用的是策略模式。

它的认证流程如下图所示:

auth

htpasswd

htpasswd 是一种在系统中,它包含一个 htpasswd 的文件(文件内容是初始的用户名docker,以及一个使用特定算法随机生成的密码)以及如何解析这个文件的算法(目前只能使用 bcrypt 加密算法)。

配置格式如下:

auth:
  htpasswd:
    realm: harbor-registry-basic-realm
    path: /etc/registry/passwd
  1. 启动过程中会校验 path 对应的文件是否存在,如果不存在,就创建并写入内容,内容为用户:docker, 密码为随机生成并加密存储。

  2. 用户在请求过程中,每个请求都会进入配置好的访问控制器中,进行权限验证。

  3. 会首先判断 Header 中是否存在 Authorization 字段值,并正确解析;如果不存在,则认为无效认证。

  4. 如果存在用户密码则会和文件中写入的内容进行对比,确保是一致的(提示:在对比之前系统会先校验这个文件是否被修改过,如果被修改过就会从新生成文件内容)。

silly

这个主要是用于测试的,是简单功能的实现;它主要是检查 Header 中是否存在 Authorization 并且值非空,如果是就进行授权通过。

token

auth

auth:
  token:
    realm: https://localhost:5011/auth
    service: Authentication
    issuer: Sample Issuer
    rootCertBundle: /mnt/local/certs/RootCA.crt

token 认证需要借助外部认证服务,可以实现资源、权限的管理,distribution 的响应的时候会返回给用户 scope 就是资源权限

  1. 启动过程会校验 token 配置的参数是否正确,并且校验 tls 证书。
  2. 用户请求时,会从 Header 中获取认证信息,如果没有认证,则会根据是否配置 autoRedirect 以及重定向地址 realm
  3. distribution 会返回 401 的请求,并携带WWW-Authenticate 告诉客户端改如何向认证服务进行认证。

如:一个未授权的用户正在 Push镜像到 samalba/my-app repoName 中,就会返回

  • scope: 授权范围
  • service: 授权服务
  • realm: 认证服务
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push"
Date: Thu, 10 Sep 2015 19:32:31 GMT
Content-Length: 235
Strict-Transport-Security: max-age=31536000

{"errors":[{"code":"UNAUTHORIZED","message":"access to the requested resource is not authorized","detail":[{"Type":"repository","Name":"samalba/my-app","Action":"pull"},{"Type":"repository","Name":"samalba/my-app","Action":"push"}]}]}
  1. 如果开启自动重定向,则请求的就是 distribution host 的接口:https://%s/auth/token,没有则走用户配置realm

LRF 记录学习、生活的点滴