docker 公司开源了registry 后,并没有开源认证服务 (他家有个产品叫 docker trust registry, 但是需要购买 license 才可以用)
docker 公司发布了registry 的版本 v2 (docker distribution) 后,以前在 v1 的认证方案都不再有效。v2 的认证服务器的解决方案就需要各位自己定制了。
具体原理在这里:
https://github.com/docker/dist … en.md
- 客户端尝试 推(docker push)/拉 (docker pull)操作。
- 如果registry服务器需要授权,它会返回一个“401” 未经授权的HTTP响应。
- 客户端向授权服务器发出请求。
- 授权服务器返回一个令牌,赋予客户端的授权访问。
- 客户端将令牌放入请求 的header 里,重新发出请求。
- 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 下的认证服务。
支持的认证方式
- 在 docker auth 里直接添加用户
- Google Sign-In
- LDAP (openldap)
- 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” 及其密码加入即可。
评论前必须登录!
注册