本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变为不正确。

Kubernetes 1.26:我们现在正在签署二进制发布工件!

Kubernetes 特别兴趣小组(SIG)发布很高兴地宣布,我们正在对所有发布工件进行数字签名,并且 Kubernetes 的这一方面现在已达到测试版

签名工件为最终用户提供了验证下载资源完整性的机会。它允许直接在客户端缓解中间人攻击,从而确保远程服务工件的可信度。我们过去工作的总体目标是定义用于签署所有 Kubernetes 相关工件的工具,并为相关项目(例如kubernetes-sigs中的项目)提供标准的签名流程。

我们已经签署了所有官方发布的容器镜像(从 Kubernetes v1.24 开始)。镜像签名在 v1.24 和 v1.25 中为 alpha 版。对于 v1.26,我们还将所有二进制工件添加到签名过程中!这意味着现在所有的 客户端、服务器和源 tarball二进制工件软件物料清单 (SBOM) 以及 构建来源 都将使用 cosign 进行签名。从技术上讲,我们现在将额外的 *.sig(签名)和 *.cert(证书)文件与工件并排提供,以验证其完整性。

要验证工件(例如 kubectl),您可以下载签名和证书以及二进制文件。我使用 v1.26 的发布候选版本 rc.1 进行演示,因为最终版本尚未发布

curl -sSfL https://dl.k8s.io/release/v1.26.0-rc.1/bin/linux/amd64/kubectl -o kubectl
curl -sSfL https://dl.k8s.io/release/v1.26.0-rc.1/bin/linux/amd64/kubectl.sig -o kubectl.sig
curl -sSfL https://dl.k8s.io/release/v1.26.0-rc.1/bin/linux/amd64/kubectl.cert -o kubectl.cert

然后您可以使用 cosign 验证 kubectl

COSIGN_EXPERIMENTAL=1 cosign verify-blob kubectl --signature kubectl.sig --certificate kubectl.cert
tlog entry verified with uuid: 5d54b39222e3fa9a21bcb0badd8aac939b4b0d1d9085b37f1f10b18a8cd24657 index: 8173886
Verified OK

UUID 可用于查询 rekor 透明度日志

rekor-cli get --uuid 5d54b39222e3fa9a21bcb0badd8aac939b4b0d1d9085b37f1f10b18a8cd24657
LogID: c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d
Index: 8173886
IntegratedTime: 2022-11-30T18:59:07Z
UUID: 24296fb24b8ad77a5d54b39222e3fa9a21bcb0badd8aac939b4b0d1d9085b37f1f10b18a8cd24657
Body: {
  "HashedRekordObj": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "982dfe7eb5c27120de6262d30fa3e8029bc1da9e632ce70570e9c921d2851fc2"
      }
    },
    "signature": {
      "content": "MEQCIH0e1/0svxMoLzjeyhAaLFSHy5ZaYy0/2iQl2t3E0Pj4AiBsWmwjfLzrVyp9/v1sy70Q+FHE8miauOOVkAW2lTYVug==",
      "publicKey": {
        "content": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWthZ0F3SUJBZ0lVRldab0pLSUlFWkp3LzdsRkFrSVE2SHBQdi93d0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpJeE1UTXdNVGcxT1RBMldoY05Nakl4TVRNd01Ua3dPVEEyV2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVDT3h5OXBwTFZzcVFPdHJ6RFgveTRtTHZSeU1scW9sTzBrS0EKTlJDM3U3bjMreHorYkhvWVkvMUNNRHpJQjBhRTA3NkR4ZWVaSkhVaWFjUXU4a0dDNktPQ0FXVXdnZ0ZoTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWRCZ05WSFE0RUZnUVV5SmwxCkNlLzIzNGJmREJZQ2NzbXkreG5qdnpjd0h3WURWUjBqQkJnd0ZvQVUzOVBwejFZa0VaYjVxTmpwS0ZXaXhpNFkKWkQ4d1FnWURWUjBSQVFIL0JEZ3dOb0UwYTNKbGJDMXpkR0ZuYVc1blFHczRjeTF5Wld4bGJtY3RjSEp2WkM1cApZVzB1WjNObGNuWnBZMlZoWTJOdmRXNTBMbU52YlRBcEJnb3JCZ0VFQVlPL01BRUJCQnRvZEhSd2N6b3ZMMkZqClkyOTFiblJ6TG1kdmIyZHNaUzVqYjIwd2dZb0dDaXNHQVFRQjFua0NCQUlFZkFSNkFIZ0FkZ0RkUFRCcXhzY1IKTW1NWkhoeVpaemNDb2twZXVONDhyZitIaW5LQUx5bnVqZ0FBQVlUSjZDdlJBQUFFQXdCSE1FVUNJRXI4T1NIUQp5a25jRFZpNEJySklXMFJHS0pqNkQyTXFGdkFMb0I5SmNycXlBaUVBNW4xZ283cmQ2U3ZVeXNxeldhMUdudGZKCllTQnVTZHF1akVySFlMQTUrZTR3Q2dZSUtvWkl6ajBFQXdNRFpnQXdZd0l2Tlhub3pyS0pWVWFESTFiNUlqa1oKUWJJbDhvcmlMQ1M4MFJhcUlBSlJhRHNCNTFUeU9iYTdWcGVYdThuTHNjVUNNREU4ZmpPZzBBc3ZzSXp2azNRUQo0c3RCTkQrdTRVV1UrcjhYY0VxS0YwNGJjTFQwWEcyOHZGQjRCT2x6R204K093PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
      }
    }
  }
}

HashedRekordObj.signature.content 应该与文件 kubectl.sig 的内容匹配,并且 HashedRekordObj.signature.publicKey.content 应该与 kubectl.cert 的内容相同。也可以指定远程证书和签名位置,而无需下载它们

COSIGN_EXPERIMENTAL=1 cosign verify-blob kubectl \
    --signature https://dl.k8s.io/release/v1.26.0-rc.1/bin/linux/amd64/kubectl.sig \
    --certificate https://dl.k8s.io/release/v1.26.0-rc.1/bin/linux/amd64/kubectl.cert
tlog entry verified with uuid: 5d54b39222e3fa9a21bcb0badd8aac939b4b0d1d9085b37f1f10b18a8cd24657 index: 8173886
Verified OK

所有提到的步骤以及如何验证容器镜像都在关于如何验证已签名的 Kubernetes 工件的官方文档中进行了概述。在接下来的 Kubernetes 发布版本中,我们将努力通过确保真正签署所有 Kubernetes 工件来使全局故事更加成熟。除此之外,我们正在考虑使用 Kubernetes 拥有的基础设施进行签名(根信任)和验证(透明度日志)过程。

参与其中

如果您有兴趣为 SIG Release 做出贡献,请考虑申请即将到来的 v1.27 影子计划(请关注 k-dev 上的公告)或加入我们的每周会议,打个招呼。

我们期待为未来的 Kubernetes 版本做出更多这些出色的更改。例如,我们正在研究 Kubernetes 发布过程中的 SLSA Level 3 合规性将 kubernetes/kubernetes 默认分支名称重命名为 main

感谢您阅读这篇博客文章!我想借此机会向所有参与的 SIG Release 人员表示特别感谢,感谢他们及时发布此功能!

请随时通过使用 SIG Release 邮件列表#sig-release Slack 频道与我们联系。

其他资源