(本文根据 Harbor 社区经理 Orlin Vasilev 的英文博客改编,感谢 CNCF公众号的初始翻译和 Harbor 维护者团队提供的测试环境。)
经过社区维护者们的通力合作,Harbor v2.5 于上周发布了,新版本为用户们带来了如下几个重要的新特性。
- Cosign 签名的引入,使得制品(镜像等)复制时签名可以同步复制。
- 提高了并发拉取请求的性能。
- 改进了垃圾回收功能的容错性,当删除某个制品(Artifact)发生错误时,可继续删除其他制品。
- 复制中可跳过在代理缓存项目中的制品。
- 激活 Distribtion purging 功能,可以删除 upload 目录中的孤立文件。
- 使用 Golang v1.17.7 构建的。
- 使用 Distribution v2.8.0 和 Trivy v0.22.0。
本篇着重给大家介绍一下的是 Cosign, 它是 Harbor 2.5 重要功能。
在 Harbor 制品(Artifact)仓库中,制品的签名和签名验证是关键的安全功能之一,可帮助用户检查制品的完整性。Harbor 2.5通过与另外两个开源项目Notary[1] 和 Cosign[2] 的集成,支持了内容信任,其中 Cosign 是新增的功能。
Cosign 是一个 OCI 制品签名和验证解决方案,是 Sigstore 开源项目[3] 的一部分。
用 Cosign 对 OCI 制品签名后,可将生成的签名推入(push)到 Harbor 中。这个签名作为制品的附件(accessory)和该制品一起存储。Harbor 管理和维护已签名制品和 cosign 签名之间的联系,在Tag保留规则(tag retention rules)和不可变规则(immutable rules)等功能中,Harbor的内置功能自动维护制品和签名之间的对应关系。
将 Cosign 与 Harbor 结合使用解决了之前一个悬而未决的问题:镜像等制品在远程复制中,其签名信息无法被复制到目标端。现在,当用户通过复制规则(replication rule)把已签名制品复制到远端时,Harbor 把签名信息也同步复制到了远端,使得远端的制品具有同样的签名。
你可以参阅完整文档[5]了解更多。
功能设置示例
两个Harbor v2.5实例缺省对每个仓库项目启用了 Cosign 的设置。通过配置两个Harbor实例的复制规则,我们在两个实例harbor1 和 harbor2中的项目“cosign”之间建立基于推送的复制规则(从harbor1 到 harbor2),使用机器人帐户(robot-account)作为认证身份。
1. 安装两个启用了 cosign(和 notary)Harbor的实例
我们使用Harbor的离线安装程序[6]。
代码语言:javascript复制# ./install.sh --with-notary --with-trivy
[Step 0]: checking if docker is installed ...
...
...
...
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating network "harbor_harbor-notary" with the default driver
Creating network "harbor_notary-sig" with the default driver
Creating harbor-log ... done
Creating harbor-portal ... done
Creating redis ... done
Creating registryctl ... done
Creating registry ... done
Creating harbor-db ... done
Creating trivy-adapter ... done
Creating notary-signer ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating nginx ... done
Creating notary-server ... done
✔ ----Harbor has been installed and started successfully.----
2. 创建新项目“cosign”
在项目中启用 cosign:
3. 创建新用户“cosign-demo ”,并将其分配给项目“cosign”
4. 在第二个实例上创建项目“cosign”
5. 在第二个实例上创建机器人帐户[7]“robot$cosign”
保存机器人账号的认证凭证,将在配置远程复制的时候使用:
6. 在第一个 Harbor 实例上设置复制[8]
设置新的目标 Harbor 实例:
设置从 Harbor1->Harbor2 的复制规则:
7. 创建 cosign 密钥对
为了能够执行以下步骤,需要安装“cosign”。见安装说明[9]。
$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
你可以导出密钥的密码( 也称为 pass-phrase ),以便在自动化中使用:
代码语言:javascript复制export COSIGN_PASSWORD=Your_Super_P1$$w0rD
8. 镜像推送和签名
使用你的 cosign-demo 用户登录第一个 Harbor 实例。
代码语言:javascript复制$ docker login harbor1.orlix.org
Authenticating with existing credentials...
Login Succeeded
然后将镜像推送到你已经设置好的 cosign 项目,下面的例子使用了镜像 pause:1。
代码语言:javascript复制$ docker push harbor1.orlix.org/cosign/pause:1
The push refers to repository [harbor1.orlix.org/cosign/pause]
5f70bf18a086: Layer already exists
e16a89738269: Layer already exists
1: digest: sha256:b31bfb4d0213f254d361e0079deaaebefa4f82ba7aa76ef82e90b4935ad5b105 size: 938
一旦我们在Harbor中有了可用的镜像,我们就可以用 cosign 来做镜像签名。
代码语言:javascript复制$ cosign sign --key cosign.key harbor1.orlix.org/cosign/pause:1
Enter password for private key:
Pushing signature to: harbor1.orlix.org/cosign/pause
9. 触发复制并验证结果
验证复制结果:
在 Harbor1 实例上触发复制规则 harbor1->harbor2 之后,我们可以看到该镜像在两个 Harbor 实例中都有 Cosign 签名,可通过运行命令 cosign verify 验证签名。
代码语言:javascript复制$ cosign verify --key cosign.pub harbor1.orlix.org/cosign/pause:1 | jq .
Verification for harbor1.orlix.org/cosign/pause:1 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
[
{
"critical": {
"identity": {
"docker-reference": "harbor1.orlix.org/cosign/pause"
},
"image": {
"docker-manifest-digest": "sha256:b31bfb4d0213f254d361e0079deaaebefa4f82ba7aa76ef82e90b4935ad5b105"
},
"type": "cosign container image signature"
},
"optional": null
}
]
$ cosign verify --key cosign.pub harbor2.orlix.org/cosign/pause:1 | jq .
Verification for harbor2.orlix.org/cosign/pause:1 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
[
{
"critical": {
"identity": {
"docker-reference": "harbor1.orlix.org/cosign/pause"
},
"image": {
"docker-manifest-digest": "sha256:b31bfb4d0213f254d361e0079deaaebefa4f82ba7aa76ef82e90b4935ad5b105"
},
"type": "cosign container image signature"
},
"optional": null
}
验证返回结果和退出代码为零,表明签名有效!摘要(digest)值也相同!这样,Cosign 功能配置成功了!
参考资料
[1] Notary: https://github.com/notaryproject/notary
[2] Cosign: https://github.com/sigstore/cosign
[3] Sigstore 项目: https://github.com/sigstore
[4] 复制功能: https://goharbor.io/docs/2.5.0/administration/configuring-replication/
[5] 完整文档: https://goharbor.io/docs/2.5.0/working-with-projects/working-with-images/sign-images/
[6] 离线安装程序: https://goharbor.io/docs/2.5.0/install-config/download-installer/
[7] 创建机器人帐户: https://goharbor.io/docs/2.5.0/administration/robot-accounts/
[8] 设置复制: https://goharbor.io/docs/2.5.0/administration/configuring-replication/
[9] 安装说明: https://docs.sigstore.dev/cosign/installation/
[10] Harbor 社区: https://goharbor.io/community/
[11] @project_harbor: https://twitter.com/project_harbor
[12] CNCF Slack: https://slack.cncf.io/
[13] Github: https://github.com/goharbor/harbor