前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用sigstore对容器映像进行签名和验证

使用sigstore对容器映像进行签名和验证

原创
作者头像
KINGLIFE
发布2022-01-26 18:57:36
1.9K0
发布2022-01-26 18:57:36
举报
文章被收录于专栏:dabadaba

sigstore 项目由其旗下的几个开源组件组成: 

  • Fulcio  (代码签名的根 CA)
  • Rekor  (用于记录签名元数据的不可变防篡改分类帐)
  • Cosign  (容器签名、验证和存储在符合 OCI 的注册表中)

在本文中,我将cosign项目中的部分以及如何使用它来签名和验证容器映像(以及其他受支持的对象)。的理念 cosign是使签名和验证过程成为 开发人员不可变的基础设施 。

安装和构建 cosign

在此示例中,我将cosign在基于 macOS 的系统上进行安装。首先,确保系统已安装并运行 Docker 以管理容器映像。

使用 brew,我安装cosign.

代码语言:javascript
复制
$ 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。

代码语言:javascript
复制
$ docker login docker.io

Login Succeeded

签署和验证容器镜像

在我签署和验证任何图像之前,我需要生成一个公钥和私钥对。然后我使用这个私钥对对象进行签名,然后使用相应的公钥对其进行验证。我还应该使用强密码来保护密钥对。理想情况下,出于安全和审计目的,此密码会存储在保险库中。

代码语言:javascript
复制
$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub

由于我现在拥有开始签名所需的密钥,因此我对之前推送到注册表中的测试映像进行了签名。 

代码语言:javascript
复制
$ cosign sign --key cosign.key docker.io / mzali / test:latest
Enter password for private key:

使用该triangulate 选项,我可以从注册表中找到 cosign 图像引用。

代码语言:javascript
复制
$ cosign triangulate docker.io / mzali / test:latest
index.docker.io / mzali / test:sha256-25ca0d9c2f4e70ce3bfba7891065dfef09760d2cbace7a2d21fb13c569902133.sig

现在,这是我要根据公钥验证图像并验证签名真实性的部分。使用公钥,我可以验证图像签名密钥签名。

代码语言:javascript
复制
$ 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 来安装它。

代码语言:javascript
复制
$ brew tap anchore / syft
$ brew install syft

我使用syft

代码语言:javascript
复制
$ 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 格式),然后将其附加到图像。

代码语言:javascript
复制
$ 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 并验证它。

代码语言:javascript
复制
$ 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 联合签名准入控制器 ,它可以查看您的图像签名并将其与指定的公钥进行比较。如果图像未签名或使用未知密钥,准入控制器会因为违规而阻止它:

代码语言:javascript
复制
$ 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装和构建 cosign
  • 签署和验证容器镜像
  • 下一步是什么?
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档