3、镜像签名概念:什么是镜像签名、数字签名原理、Cosign与Notation简介
镜像签名是云原生供应链安全的核心防线。它通过密码学手段为容器镜像附加不可伪造的数字签名,使镜像在构建、分发、部署全链路中具备可验证的身份与完整性保证。本节从基础概念出发,逐步拆解数字签名原理,并对比两大主流签名工具——Cosign 与 Notation。
3.1 什么是镜像签名
镜像签名本质上是将数字签名技术与容器镜像的元数据(如镜像 Digest、标签、创建时间等)绑定,生成一个签名对象,并将其存储在镜像仓库或独立的签名存储中。当 Kubernetes 或 Harbor 执行准入控制时,会验证该签名是否由可信签名者签发、镜像内容是否被篡改。
核心价值:镜像签名解决了“谁构建了此镜像”与“镜像是否被篡改”两个关键信任问题,是软件供应链安全(SLSA)等级提升的必备环节。
3.2 数字签名原理
数字签名采用非对称加密体系,包含以下关键步骤:
- 密钥对生成:签名者生成一对密钥——私钥(保密)和公钥(公开)。
- 签名生成:对镜像内容(通常是 Manifest Digest)计算哈希值,使用私钥加密哈希值,生成签名。
- 签名存储:签名与镜像一同推送到仓库,或存储在 OCI 制品仓库中。
- 签名验证:验证者获取镜像、签名和签名者的公钥,用公钥解密签名得到原始哈希,再与镜像实际哈希比对,一致则验证通过。
关键点:签名验证不依赖镜像内容本身是否加密,而是验证内容的哈希值是否被可信私钥签名。即使镜像被公开拉取,没有对应公钥也无法伪造有效签名。
3.3 Cosign 与 Notation 简介
当前容器镜像签名领域的两大主流工具分别是 Cosign(Sigstore 项目)和 Notation(CNCF 项目)。两者均支持 OCI 制品签名,但在设计理念、密钥管理、生态集成上存在显著差异。
| 对比维度 | Cosign | Notation |
|---|---|---|
| 所属组织 | Sigstore(Linux 基金会) | CNCF(云原生计算基金会) |
| 签名存储 | OCI 制品仓库(与镜像同仓库) | OCI 制品仓库(与镜像同仓库) |
| 密钥管理 | 支持密钥对、KMS、Fulcio(短期证书) | 支持密钥对、KMS、X.509 证书链 |
| 验证方式 | 公钥 / Fulcio 根证书 / 透明日志 | X.509 证书链 + 信任策略 |
| Harbor 集成 | 原生支持(Harbor 2.5+) | 原生支持(Harbor 2.8+) |
| Kubernetes 准入 | Kyverno / OPA Gatekeeper / 自定义 Webhook | Notation Admission Controller / Ratify |
| 签名格式 | Cosign 自定义格式(基于 DSSE) | Notation 自定义格式(基于 JWS) |
选型建议:如果团队已使用 Sigstore 生态(如 Fulcio、Rekor),优先选择 Cosign;如果企业已有 PKI 体系或需要严格 X.509 证书链管理,Notation 更合适。Harbor 同时支持两者,可在项目级别配置签名验证策略。
3.4 Cosign 核心特性
- 无密钥签名模式:通过 Fulcio 服务获取短期证书,签名后证书自动记录到 Rekor 透明日志,实现“无密钥”体验。
- OCI 原生存储:签名作为 OCI 制品(media type:
application/vnd.dev.cosign.simplesigning.v1+json)存储在镜像仓库中。 - 支持多种验证策略:可基于公钥、Fulcio 根证书、KMS 密钥进行验证。
- 命令行简洁:
cosign sign和cosign verify即可完成签名与验证。
# Cosign 签名示例(使用密钥对)
cosign sign --key cosign.key myregistry.io/myimage:v1
# Cosign 验证示例
cosign verify --key cosign.pub myregistry.io/myimage:v1
3.5 Notation 核心特性
- X.509 证书链:签名基于标准 X.509 证书,支持 CA 签发、自签名、KMS 托管证书。
- 信任策略驱动:通过
trustpolicy.json定义哪些证书颁发机构受信任,实现细粒度验证。 - OCI 原生存储:签名作为 OCI 制品(media type:
application/vnd.cncf.notary.v2.signature)存储。 - 与 Harbor 深度集成:Harbor 2.8+ 内置 Notation 验证器,可在项目级别配置签名校验。
# Notation 签名示例(使用自签名证书)
notation sign --key notation.key --cert notation.crt myregistry.io/myimage:v1
# Notation 验证示例
notation verify myregistry.io/myimage:v1
3.6 镜像签名在 Harbor 中的角色
Harbor 作为企业级镜像仓库,内置了签名验证引擎。当启用“镜像签名验证”策略后,Harbor 会在以下环节执行签名校验:
- 镜像推送时:Harbor 自动检测签名是否存在,若策略要求签名但未发现,则拒绝推送。
- 镜像拉取时:Harbor 返回签名信息,供客户端或准入控制器验证。
- 复制(Replication)时:签名作为 OCI 制品一同复制,确保跨仓库信任链不中断。