借助Cosign或Notaion对制品进行签名
制品签名和签名验证是关键的安全功能,它们允许你验证制品的完整性。Harbor 通过与 Cosign 或 Notation 的集成来支持内容信任。
项目管理员可以配置项目以强制执行内容信任,要求所有制品在从 Harbor 注册表中拉取之前必须进行签名。
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的状态会变成已签名:
签名作为制品的附件存在。
所有与签名制品关联的签名将在签名制品被删除时一起删除。
需要注意的是,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 文档。