作者:Maxime Greau
软件供应链攻击不断增加。 这就是为什么这个主题是安全领导者的首要任务。
在这方面,这篇博文重点介绍了使用 Sigstore 对 Elastic Stack 容器镜像进行签名的新功能,以便:
- 保护 Elastic 软件供应链工作流程
- 为 Elastic 用户提供一种简单且标准的方法,在将 Elastic 容器映像部署到任何基础设施之前验证其来源,从而防止供应链攻击
- 满足监管和合规要求
什么是 Sigstore?
Sigstore 是一个 OpenSSF 项目,得到 Chainguard、Red Hat 和 Google 等公司的支持,利用无密钥签名工作流程等功能,为轻松签名、验证和保护软件提供了新标准。 弹性图像使用 cosign 进行签名,这是 Sigstore 项目的一部分。 Cosign 支持 OCI 注册表中的容器签名、验证和存储。
哪些 Elastic Stack 版本是使用 Sigstore 签名的?
Elastic 早在 2016 年就开始发布 ELK 容器镜像 5.0。 2023 年 5 月,8.8.0 引入了第一个签名的 Elastic Stack 容器映像。
确保镜像已被 Elastic 签名就像安装 cosign 应用程序并执行以下命令一样简单:
$ cosign verify --key https://artifacts.elastic.co/cosign.pub \
docker.elastic.co/elasticsearch/elasticsearch:8.8.1
该命令以 JSON 格式打印检查结果和签名负载:
Verification for docker.elastic.co/elasticsearch/elasticsearch:8.8.1 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- The signatures were verified against the specified public key
[
{
"critical": {
"identity": {
"docker-reference": "docker.elastic.co/elasticsearch/elasticsearch"
},
"image": {
"docker-manifest-digest": "sha256:27cb808b1029ac75718a12ac16f2c09b0cda6469146b6039fd3573fc2f0711d3"
},
"type": "cosign container image signature"
},
"optional": {
"Bundle": {
"SignedEntryTimestamp": "MEUCIQDSDY3XrFURA5DO5fJ36WZfKf1ejaPlASgLn6tMXEHlDwIgKQPXXgNOasuXOSRRjeNdl0L028n/Yx3yMETYWNxthzg=",
"Payload": {
"body": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwNWNhZDk4MmYxMDQ3OTk0OGY3Zjk5NDQyNGEwNWQ5ZDZkZDM5ZDAyZWJmMzNjY2QzMTVlNDUwNmJkOGE4NzY2In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRkVWZGFJRWcyR1RVQ0l3RkhYeHdxd0kyZGtlazZMbjFXTEFvcHowM0hQMEFpRUE2ZnpDaHpuLy96cGZqYUtCSG1adkgvREhuZzRHMVlKMGltbUNZL20zUWFvPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGY1ZaMlRtUlJkR1JrZEdWdGRtWmpWV1V5VGpCbloxZ3ZjSFJxYVFwRlZYRjRlakp3UkZVM1ZWYzFiVE53WkcxSU1UTnJUVXR3ZURselJqUjJWVFZLVDJVM1ZYSXJSazVJVERkaFlXaE1hbWRIWXpBNGRXUkJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=",
"integratedTime": 1686211821,
"logIndex": 23111241,
"logID": "c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"
}
},
"tag": "8.8.1"
}
}
]
请注意:我们在对镜像进行签名时(例如 8.8.1)确实设置了发布版本的标签属性,以便于验证命令。
使用镜像摘要(digest)验证签名
建议通过其摘要值拉取和引用容器镜像作为最佳实践,该摘要值在技术上是不可变的,与镜像标签相反(即使我们确实在内部将标签视为不可变)。
使用 crane 工具与远程注册表和图像交互,可以轻松获取任何镜像的摘要值,而无需拉取它:
$ crane digest docker.elastic.co/elasticsearch/elasticsearch:8.8.1
sha256:27cb808b1029ac75718a12ac16f2c09b0cda6469146b6039fd3573fc2f0711d3
然后,通过摘要验证签名很简单,如下所示:
$ cosign verify --key https://artifacts.elastic.co/cosign.pub \
docker.elastic.co/elasticsearch/elasticsearch@sha256:27cb808b1029ac75718a12ac16f2c09b0cda6469146b6039fd3573fc2f0711d3
Elastic 容器注册表支持
我们的 Elastic 容器注册表可在 docker.elastic.co 上获取; 它是符合 OCI 标准的注册表,因此与 cosign 兼容。 但我们必须更新容器库 UI,使其与 cosign 签名格式兼容。 提醒一下,cosign 获取图像的 SHA256 校验和,并将签名作为标签以以下格式推送到注册表:sha256-<sha256_checksum_of_image>.<sig>。 这些标签对 UI 是隐藏的。
查看这篇博客文章,了解有关即将推出的 OCI v1.1 规范以及将解决此 .sig 标签解决方法的联合签名支持的更多信息。