Distribution Auth Type
· 4 min read
Distribution Auth认证流程介绍
Distribution
是一个按照 OCI
的规范实现的一个制品库管理工具,它提供了三种的认证方式,htpasswd
、silly
、token
,在 Distribution
项目中采用的是策略模式。
它的认证流程如下图所示:
htpasswd
htpasswd
是一种在系统中,它包含一个 htpasswd
的文件(文件内容是初始的用户名docker
,以及一个使用特定算法随机生成的密码)以及如何解析这个文件的算法(目前只能使用 bcrypt
加密算法)。
配置格式如下:
auth:
htpasswd:
realm: harbor-registry-basic-realm
path: /etc/registry/passwd
-
启动过程中会校验
path
对应的文件是否存在,如果不存在,就创建并写入内容,内容为用户:docker
, 密码为随机生成并加密存储。 -
用户在请求过程中,每个请求都会进入配置好的访问控制器中,进行权限验证。
-
会首先判断
Header
中是否存在Authorization
字段值,并正确解析;如果不存在,则认为无效认证。 -
如果存在用户密码则会和文件中写入的内容进行对比,确保是一致的(提示:在对比之前系统会先校验这个文件是否被修改过,如果被修改过就会从新生成文件内容)。
silly
这个主要是用于测试的,是简单功能的实现;它主要是检查 Header
中是否存在 Authorization
并且值非空,如果是就进行授权通过。
token
auth:
token:
realm: https://localhost:5011/auth
service: Authentication
issuer: Sample Issuer
rootCertBundle: /mnt/local/certs/RootCA.crt
token
认证需要借助外部认证服务,可以实现资源、权限的管理,distribution
的响应的时候会返回给用户 scope
就是资源权限
- 启动过程会校验
token
配置的参数是否正确,并且校验tls
证书。 - 用户请求时,会从
Header
中获取认证信息,如果没有认证,则会根据是否配置autoRedirect
以及重定向地址realm
。 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"}]}]}
- 如果开启自动重定向,则请求的就是
distribution
host 的接口:https://%s/auth/token
,没有则走用户配置realm