harbor简介
Harbor Registry(又称 Harbor 云原生制品仓库或 Harbor 镜像仓库)由 VMware 公司中国研发中心云原生实验室原创,并于 2016 年 3 月开源。Harbor 在 Docker Distribution的基础上增加了企业用户必需的权限控制、镜像签名、安全漏洞扫描和远程复制等重要功能,还提供了图形管理界面及面向国内用户的中文支持,开源后迅速在中国开发者和用户社区流行,成为中国云原生用户的主流容器镜像仓库。
Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。
- Project Harbor 是一个开源的受信任的云原生注册表项目,用于存储、签名和扫描上下文。
- Harbor 通过添加用户通常需要的功能(如安全性、身份和管理)来扩展开源 Docker 发行版。
- Harbor 支持用户管理、访问控制、活动监控、实例间复制等高级功能。
harbor的功能
- 云原生注册表:支持容器镜像和Helm图表,Harbor 充当云原生环境(如容器运行时和编排平台)的注册表。
- 基于角色的访问控制:用户通过“项目”访问不同的存储库,用户可以对项目下的图像或 Helm 图表具有不同的权限。
- 基于策略的复制:可以使用过滤器(存储库、标签和标签)基于策略在多个注册表实例之间复制(同步)图像和图表。如果遇到任何错误,Harbor 会自动重试复制。这可用于辅助负载平衡、实现高可用性以及促进混合和多云场景中的多数据中心部署。
- 漏洞扫描:Harbor 定期扫描映像以查找漏洞,并进行策略检查以防止部署易受攻击的映像。
- LDAP/AD 支持:Harbor 与现有的企业 LDAP/AD 集成以进行用户身份验证和管理,并支持将 LDAP 组导入 Harbor,然后可以授予特定项目的权限。
- OIDC 支持:Harbor 利用 OpenID Connect (OIDC) 来验证由外部授权服务器或身份提供者认证的用户的身份。可以启用单点登录以登录到 Harbor 门户。
- 图像删除和垃圾收集:系统管理员可以运行垃圾收集作业,以便可以删除图像(悬空清单和未引用的 blob)并定期释放它们的空间。
- Notary:支持使用 Docker Content Trust(利用 Notary)对容器镜像进行签名,以保证真实性和出处。此外,还可以激活防止部署未签名映像的策略。
- 图形用户门户:用户可以轻松浏览、搜索存储库和管理项目。
- 审计:通过日志跟踪对存储库的所有操作。
- RESTful API:提供 RESTful API 是为了方便管理操作,并且易于用于与外部系统集成。嵌入式 Swagger UI 可用于探索和测试 API。
- 易于部署:Harbor 可以通过 Docker compose 以及 Helm Chart 进行部署,最近还添加了一个 Harbor Operator。
安装条件及方式
系统要求:
在 Linux 主机上: docker 17.06.0-ce+ 和 docker-compose 1.18.0+ 。
您可以从 官方发布页面下载 Harbor 安装程序。下载在线安装程序或离线安装程序。
- 在线安装程序:在线安装程序从 Docker 中心下载 Harbor 镜像。因此,安装程序的尺寸非常小。
- 离线安装程序:如果要部署 Harbor 的主机没有连接到 Internet,请使用离线安装程序。离线安装程序包含预先构建的镜像,因此它比在线安装程序大。
在线和离线安装程序的安装过程几乎相同。
下载并解压安装程序
转到 Harbor 发布页面。
-
下载您要安装的版本的在线或离线安装程序。
mkdir -p /usr/local/service && cd /usr/local/service
wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
-
(可选--跳过也无妨)下载相应
*.asc
文件以验证包是否为正版。该
*.asc
文件是一个 OpenPGP 密钥文件。执行以下步骤以验证下载的捆绑包是否为正版。-
获取文件的公钥
*.asc
。gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115C
你应该看到消息
public key "Harbor-sign (The key for signing Harbor build) <jiangd@vmware.com>" imported
-
通过运行以下命令之一来验证软件包是否为正版。
-
在线安装程序:
gpg -v --keyserver hkps://keyserver.ubuntu.com --verify harbor-online-installer-version.tgz.asc
-
离线安装程序:
gpg -v --keyserver hkps://keyserver.ubuntu.com --verify harbor-offline-installer-version.tgz.asc
该
gpg
命令验证捆绑包的签名是否与*.asc
密钥文件的签名匹配。您应该看到签名正确的确认。gpg: armor header: Version: GnuPG v1 gpg: assuming signed data in 'harbor-online-installer-v2.0.2.tgz' gpg: Signature made Tue Jul 28 09:49:20 2020 UTC gpg: using RSA key 644FF454C0B4115C gpg: using pgp trust model gpg: Good signature from "Harbor-sign (The key for signing Harbor build) <jiangd@vmware.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 7722 D168 DAEC 4578 06C9 6FF9 644F F454 C0B4 115C gpg: binary signature, digest algorithm SHA1, key algorithm rsa4096
-
-
-
用于
tar
解压安装包:-
在线安装程序:
tar xzvf harbor-online-installer-v2.5.0.tgz
-
离线安装程序:
tar xzvf harbor-offline-installer-v2.5.0.tgz
-
配置HTTPS访问 (http访问可以跳过)
默认情况下,Harbor 不附带证书。可以在没有安全性的情况下部署 Harbor,以便您可以通过 HTTP 连接到它。但是,只有在没有连接到外部 Internet 的气隙测试或开发环境中才能使用 HTTP。在非气隙环境中使用 HTTP 会使您面临中间人攻击。在生产环境中,始终使用 HTTPS。如果您启用 Content Trust with Notary 以正确签署所有图像,则必须使用 HTTPS。
要配置 HTTPS,您必须创建 SSL 证书。您可以使用由受信任的第三方 CA 签名的证书,也可以使用自签名证书。本节介绍如何使用 OpenSSL创建 CA,以及如何使用您的 CA 签署服务器证书和客户端证书。您可以使用其他 CA 提供程序,例如 Let's Encrypt。
下面的过程假设您的 Harbor 注册中心的主机名是harbor.xxxx.com
,并且它的 DNS 记录指向您正在运行 Harbor 的主机。
生成证书颁发机构证书
在生产环境中,您应该从 CA 获得证书。在测试或开发环境中,您可以生成自己的 CA。要生成 CA 证书,请运行以下命令。
-
生成 CA 证书私钥。
# 创建文件夹 放置新创建的ca证书及生成的服务器认证key和cert mkdir cert && cd cert openssl genrsa -out ca.key 4096
-
生成 CA 证书。
调整
-subj
选项中的值以反映您的组织。如果您使用 FQDN 连接您的 Harbor 主机,则必须将其指定为公用名 (CN
) 属性。openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.xxxx.com" \ -key ca.key \ -out ca.crt
生成服务器证书
证书通常包含一个.crt
文件和一个.key
文件,例如,harbor.xxxx.com.crt
和harbor.xxxx.com.key
.
-
生成私钥。
openssl genrsa -out harbor.xxxx.com.key 4096
-
生成证书签名请求 (CSR)。
调整
-subj
选项中的值以反映您的组织。如果您使用 FQDN 连接您的 Harbor 主机,则必须将其指定为公用名称 (CN
) 属性并在密钥和 CSR 文件名中使用它。openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.xxxx.com" \ -key harbor.xxxx.com.key \ -out harbor.xxxx.com.csr
-
生成 x509 v3 扩展文件。
无论您是使用 FQDN 还是 IP 地址连接到您的 Harbor 主机,您都必须创建此文件,以便为您的 Harbor 主机生成符合主题备用名称 (SAN) 和 x509 v3 的证书扩展要求。替换
DNS
条目以反映您的域。cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names # subjectAltName = IP:192.168.159.132 # EOF [alt_names] DNS.1=harbor.xxxx.com DNS.2=harbor.xxxx DNS.3=center-test EOF
-
使用该
v3.ext
文件为您的 Harbor 主机生成证书。将
yourdomain.com
CRS 和 CRT 文件名中的 替换为 Harbor 主机名。openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in harbor.xxxx.com.csr \ -out harbor.xxxx.com.crt
向 Harbor 和 Docker 提供证书
生成ca.crt
,harbor.xxxx.com.crt
和harbor.xxxx.com.key
必须将它们提供给 Harbor 和 Docker,并重新配置 Harbor 以使用它们。
-
将服务器证书和密钥复制到 Harbor 主机上的 certficates 文件夹中。
cp harbor.xxxx.com.crt /data/cert/ cp harbor.xxxx.com.key /data/cert/
-
转换
harbor.xxxx.com.crt
为harbor.xxxx.com.cert
, 供 Docker 使用。Docker 守护进程将
.crt
文件解释为 CA 证书,将.cert
文件解释为客户端证书。openssl x509 -inform PEM -in harbor.xxxx.com.crt -out harbor.xxxx.com.cert
-
将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中。您必须先创建适当的文件夹。
mkdir -p /etc/docker/certs.d/harbor.xxxx.com:8843 cp harbor.xxxx.com.cert /etc/docker/certs.d/harbor.xxxx.com:8843/ cp harbor.xxxx.com.key /etc/docker/certs.d/harbor.xxxx.com:8843/ cp ca.crt /etc/docker/certs.d/harbor.xxxx.com:8843/
如果您将默认
nginx
端口 443 映射到不同的端口,请创建文件夹/etc/docker/certs.d/harbor.xxxx.com:8843
或/etc/docker/certs.d/harbor_IP:8843
.如果是云服务,8843端口需要加入安全组
-
重启 Docker 引擎。
systemctl reload-daemon systemctl restart docker
以下示例说明了使用自定义证书的配置。
/etc/docker/certs.d/
└── harbor.xxxx.com:8843
├── harbor.xxxx.com.cert <-- Server certificate signed by CA
├── harbor.xxxx.com.key <-- Server key signed by CA
└── ca.crt <-- Certificate authority that signed the registry certificate
部署或重新配置 Harbor
-
如果您尚未部署 Harbor,配置
harbor.yml
。# 配置harbor配置文件 cd ../harbor/ cp harbor.yml.tmpl harbor.yml # 编辑配置文件,给出几个重要的选项 vim harbor.yml hostname: harbor.xxxx.com http: port: 8080 https: port: 8843 certificate: /data/cert/harbor.xxxx.com.crt private_key: /data/cert/harbor.xxxx.com.key harbor_admin_password: Harborxxxx ./install.sh
-
如果您已经使用 HTTP 部署了 Harbor,并希望将其重新配置为使用 HTTPS,请执行以下步骤。
-
运行
prepare
脚本以启用 HTTPS。Harbor 使用
nginx
实例作为所有的反向代理。您使用prepare
脚本配置nginx
为使用 HTTPS。位于Harbor 安装程序包中,与脚本prepare
处于同一级别。install.sh
./prepare
-
如果 Harbor 正在运行,请停止并删除现有实例。
您的图像数据保留在文件系统中,因此不会丢失任何数据。
docker-compose down -v
-
重启harbor:
docker-compose up -d
-
- docker-compose down -v 或 docker-compose stop //区别,前者会remove掉容器、image、网络,停的更干净,后者只是停服务
- docker-compose up -d
验证 HTTPS 连接
为 Harbor 设置 HTTPS 后,您可以通过执行以下步骤来验证 HTTPS 连接。
-
打开浏览器并输入https://harbor.xxxx.com。它应该显示 Harbor 界面。
某些浏览器可能会显示一条警告,指出证书颁发机构 (CA) 未知。当使用不是来自受信任的第三方 CA 的自签名 CA 时,会发生这种情况。您可以将 CA 导入浏览器以删除警告。
在运行 Docker 守护程序的机器上,检查
/etc/docker/daemon.json
文件以确保-insecure-registry
设置为https://harbor.xxxx.com选项。-
从 Docker 客户端登录到 Harbor。
docker login harbor.xxxx.com
如果您已将
nginx
443 端口映射到其他端口,请在login
命令中添加该端口。docker login harbor.xxxx.com:8843