sigstore 项目由其旗下的几个开源组件组成:
在本文中,我将cosign
项目中的部分以及如何使用它来签名和验证容器映像(以及其他受支持的对象)。的理念 cosign
是使签名和验证过程成为 开发人员不可变的基础设施 。
在此示例中,我将cosign
在基于 macOS 的系统上进行安装。首先,确保系统已安装并运行 Docker 以管理容器映像。
使用 brew,我安装cosign
.
$ brew install sigstore/tap/cosign
==> Installing sigstore/tap/cosign
🍺 /usr/local/Cellar/cosign/1.3.1: 3 files, 82.5MB, built in 2 seconds
接下来,我确保我已登录到目标注册表,在此示例中为 docker.io。
$ docker login docker.io
Login Succeeded
在我签署和验证任何图像之前,我需要生成一个公钥和私钥对。然后我使用这个私钥对对象进行签名,然后使用相应的公钥对其进行验证。我还应该使用强密码来保护密钥对。理想情况下,出于安全和审计目的,此密码会存储在保险库中。
$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
由于我现在拥有开始签名所需的密钥,因此我对之前推送到注册表中的测试映像进行了签名。
$ cosign sign --key cosign.key docker.io / mzali / test:latest
Enter password for private key:
使用该triangulate
选项,我可以从注册表中找到 cosign 图像引用。
$ cosign triangulate docker.io / mzali / test:latest
index.docker.io / mzali / test:sha256-25ca0d9c2f4e70ce3bfba7891065dfef09760d2cbace7a2d21fb13c569902133.sig
现在,这是我要根据公钥验证图像并验证签名真实性的部分。使用公钥,我可以验证图像签名密钥签名。
$ cosign verify --key cosign.pub docker.io/mzali/test:latest
Verification for index.docker.io/mzali/test:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
[{"critical":{"identity":{"docker-reference":"index.docker.io/mzali/test"},"image":{"docker-manifest-digest":"sha256:25ca0d9c2f4e70ce3bfba7891065dfef09760d2cbace7a2d21fb13c569902133"},"type":"cosign container image signature"},"optional":null}]
Do the same for SBOM
接下来,我还想 签署 SBOMs。在这个例子中,我使用alpine:latest
图像来展示你是如何做到的。
alpine 容器镜像已经被推送到注册表。我首先需要从图像生成 SBOM,然后使用syft 项目syft
中的二进制文件 。由于我在基于 macOS 的系统上进行测试,因此我将使用 brew 来安装它。
$ brew tap anchore / syft
$ brew install syft
我使用syft
.
$ syft packages mzali/alpine
✔ Loaded image
✔ Parsed image
✔ Cataloged packages [14 packages]
NAME VERSION TYPE
alpine-baselayout 3.2.0-r16 apk
alpine-keys 2.4-r0 apk
apk-tools 2.12.7-r0 apk
busybox 1.33.1-r6 apk
ca-certificates-bundle 20191127-r5 apk
libc-utils 0.7.2-r3 apk
libcrypto1.1 1.1.1l-r0 apk
libretls 3.3.3p1-r2 apk
libssl1.1 1.1.1l-r0 apk
musl 1.2.2-r3 apk
musl-utils 1.2.2-r3 apk
scanelf 1.3.2-r0 apk
ssl_client 1.33.1-r6 apk
zlib 1.2.11-r3 apk
现在我要签署这个 SBOM。我希望 SBOM 为 SPDX 2.2 标记值格式(或其他支持的格式,在本例中,我选择 SPDX 格式),然后将其附加到图像。
$ syft packages mzali/alpine -o spdx > latest.spdx
✔ Loaded image
✔ Parsed image
✔ Cataloged packages [14 packages]
$ ls -lrt latest.spdx
-rw-r--r-- 1 yanked yanked 10058 Nov 17 15:52 latest.spdx
$ cosign attach sbom --sbom latest.spdx mzali/alpine
Uploading SBOM file for [index.docker.io/mzali/alpine:latest] to [index.docker.io/mzali/alpine:sha256-5e604d3358ab7b6b734402ce2e19ddd822a354dc14843f34d36c603521dbb4f9.sbom] with mediaType [text/spdx].
使用上面的摘要输出,我在注册表中签署 SBOM 并验证它。
$ cosign sign --key cosign.key docker.io/mzali/alpine:sha256-5e604d3358ab7b6b734402ce2e19ddd822a354dc14843f34d36c603521dbb4f9.sbom
Enter password for private key: %
$ cosign verify --key cosign.pub docker.io/mzali/alpine:sha256-5e604d3358ab7b6b734402ce2e19ddd822a354dc14843f34d36c603521dbb4f9.sbom
Verification for index.docker.io/mzali/alpine:sha256-5e604d3358ab7b6b734402ce2e19ddd822a354dc14843f34d36c603521dbb4f9.sbom --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
[{"critical":{"identity":{"docker-reference":"index.docker.io/mzali/alpine"},"image":{"docker-manifest-digest":"sha256:00a101b8d193c294e2c9b3099b42a7bc594b950fbf535d98304d4c61fad5491b"},"type":"cosign container image signature"},"optional":null}]
最简单的使用方法cosign
是将其包含到您的 SDLC 管道中,作为 Jenkins 或 Tekton 工具的示例。使用cosign
,我可以将其包含在构建过程中以对我的软件进行签名和验证。如果您使用的是 Kubernetes,则有一个 Kubernetes 联合签名准入控制器 ,它可以查看您的图像签名并将其与指定的公钥进行比较。如果图像未签名或使用未知密钥,准入控制器会因为违规而阻止它:
$ kubectl apply -f unsigned-deployment.yaml
Error from server (BadRequest): error when creating "unsigned-deployment.yaml": admission webhook "cosigned.sigstore.dev" denied the request: validation failed: invalid image signature: spec.template.spec.containers[0].image
同样,cosign
这只是整个 sigstore 项目的冰山一角。这些组件是协作的、集成的,并提供防篡改、强大的验证点,并且使用相同的标准更容易保护软件!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。