代码签名
什么是代码签名?
代码签名是对软件制品(如 Docker 镜像)应用加密签名的过程,用于验证其完整性和真实性。通过对镜像进行签名,您可以确保自签名以来镜像未被篡改,并且来自可信来源。
在 Docker Hardened Images (DHIs) 的上下文中,代码签名使用 Cosign 实现,这是由 Sigstore 项目开发的一个工具。Cosign 支持对容器镜像进行安全且可验证的签名,从而增强软件供应链中的信任和安全性。
为什么代码签名很重要?
代码签名在现代软件开发和网络安全中起着至关重要的作用:
- 真实性:验证镜像是否由可信来源创建。
- 完整性:确保自签名以来镜像未被篡改。
- 合规性:有助于满足监管和组织的安全要求。
Docker Hardened Image 代码签名
每个 DHI 都使用 Cosign 进行加密签名,确保镜像未被篡改,并且来自可信来源。
为什么需要对自己的镜像进行签名?
Docker Hardened Images 由 Docker 签名以证明其来源和完整性,但如果您正在构建基于或使用 DHIs 作为基础的应用程序镜像,您也应该对自己的镜像进行签名。
通过对自己的镜像进行签名,您可以:
- 证明镜像是由您的团队或流水线构建的
- 确保推送后构建未被篡改
- 支持像 SLSA 这样的软件供应链框架
- 在部署工作流中启用镜像验证
在频繁构建和推送镜像的 CI/CD 环境中,或在任何需要审计镜像来源的场景中,这尤其重要。
如何查看和使用代码签名
查看签名
您可以使用 Docker Scout 或 Cosign 验证 Docker Hardened Image 是否已签名并受信任。
要列出附加到镜像的所有证明(包括签名元数据),请使用以下命令:
$ docker scout attest list <image-name>:<tag>
Note如果镜像存在于您的设备上,您必须在镜像名称前加上
registry://。例如,使用registry://dhi.io/python而不是dhi.io/python。
要验证特定的已签名证明(例如 SBOM、VEX、来源):
$ docker scout attest get \
--predicate-type <predicate-uri> \
--verify \
<image-name>:<tag>
Note如果镜像存在于您的设备上,您必须在镜像名称前加上
registry://。例如,使用registry://dhi.io/python:3.13而不是dhi.io/python:3.13。
例如:
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--verify \
dhi.io/python:3.13
如果有效,Docker Scout 将确认签名并显示签名有效载荷,以及用于验证镜像的等效 Cosign 命令。
签名镜像
要对 Docker 镜像进行签名,请使用 Cosign。将 <image-name>:<tag> 替换为镜像名称和标签。
$ cosign sign <image-name>:<tag>
此命令将提示您通过 OIDC 提供商(如 GitHub、Google 或 Microsoft)进行身份验证。成功验证后,Cosign 将生成一个短期证书并签署镜像。签名将存储在透明日志中,并与注册表中的镜像关联。