Docker Registry v2 + Token Auth Server (Registry v2 认证)实例。

关于Registry

对于registry v1 --> v2中,其中的原理、优化等,这里不再做一一介绍。这里有篇文章我瞄过几眼应该是比较不错的介绍文章了:http://dockone.io/article/747 。

Registry v2 token机制

官方document:https://docs.docker.com/registry/spec/auth/token/

目前docker registry v2 认证分为以下6个步骤:

1. docker client 尝试到registry中进行push/pull操作;
2. registry会返回401未认证信息给client(未认证的前提下),同时返回的信息中还包含了到哪里去认证的信息;
3. client发送认证请求到认证服务器(authorization service);
4. 认证服务器(authorization service)返回token;
5. client携带这附有token的请求,尝试请求registry;
6. registry接受了认证的token并且使得client继续操作;

然后我们来详细分解、讨论下以上的6个步骤

Step #1 , Client 向registry 发起连接

通常,Docker Client在进行pull/push操作时,会先尝试连接docker registry。
Note: 当你访问远程的registry时,会用到tls验证域名的有效性(证书),否则会出现如下错误:

FATA[0000] Error response from daemon: v1 ping attempt failed with error:
Get https://registry.example.com/v1/_ping: tls: oversized record received with length 20527. 
If this private registry supports only HTTP or HTTPS with an unknown CA certificate,please add 
`--insecure-registry registry.example.com` to the daemon‘s arguments.
In the case of HTTPS, if you have access to the registry‘s CA certificate, no need for the flag;
simply place the CA certificate at /etc/docker/certs.d/registry.example.com/ca.crt

在docker的启动中加入下面的命令,来忽略对registry域名证书的审核:

--insecure-registry registry.example.com

Step #2 , 未认证响应(Unauthorized response)

Registry server会返回401并且会附带Authentication endpoint:

$ curl https://registry.example.com/v2 -k -IL
HTTP/1.1 301 Moved Permanently
Server: nginx/1.4.7
Date: Sun, 22 Nov 2015 09:01:42 GMT
Content-Type: text/plain; charset=utf-8
Connection: keep-alive
Docker-Distribution-Api-Version: registry/2.0
Location: /v2/

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Sun, 22 Nov 2015 09:01:42 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 87
Connection: keep-alive
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm="https://registry.example.com:5001/auth",service="Docker registry"
X-Content-Type-Options: nosniff

Authentication server返回的头信息中包含了如何去或许token,它有几个重要的查询参数:

realm: #### 描述了认证的enpoint。

realm="https://registry.example.com:5001/auth"

service: #### 描述了持有资源服务器的名称。

service="Docker registry"

scope: #### 描述了client端操作资源的方法(push/pull)

scope="repository:shuyun/hello:push"

account: #### 描述了操作的账号

account=admin

Step #3&4 , 认证endpoint通讯

这2步描述了client与认证服务2者的验证过程
需要明确的是,你需要知道:client发送请求到认证服务器签署token,请求信息中包含的基本身份验证信息将于服务器中的用户列表做匹配,然后根据请求中的scope要操作的范围、方法进而进行匹配,最后服务器匹配成功后将token进行签名,并且将token返回给客户端。

Step #5&6 , 最后沟通

Client尝试与registry连接(这次带了token信息),registry接到请求后验证token,继而开始pull/push操作。

开始搭建registry v2 与认证服务器

系统环境:Cent OS 7.0
Registry: registry:2.2.0
Auth Server:cesanta/docker_auth ,可以基于本地、LDAP、Google Sign-In。
这里我创建了2个目录结构(他们都是基于/data目录而论的)

auth_server/
├── config
│   └── auth_config.yml
└── ssl
├── server.key
└── server.pem
docker_registry/
└── data/

证书创建过程省略。。。

启动 Auth Server

docker run -d --name docker_auth -p 5001:5001 -v /data/auth_server/config:/config:ro -v /var/log/docker_auth:/logs --restart=always -v /data/auth_server/ssl:/ssl cesanta/docker_auth /config/auth_config.yml

auth_config.yml 内容如下:

server:  # Server settings.
# Address to listen on.
addr: ":5001"
# TLS certificate and key.
certificate: "/ssl/server.pem"
key: "/ssl/server.key"

token:  # Settings for the tokens.
issuer: "Auth Service"  # 需要和 Registry config 匹配。
expiration: 900Static user map.users:
# Password is specified as a BCrypt hash. Use htpasswd -B to generate. Apache版本需要2.4以上
"admin":
password: "xxx"
"hussein":
password: "xxx"
"": {}  # Allow anonymous (no "docker login") access.

acl:
# Admin has full access to everything.
- match: {account: "admin"}
actions: ["*"]
# User "test" has full access to ubuntu image but nothing else.
- match: {account: "hussien", name: "ubuntu"}
actions: ["*"]
- match: {account: "test"}
actions: []
# All logged in users can pull all images.
- match: {account: "/.+/"}
actions: ["pull"]
# Anonymous users can pull "hello-world".
- match: {account: "", name: "hello-world"}
actions: ["pull"]
# Access is denied by default.

更多的配置信息,可以参考他们的github

启动 Registry Server

由于要配置Registry到Auth Server中认证,所以需要设置一些例如"REGISTRY_variable"的环境变量。例如这样:

auth:
token:
issuer: "Auth Service"

需要设置成这样:

REGISTRY_AUTH_TOKEN_ISSUER="Auth Service"

所以配置token认证,需要配置的信息大致如下:

$ docker run -d -p 5000:5000 -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry -e REGISTRY_AUTH=token -e REGISTRY_AUTH_TOKEN_REALM=https://registry.example.com:5001/auth -e REGISTRY_AUTH_TOKEN_SERVICE="Docker registry" -e REGISTRY_AUTH_TOKEN_ISSUER="Auth Service" -e REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/ssl/server.pem -v /root/auth_server/ssl:/ssl -v /root/docker_registry/data:/var/lib/registry --restart=always --name registry registry:2

最后,启动起来,进行相应的调试~过程忽略。

使用 Docker Compose

dockerauth:
image: cesanta/docker_auth
ports:
- "5001:5001"
volumes:
- /data/auth_server/config:/config:ro
- /var/log/docker_auth:/logs
- /data/auth_server/ssl:/ssl
command: /config/auth_config.yml
restart: always

registry:
image: registry:2.2.0
ports:
- "5000:5000"
volumes:
- /data/auth_server/ssl:/ssl
- /data/docker_registry/data:/var/lib/registry
restart: always
environment:
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry
- REGISTRY_AUTH=token
- REGISTRY_AUTH_TOKEN_REALM=https://registry.example.com:5001/auth
- REGISTRY_AUTH_TOKEN_SERVICE="Docker registry"
- REGISTRY_AUTH_TOKEN_ISSUER="Auth Service"
- REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/ssl/server.pem

然后 # docker-compose up 启动
测试过程暂时忽略,markdown格式写真心有点别扭。。

Note:

这款Auth Server是没有UI界面的,暂时我也没有找到很好的UI支撑。
另外有一款搭建在SUSE上的UI+Auth系统,暂时没有测试,附上链接: https://github.com/SUSE/Portus

相关链接:
https://the.binbashtheory.com/ ... vice/
https://hub.docker.com/r/cesanta/docker_auth/
https://github.com/cesanta/docker_auth

时间: 2024-12-14 18:48:33

Docker Registry v2 + Token Auth Server (Registry v2 认证)实例。的相关文章

Docker容器学习梳理--私有仓库Registry使用

但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似.使用私有仓库有许多优点: 1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可: 2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用. 目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1.Registry v2使用Go语言编写

Docker系列10:自建registry(1)

一.registry基础 1.registry的类别 Sponsor Registry:第三方的registry,供用户和社区使用 Mirror Registry:第三方的registry,供用户使用 Vendor Registry:由Docker官方提供的registry Private Registry:私有的registry[如果用的环境是阿里云,那么用阿里云的registry是最好的选择] 2.自建registry有三种方法 方法1:本地安装配置registry 方法2:使用官方提供的r

Docker第七回(私有Registry)

一.Docker Registry的分类 Registry用来保存docker镜像,包括镜像的层次结构和元数据,用户可以自建Registry,也可以使用官方的docker hub Sponsor Registry:第三方的Registry,供客户和docker社区使用 Mirror Registry:第三方的Registry,只让客户使用 Vendor Registry:由发布Docker镜像的供应商提供的Registry Private Registry:通过设有防火墙和额外的安全层的私有实体

Welcome Docker to SUSE Linux Enterprise Server【水平有限,中英对比,求纠错】

  原文:Welcome Docker to SUSE Linux Enterprise Server Lightweight virtualization is a hot topic these days. Also called "operating system-level virtualization," it allows you to run multiple applications or systems on one host without a hypervisor

Welcome Docker to SUSE Linux Enterprise Server【水平有限,中英对照,求纠错】

  原文:Welcome Docker to SUSE Linux Enterprise Server Lightweight virtualization is a hot topic these days. Also called "operating system-level virtualization," it allows you to run multiple applications or systems on one host without a hypervisor

魔兽世界服务器Trinitycore分析三:auth server网络事件的处理

authserver在初始化静态变量时,会调用AuthSession::InitHandlers(),初始化全局的业务哈希表Handlers: std::unordered_map<uint8, AuthHandler> AuthSession::InitHandlers() { std::unordered_map<uint8, AuthHandler> handlers; handlers[AUTH_LOGON_CHALLENGE] = { STATUS_CONNECTED,

魔兽世界服务器Trinitycore分析二:auth server的main函数

TrinityCore由生成两个执行文件authserver和world server以及一堆DLL(或so)文件的子项目组成(先忽略map_extractor等几个工具项目). authserver是登录验证服,它主要提供登录验证和获取服务器(区服)列表的功能.world server是真正的游戏服务器,提供游戏里的一切功能.相对而言,auth server比较简单,那我就从它入手啊,先看一下它的main函数,在源码的基础上,我加上了注释. //该函数在src\server\authserve

Linux Token Auth 一次性密码认证

Linux Token Auth 一次性密码认证 http://netkiller.github.io/journal/token.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 29812080 <[email protected]> Mr. 曾 祥建, Android 手机端开发 中国广东省深圳市南山区 +86 18665871161 <[em

基于token的多平台身份认证架构设计

基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用场景,这些场景: 有不同的环境安全威胁 不同的会话生存周期 不同的用户权限控制体系 不同级别的接口调用方式 综上所述,它们的身份认证方式也存在一定的区别. 本文将使用一定的篇幅对这些场景进行一些分析和梳理工作. 2   使用场景 下面是一些在IT服务常见的一些