docker registry v2 认证服务器

docker 公司开源了registry 后,并没有开源认证服务 (他家有个产品叫 docker trust registry, 但是需要购买 license 才可以用)

docker 公司发布了registry 的版本 v2 (docker distribution) 后,以前在 v1 的认证方案都不再有效。v2 的认证服务器的解决方案就需要各位自己定制了。

具体原理在这里:

https://github.com/docker/dist … en.md

  1. 客户端尝试 推(docker push)/拉 (docker pull)操作。
  2. 如果registry服务器需要授权,它会返回一个“401” 未经授权的HTTP响应。
  3. 客户端向授权服务器发出请求。
  4. 授权服务器返回一个令牌,赋予客户端的授权访问。
  5. 客户端将令牌放入请求 的header 里,重新发出请求。
  6. registory 服务器验证令牌,镜像(images)的推/拉 照常进行。

拿来主义

原理讲好了,不建议对这个认证过程重头做起。 开源世界里,已经有人写了代码,我们拿来即可。

docker authentication 的开源代码在这里:

https://github.com/cesanta/docker_auth

如果你的后台认证服务是 openldap,基本上不用看它的具体代码, 你只需要去用另一个开源代码库即可:

https://github.com/kwk/docker-registry-setup

在这个代码库里,作者用 docker compose 做了三个服务: docker registry, docker authentication 和 openldap,README 有很详细的解释。 你可以直接在你自己的机器上运行 docker-compose up -d ,即可尝试registry 下的认证服务。

支持的认证方式

  1. 在 docker auth 里直接添加用户
  2. Google Sign-In
  3. LDAP (openldap)
  4. MongoDB user collection

这些方式是不重叠的,可以同时支持。 我只用了 1 和 3

具体实施

我在实施环境里,另外添加了均衡负载, 整个流程就成这样了:

docker daemon –> (https:443) ELB-1 (http:5000)–> docker-registry –> (https:443) ELB-2 (http:5001)–> docker_auth –> (tcp:389/636) ELB-3 (tcp:389/636) –> openldap

网络访问在均衡负载服务上被 ssl offloading 了。在连openldap之前,会先查一下,是否有docker auth 的静态用户账号。

因为后台连的是openldap ,docker_auth 服务是可以支持自动伸缩 (auto scaling) 的。

Docker registry 的对应配置:

auth:
token:
realm: "https://[docker_auth_server]:5001/auth"
service: "my.docker.registry"
issuer: "Acme auth server"
rootcertbundle: /certs/auth.crt

用户授权。

先登录:

docker login [private-registry]:5000

暂时不能对组用户直接授权。 但是支持 一定程度的ACL (access control list) 正则表达。

1)docker_auth 自己授权用户。 这个非常实用,用于自动化服务的 robot 账号,以及后台ldap 服务器有问题的时候,你可能会需要这个用户。

(密码是用 htpasswd -B [user_account] 产生的)

# Password is specified as a BCrypt hash. Use htpasswd -B to generate.
users:
"admin":
password: "$2y$05$LO.vzwpWC5LZGqThvEfznu8qhb5SGqvBSWY1J3yZ4AxtMRZ3kN5jC"  # badmin
"test":
password: "$2y$05$WuwBasGDAgr.QCbGIjKJaep4dhxeai9gNZdmBnQXqpKly57oNutya"  # 123

2) ACL 控制, 这个可以定制,谁有pull 的权限,谁有push 的权限。

acl:
# Admin 有全部的权限
- match: {account: "admin"}
actions: ["*"]
# User "test" 只有 pull 的权限,没有push的权限
- match: {account: "test"}
actions: ["pull"]
# All logged in users can pull all images.
- match: {account: "/.+/"}
actions: ["pull"]
# Access is denied by default.

后续工作

因为用了docker registory 的认证服务, 所有的相关自动化环境要作出相应的改变。 比如如果你以前用 jenkins/bamboo 自动触发 build/push 镜像的话,那么你就需要前面提到的robot 账号了。

如果用的是rancher server, 那么在 添加私有registry 服务器的时候,用前面提到的只读账号 “test” 及其密码加入即可。

分享到:更多 ()