harbo的认证原理说明
harbor组件说明
- proxy: nginx-photon
harbor的代理服务,核心的组件是nginx。它接收http和https的请求,将它转发给不同的服务。对应的docker镜像为:goharbor/nginx-photon:v1.8.1
- registry
负责docker的镜像存储,处理pull和push命令。针对认证的话,不同用于对dockerimage有不同的读写权限。register会指向token服务,强制用户每次请求都需要携带合法的token,registry再对公钥解密验证。,registry-photon
- core server:harbor-core
UI:提供图像界面帮助用户管理镜像
webhook:帮助harbor获取registry状态。然后harbor通过webhook更新日志,处理同步和其他功能 goharbor/harbor-registryctl:v1.8.1
token service:负责处理docker push/pull请求中的token相关处理。如果没有token,registry会把请求转发到token server上面。
database: 存储项目信息,用户,角色,复制策略和镜像信息。数据库为PostgreSQL。另外镜像为redis-photon,harbor-db
- job serrvices
复制处理镜像复制。harbor-jobservice
- log collector
负责采集log harbor-log
docker的认证流程
a,proxy容器接收到client请求。nginx转发规则到registry容器
b,registry容器基于token验证,所以他返回一个401的error并且告诉docker客户端访问harbor中的url。这个url指向core service中的token service
c,当dockerclient接收到errorcode后,它封装username和password到http包头中,然后发送http请求到token server
d,proxy请求接收请求后,将它转发到token服务中,对认证信息进行解封。
e,解封得到用户和密码后,token服务检查数据库。当认证配置了LDAP/AD认证的话,他会通过额外的LDAP认证。通过认证后,返回一个私有的key
验证
env
role | ip |
---|---|
harbor | 0.0.7.73 |
nginx-proxy | 10.0.7.68 |
docker | 10.0.7.78 |
实施
在docker的机器上面开启抓包
tcpdump -w /tmp/abc.log
在docker上面进行操作
#docker login xxxx
#docker pull xxxx
#docker push xxxx
然后对抓包进行分析。 第一步,访问10.0.7.68/v2,返回401,然后查看返回的response。发现返回的www-authenticate中有一个bearer realm的url"http://10.0.7.73/service/token 查看返回的http包头
第二步,访问10.0.7.73的service/token。可以看到中间有一个http-head: Authorization: Basic xxxxxxxxxxxx
第三步,查看该request的回复。有一个包含了token的对象。
第四步,发送具体的业务请求到10.0.7.68。然后再查看head,其中有一个Authorezation: Bearer xxxxx的包头。这里bearer后面即为前面的返回的token
扩展说明
1,realm的配置url
具体的配置在harbor.yml的文件中的hostname拼接而成的。
在安装过程中,会采用该hostname生成相关registory的配置
[root@liran-test-2.novalocal 14:26 ~/harbor/common/config/registry]
# ls
config.yml root.crt
[root@liran-test-2.novalocal 14:26 ~/harbor/common/config/registry]
# cat config.yml
version: 0.1
log:
level: info
fields:
service: registry
storage:
cache:
layerinfo: redis
filesystem:
rootdirectory: /storage
maintenance:
uploadpurging:
enabled: false
delete:
enabled: true
redis:
addr: redis:6379
password:
db: 1
http:
addr: :5000
secret: placeholder
debug:
addr: localhost:5001
auth:
token:
issuer: harbor-token-issuer
realm: http://10.0.7.73/service/token
rootcertbundle: /etc/registry/root.crt
service: harbor-registry
validation:
disabled: true
notifications:
endpoints:
- name: harbor
disabled: false
url: http://core:8080/service/notifications
timeout: 3000ms
threshold: 5
backoff: 1s
compatibility:
schema1:
enabled: true
2,Authorization: Basic的值 该值生成是由docker login登录后,记录到~/.docker下面的config.json文件中的
[root@liran-test-2.novalocal 14:27 ~/harbor/common/config/registry]
# cat /root/.docker/config.json
{
"auths": {
"10.0.7.73": {
"auth": "YWRtaW46SGFyYm9xxxxIzNDU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.6 (linux)"
}
}
3,调用说明 上述过程中,一共几次调用,docker客户端需要分别调用nginx代理和harbor的token服务。其中,nginx用来处理pull相关业务。harbor业务用来获取token。