harbo的认证原理说明


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。