Harbor v2.5远程复制:制品的签名如影随形

2022-05-04 15:03:37 浏览数 (1)

题图摄于美国加州蒙特雷港题图摄于美国加州蒙特雷港

(本文根据 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

0 人点赞