Harbor系列之11:制品签名

借助Cosign或Notaion对制品进行签名

制品签名和签名验证是关键的安全功能,它们允许你验证制品的完整性。Harbor 通过与 Cosign 或 Notation 的集成来支持内容信任。

项目管理员可以配置项目以强制执行内容信任,要求所有制品在从 Harbor 注册表中拉取之前必须进行签名。

project-sign-settings

1. 使用Cosign对制品进行签名

Harbor v2.5 集成了对 Cosign 的支持,Cosign 是 Sigstore 项目的一部分,提供了 OCI 制品的签名和验证解决方案。

Cosign 对 OCI 制品进行签名,并将生成的签名推送到 Harbor。该签名作为制品的附件存储在 Harbor 中,与签名的制品一起管理。Harbor 管理着签名制品与 Cosign 签名之间的链接,因此你可以对签名的制品应用标签保留规则和不可变规则,这些规则将同时扩展到签名制品和签名上。通过这种方式,你可以使用 Harbor 内置的功能来管理签名制品和 Cosign 签名附件。需要注意的是,Harbor 不支持对 Cosign 签名的漏洞扫描。

使用 Cosign 与 Harbor 集成的一个关键功能是能够使用 Harbor 的复制功能,将签名与其关联的签名制品一起复制。这意味着如果复制规则适用于某个签名制品,Harbor 将以同样的方式将复制规则应用于该签名制品的签名。

  • 在 Harbor 实例之间进行复制时,目标 Harbor 实例将保持签名制品及其关联签名之间的链接。你可以在目标 Harbor 界面中看到这两个制品之间的关系,就像在源注册表中一样。

  • 从 Harbor 复制到另一种目标注册表类型时,目标注册表将不会管理签名制品与其关联签名之间的链接。你将在同一存储库下看到主题清单和签名作为协调制品。

注意:只有“手动”和“定时”复制触发模式适用。目前无法进行基于事件的复制,因为存在先决条件的问题:你无法复制未签名的镜像,但你也无法在没有镜像的情况下复制签名。

1.1 安装cosign

1. 安装 Cosign

你可以通过以下命令安装 Cosign:

  • 如果你使用的是 macOS 或 Linux:
curl -sSL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign

# 验证安装
[root@e2etest ~]# cosign version
  ______   ______        _______. __    _______ .__   __.
 /      | /  __  \      /       ||  |  /  _____||  \ |  |
|  ,----'|  |  |  |    |   (----`|  | |  |  __  |   \|  |
|  |     |  |  |  |     \   \    |  | |  | |_ | |  . `  |
|  `----.|  `--'  | .----)   |   |  | |  |__| | |  |\   |
 \______| \______/  |_______/    |__|  \______| |__| \__|
cosign: A tool for Container Signing, Verification and Storage in an OCI registry.

GitVersion:    v2.3.0
GitCommit:     deed3631520ddeb6cc7d81ace205a97342c8daab
GitTreeState:  clean
BuildDate:     2024-07-22T17:19:10Z
GoVersion:     go1.22.5
Compiler:      gc
Platform:      linux/amd64
  • 如果你使用的是 Windows:

你可以从 GitHub Releases 页面下载相应的可执行文件并将其添加到 PATH。

2. 生成密钥对

Cosign 使用密钥对进行签名和验证。你可以通过以下命令生成一对密钥:

cosign generate-key-pair

生成的 cosign.key 是私钥,cosign.pub 是公钥。确保安全存储这些密钥,特别是私钥。

1.2 签名、上传和查看 Cosign 签名

1. 对镜像进行签名

使用 cosign sign 命令对镜像进行签名,并将 Cosign 签名上传到你的 Harbor 实例中。

在以下示例中,将 /<image/path>: 替换为你的 Harbor 实例和镜像的路径。

cosign sign --key cosign.key <harbor-instance>/<image/path>:<image-tag>

在输入你的 cosign 私钥密码后,cosign 会对镜像进行签名,并将生成的签名上传到你的 Harbor 实例中。你可以在 Harbor 界面中查看签名制品的所有签名。

示例如下:

[root@e2etest cosign]# cosign sign --key cosign.key 10.210.10.210/db/mysql@sha256:4b6c4935195233bc10b617df3cc725a9ddd5a7f10351a7bf573bea0b5ded7649
Enter password for private key:

        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 118772948
Pushing signature to: 10.210.10.210/db/mysql
2. 验证签名

在拉取或使用镜像之前,可以验证签名以确保镜像的完整性和来源:

cosign verify --key cosign.pub <harbor-instance>/<image/path>:<image-tag>

如果签名有效,Cosign 将输出验证结果。

3. 在harbor上查看制品签名

cosign对镜像进行签名后,签名同时被推送到harbor仓库。此时harbor-项目-镜像仓库中,artifacts的状态会变成已签名:

artifact-signed
签名作为制品的附件存在。

所有与签名制品关联的签名将在签名制品被删除时一起删除。

需要注意的是,Harbor 的垃圾回收不会单独删除任何签名。在 Harbor 中,Cosign 签名被视为与其他 OCI 制品相同的对待方式,但从垃圾回收器的角度来看,它无法看到附件制品,比如 Cosign 签名。例如,如果你配置了对未打标签的制品进行垃圾回收,Harbor 的垃圾回收器不会删除任何没有标签的签名。如果签名制品没有标签,并且符合配置的垃圾回收规则,它和任何关联的签名将会被删除。

Harbor 不支持使用 cosign clean 来删除签名,因为 Harbor 选择不实现 cosign clean 所使用的标签删除功能。有关实现要求的更多信息,请参阅 OCI 分发规范

2. 使用Notation对制品进行签名(分发规范 v1.1 模式)

Notation 是一个基于标准的工具和库,用于签名和验证 OCI 制品。它生成签名并将其与 OCI 制品关联,以确保供应链的完整性。

2.1 安装Notation命令行

安装最新版本的notation命令行,参考官方指导:https://notaryproject.dev/docs/user-guides/installation/cli/

二进制下载链接:https://github.com/notaryproject/notation/releases,下面以x86平台下linux系统安装为例:

# 设置notation版本
export NOTATION_VERSION=1.1.1

# 下载二进制文件
https://github.com/notaryproject/notation/releases/download/v1.1.1/notation_1.1.1_linux_amd64.tar.gz
curl -LO https://github.com/notaryproject/notation/releases/download/v$NOTATION_VERSION/notation_$NOTATION_VERSION\_linux_amd64.tar.gz
curl -LO https://github.com/notaryproject/notation/releases/download/v$NOTATION_VERSION/notation_$NOTATION_VERSION\_checksums.txt
shasum --check notation_$NOTATION_VERSION\_checksums.txt

# 解压文件
tar xvzf <ARCHIVE_FILE> -C /usr/bin/ notation

# 验证安装
[root@e2etest ~]# notation version
Notation - a tool to sign and verify artifacts.

Version:     1.1.1
Go version:  go1.22.4
Git commit:  3dafd534fe069f2c0ce6127eb33d2e3e476723c3

2.2 生成测试密钥和自签名证书

使用 notation cert generate-test 命令生成用于签名制品的测试 RSA 密钥,以及用于验证制品的自签名 X.509 测试证书。请注意,自签名证书应仅用于测试或开发目的。在生产环境中,你应使用 CA 签发的证书。

notation cert generate-test --default "wabbit-networks.io"

key和证书生成到如下路径:

[root@e2etest notation]# notation cert generate-test --default "test.com"
generating RSA Key with 2048 bits
generated certificate expiring on 2024-08-06T17:02:32Z
wrote key: /root/.config/notation/localkeys/test.com.key
wrote certificate: /root/.config/notation/localkeys/test.com.crt
Successfully added test.com.crt to named store test.com of type ca
test.com: added to the key list
test.com: mark as default signing key

2.3 Harbor 注册表认证

要与 Harbor 注册表进行认证,请设置以下环境变量:

export NOTATION_USERNAME="YOUR_REGISTRY_USERNAME"
export NOTATION_PASSWORD="YOUR_REGISTRY_PASSWORD"
export NOTATION_USERNAME="admin"
export NOTATION_PASSWORD="Harbor12345"

2.4 签名 Harbor 中的现有镜像

假设你已配置 HTTPS 访问并将镜像推送到 Harbor,你可以使用 notation sign 命令对镜像进行签名。

notation sign <harbor-domain>/<image-reference>

默认情况下notaion只支持https类型的harbor仓库制品签名,如果是http类型的harbor,需要添加--insecure-registry

[root@e2etest notation]# notation sign 10.210.10.210/language/python:alpine3.20 --insecure-registry
Warning: Always sign the artifact using digest(@sha256:...) rather than a tag(:alpine3.20) because tags are mutable and a tag reference can point to a different artifact than the one signed.
Successfully signed 10.210.10.210/language/python@sha256:f3f9127f09f687456f484145165fe745834ba222e1ac43cca14fcfda0e88c174

一旦镜像成功签名,签名状态将更新为绿色勾选标记,并且相应的签名已被推送到注册表。

2.5 创建信任策略以验证镜像

要验证容器镜像,请配置信任策略以指定签署制品的受信任身份和使用的签名验证级别。有关详细信息,请参阅信任策略规范。

创建一个包含以下信任策略的 JSON 文件,例如:

cat <<EOF > ./trustpolicy.json
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "wabbit-networks-images",
            "registryScopes": [ "*" ],
            "signatureVerification": {
                "level" : "strict"
            },
            "trustStores": [ "ca:test.com" ],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
EOF

使用notation policy import导入上面JSON文件创建的信任策略配置,例如:

notation policy import ./trustpolicy.json

2.6 验证镜像

使用 notation verify 验证与容器镜像关联的签名。

notation verify <harbor-domain>/<image-reference>

你还可以检查签名摘要,并检查签名及其证书信息,以确保镜像是由受信任的身份生成的。

notation inspect $IMAGE

有关更多信息,请参阅 Notation 文档
镜像

使用 notation verify 验证与容器镜像关联的签名。

notation verify <harbor-domain>/<image-reference>

你还可以检查签名摘要,并检查签名及其证书信息,以确保镜像是由受信任的身份生成的。

notation inspect $IMAGE

有关更多信息,请参阅 Notation 文档

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值