harbor https镜像仓库安装及原理概述

harbor https镜像仓库一键安装及原理概述(基于官网2023年架构)

1、简介

Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。
它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

2、harbor的优势

harbor安装特别方便,且不需要手动安装docker registry,harbor提供的docker-compose.yml包括了镜像仓库需要的各个组建,完全可以做到一键式启动。其优势主要包括如下十点:

1) 基于角色的访问控制:

用户与Docker镜像仓库通过“项目”进行项目管理,可以对不同的账户设置不同的权限,以实现权限的精细管控。

2)镜像复制

镜像可以在多个Registry实例中复制(同步),支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题,只要往一台Harbor上发布,镜像就会像“仙女散花”般地同步到多个Registry中,高效可靠。

3)图形化用户界面

用户可以通过浏览器来浏览,管理当前Docker镜像仓库,管理项目和镜像等。

4)AD/LDAP 支持

Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。

5)OIDC支持(OpenID Connect)
6)审计管理

所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

7)RESTful API

提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。同时提供Swagger UI ,方便使用和测试。

8)漏洞扫描

可以根据策略对镜像进行漏洞扫描。

9)镜像删除及垃圾回收

系统管理员可以运行垃圾回收job,删除玄虚镜像及未被引用的空间。

10)部署方便

可以通过Docker compose、Helm Chart等方式进行部署。

3、harbor组件简介

harbor的整体架构还是很清晰的,下面简单介绍一下架构图

在这里插入图片描述

3.1数据层

数据层根据场景的需求,分为key-value存储、数据存储、数据库。

key-value存储:采用Redis进行数据缓存并存储job信息。
data storage:采用多种形式的data storage进行image、chart的存储。
数据库:projects, users, roles, replication policies等信息存储在PostgreSQL数据库中。
3.2 Proxy

基于nginx实现的harbor反向代理组件,用于接受客户端请求,代理会转发harbor core,、registry、 web portal、 token services等服务。

3.3 Core

提供API Server、Config Manager、Project Management、Quota Manager、Chart Controller、Scan Manager(漏洞扫描,支持Trivy、Anchore Engine、Clair、DoSec Scanner)等服务。

3.4 Job Service

提供job执行的service,供其他程序方便的异步执行job。

3.5 GC Controller

控制GC任务。

3.6 Log collector

从其他模块中进行日志收集,收集到一个单独的空间下。

3.7 Docker Registry

镜像管理服务,提供存储Docker镜像,并支持docker的push/pull命令。

4、harbor安装

本文是作者根据官网地址,并根据自己实践编写,官方安装地址详见:https://goharbor.io/docs/2.8.0/install-config/configure-https/

4.1 安装包下载

本文是基于harbor-offline-installer-v2.8.3.tgz安装包进行实践,下载地址:
https://github.com/goharbor/harbor/releases/download/v2.8.3/harbor-offline-installer-v2.8.3.tgz

4.2 HTTPS环境配置

在生产环境中,如果需要harbor支持HTTPS功能的话,需要申请HTTPS证书,本文以自签名HTTPS证书作为演示。

4.2.1 制作CA根证书

因为是自签名的证书,所以需要我们自己制作根证书。制作根证书分为两步:

第一步为生成私钥key(生成4096位 RSA私钥),CA结构签发的每一个证书都要通过自己的私钥进行签名

openssl genrsa -out ca.key 4096

第二步为根据私钥key生成CA证书

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=alibaba/OU=TSC/CN=harbor.tsc.alibaba.com" \
 -key ca.key \
 -out ca.crt

x509:表示生成自签证书

其中生成的ca.crt为自签名的根证书,包含了 CA 的公钥。

4.2.2 生成服务端证书的步骤与原理

要理解创建证书的每一步操作必须要先理解创建证书的流程和每一步的含义。生成证书的标准流程是这样的:

生成自己的私钥文件(.key) ----> 基于私钥生成证书请求文件(.csr) ---->CA证书根据“证书请求文件”签发证书 ----> 用户拿到签发后的证书,可能需要导入到自己的密钥库中,如Java的keystore,或根据需要再进行各种格式转换(.pem .p12 .jks等等)

补充:CA证书根据“证书请求文件”签发证书 的流程:

将证书请求文件(.csr)提交给证书颁发机构(CA),CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)

4.2.3 生成服务端证书
a)第一步为生成私钥key

openssl genrsa -out harbor.tsc.alibaba.com.key 4096

b)第二步为根据私钥,生成请求文件

openssl req -sha512 -new
-subj “/C=CN/ST=Shanghai/L=Shanghai/O=alibaba/OU=TSC/CN=harbor.tsc.alibaba.com”
-key harbor.tsc.alibaba.com.key
-out harbor.tsc.alibaba.com.csr

-sha512:指定对创建请求时提供的申请者信息进行数字签名时的单向加密算法,如-md5/-sha1/-sha512等。

c)第三步为生成x509 v3的扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.tsc.alibaba.com
DNS.2=harbor.tsc.alibaba
DNS.3=harbor.tsc.alibaba
EOF

指定签名时包含要添加到证书中的扩展项的文件。其中keyUsage表示密钥用法:可用于签名(digitalSignature、nonRepudiation)及加密(keyEncipherment、 dataEncipherment)

备注:中国的国密证书的签名和加密功能是有2张证书,通过“密钥用法(KeyUsage)”来进行区分是加密证书还是签名证书;而国际上签名和加密证书为同一个证书。

d)第四步使用v3.ext + ca.crt + ca.key + 证书请求文件生成服务端证书(harbor.tsc.alibaba.com.crt)
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in harbor.tsc.alibaba.com.csr \
    -out harbor.tsc.alibaba.com.crt
x509:签发X.509格式证书命令
-req:产生证书签发申请命令
-CAcreateserial:表示若不存在serial number则创建

备注:CA证书签名原理

获取明文信息----->对明文进行HASH得到摘要----->用CA机构自己的私钥对摘要加密得到签名

详情:根据“证书请求文件”获取域名、申请证书的机构、扩展信息、申请者公钥、证书的有效期、签发机构CA等明文信息,使用sha512等HASH算法对明文信息进行加密;最后使用CA的私钥进行加密得到签名。
4.2.4 Harbor的证书配置

把证书(harbor.tsc.alibaba.com.crt)、私钥(harbor.tsc.alibaba.com.key)copy到Harbor所在机器的/data/cert/目录

/data/cert/
├── harbor.tsc.alibaba.com.crt
└── harbor.tsc.alibaba.com.key
4.2.5 Docker的证书配置

如果不配置Docker证书的话,从harbor仓库总pull或push镜像的话,会报x509: certificate signed by unknown authority。解决方式有两种,如下。

方式一:

Docker会读取/etc/docker/certs.d/yourdomain.com/下的文件,以.crt 结尾的文件作为CA证书,以.cer结尾的文件为client证书,接下来需要把crt文件转换为cer格式的文件。

openssl x509 -inform PEM -in harbor.tsc.alibaba.com.crt -out harbor.tsc.alibaba.com.cert

拷贝CA证书、服务器cert证书、服务器私钥文件key到/etc/docker/certs.d/yourdomain.com/目录下

/etc/docker/certs.d/
└── harbor.tsc.alibaba.com
    ├── ca.crt
    ├── harbor.tsc.alibaba.com.cert
    └── harbor.tsc.alibaba.com.key

备注:Harbor的proxy组件默认端口为443,如果是其他端口(例如8443),需要修改harbor.tsc.alibaba.com为harbor.tsc.alibaba.com:8443

方式二 :

修改daemon.json文件,使docker不验证该地址的证书:

vim /etc/docker/daemon.json
{
  "insecure-registries": [
  "10.2.3.16:5000",
  "harbor.tsc.alibaba.com"
  ]
}

mac电脑修改docker的方式:preferences->Docker Engine修改配置文件

{
  "insecure-registries": [
    "10.2.3.16:5000",
    "harbor.tsc.alibaba.com"
  ]
}
4.2.6 修改/etc/hosts文件

因为无法通过DNS进行域名解析,所以修改host文件进行域名->IP的映射。

10.2.3.16 harbor.tsc.alibaba.com

4.2.7 Docker重启

systemctl restart docker

4.2.8 配置Harbor支持HTTPS
执行./prepare

执行./prepare后,会进行环境准备,生成运行Harbor所需要的文件,包括harbor.yml、docker-compose.yml等重要文件。

修改harbor.yml文件

配置hostname、https端口及nginx使用的证书的位置、harbor的admin用户的密码等信息。

hostname: harbor.tsc.alibaba.com
https:
  port: 443
  certificate: /data/cert/harbor.tsc.alibaba.com.crt
  private_key: /data/cert/harbor.tsc.alibaba.com.key
harbor_admin_password: Harbor12345
修改docker-compose.yml文件

如果docker-compose.yml文件定义生成的镜像名字在docker中已经被使用,可以修改container_name;如果ports被占用,可以修改对外暴露的端口。

4.2.9 Harbor的启动&停止

重启

docker-compose up -d

停止

docker-compose down -v

备注:因为数据都映射到本地磁盘,所以无需担心数据丢失。

5、Harbor的使用

Harbor的使用主要包括:一、Harbor页面操作;二、docker从Harbor拉取和提交镜像。

5.1 Harbor页面

在浏览器输入https://harbor.tsc.alibaba.com 进行访问(如果没有配置DNS,需要手动修改host映射IP到域名)。

5.2 docker从Harbor拉取和提交镜像

在使用docker操作时,需要确保进行Docker的证书配置或者设置了daemon.json。

5.2.1 docker login到Harbor仓库

如果Harbor的仓库不是公开的,则访问仓库的时候需要进行权限认证。

docker login -u admin -p Harbor12345 harbor.tsc.alibaba.com

docker login -u admin -p Harbor12345 harbor.tsc.alibaba.com:443

5.2.2 拉取镜像

docker pull harbor.tsc.alibaba.com/tsc/gmjdk:8u382

5.2.3 push镜像

harbor仓库有项目的概念,所以打tag的时候需要为镜像设置下归属哪个项目(本例子设置为tsc)。

第一步:为镜像增加tag

docker tag gmjdk:8u382 harbor.tsc.alibaba.com/tsc/gmjdk:8u382

第二步:push镜像

docker push harbor.tsc.alibaba.com/tsc/gmjdk:8u382

6、为Harbor添加额外功能

6.1 漏洞扫描

Trivy(推荐):https://github.com/aquasecurity/trivy

Anchore Engine:https://github.com/anchore/anchore-engine (代码已经不维护了,改为使用Syft、 Grype)

Clair:https://github.com/goharbor/harbor-scanner-clair

DoSec Scanner:https://github.com/dosec-cn/harbor-scanner

6.2 高可用

可以通过helm把Harbor部署在Kubernetes上,使用PostgreSQL、Redis集群存储应用数据,使用PVCs or object storage来存储镜像和charts,来保证服务的高可用。
avatar

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值