如何使用 sigstore Cosign V2 验证容器镜像签名?

问题描述 投票:0回答:1

我正在尝试使用 Cosign 验证容器映像。

让我们以图像

csi-node-driver-registrar
为例。 (图片无所谓,只要有作者签名即可)

我尝试了以下 CLI 命令,它成功验证了图像:

cosign verify registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.3 --certificate-identity [email protected] --certificate-oidc-issuer https://accounts.google.com

但是,我通过使用随机错误值运行命令获得了“certificate-identity”和“certificate-oidc-issuer”的工作值。 (所以我在错误消息中看到了正确的值)这就像一个笑话,不是吗?

所以我真的需要对以下几点进行一些解释:

  • Cosign如何在“无钥匙”模式下对图像进行签名和验证?

我读了官方文档,但它完全迷失了我。我了解了签名(私钥加密原始数据的哈希码)和验证(通过公钥解密并比较 2 段哈希码)的基本概念

  • 如何找到正确的“证书身份”和“证书 oidc 颁发者”以防图像不是由我创建/签名

非常感谢!!我花了很多时间在谷歌上搜索但没有任何运气。

digital-signature docker-image
1个回答
0
投票

经过几个小时的搜索、阅读和猜测,现在我尝试回答我自己的问题。

当Cosign以“无密钥”模式对图像进行签名时,Fulcio的“根信任”捆绑包中的私钥用于创建签名,因此还应使用相应的公钥进行验证。

换句话说,对于签名创建,“无密钥”并不意味着不使用密钥。这只是意味着用户不需要提供密钥——将使用“官方”私钥。

基于上述,为了验证此类图像签名,Cosign 还会向 Fulcio 请求私钥。然而,在创建签名时,除了哈希码之外,还添加了一些额外的信息,因此在验证签名时,也可以验证额外的信息,作为额外的安全层。

额外的信息就是所谓的“证书身份”和“证书oidc颁发者”。当 Cosign 对存储在容器注册表中的映像进行签名时,它期望容器注册表是一个“IPD”,从中检索 ID 令牌,提供用户可以成功登录到容器注册表的功能(“cosign sign”命令将打开一个 Web 浏览器窗口并带您进入容器注册表的登录页面)。

之后,Cosign从ID Token中提取“id”声明,并将其与“IPD”的URL一起保存到签名中。

验证过程会将保存的“id”与您通过“certificate-identity”参数指定的“id”进行比较。确保图像来自预期的作者。您可以使用“--certificate-identity-regexp '.*'”来绕过此检查,但这样做当然是不安全的。

如果我错了,请大家指正。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.