Cosign签名验证冷启动与资源配额优化 - 第2节

2.1 Cosign 简介:从软件供应链信任说起

在云原生生态中,镜像签名是保障软件供应链安全的关键一环。Cosign 是 Sigstore 项目下的无密钥签名工具,专为容器镜像和 Blob 文件设计,旨在让签名、验证和透明度日志记录变得简单且可大规模操作。

特性说明
无密钥签名支持基于 OIDC 的临时密钥对,签名后私钥即销毁,降低密钥泄露风险。
透明度日志签名记录自动上传至 Rekor 公共日志,提供可审计的不可变证据。
OCI 原生签名作为 OCI 制品存储在镜像仓库中,无需额外存储后端。
策略集成可与 Kyverno、OPA、Kubernetes 准入控制器配合,实现签名验证策略。
核心价值:Cosign 将签名从“可选安全加固”变为“可默认启用的供应链基础能力”,尤其适合冷启动场景下对镜像来源的快速信任判定。

2.2 安装与配置

2.2.1 安装方式对比

方式命令 / 步骤适用场景
二进制下载curl -O -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64
chmod +x cosign-linux-amd64 && sudo mv cosign-linux-amd64 /usr/local/bin/cosign
CI/CD 环境、离线部署
Go 安装go install github.com/sigstore/cosign/v2/cmd/cosign@latest开发环境、Go 工具链已就绪
Homebrew (macOS)brew install cosign本地开发测试
容器化运行docker run --rm -v $HOME/.cosign:/root/.cosign gcr.io/projectsigstore/cosign临时验证、不污染宿主机

2.2.2 初始配置

安装完成后,建议完成以下基础配置:

  • 设置默认密钥存储:Cosign 默认使用 $HOME/.cosign 目录存放密钥对和配置。
  • 配置 OIDC 提供者(可选):若使用无密钥签名,需确保环境支持 OIDC 认证(如 GitHub、Google、Microsoft)。
  • 验证安装:执行 cosign version 确认版本信息。
# 验证安装
cosign version

# 生成密钥对(传统模式)
cosign generate-key-pair

# 查看生成的密钥文件
ls -la ~/.cosign/
# 输出示例:cosign.key  cosign.pub
注意:生产环境建议优先使用无密钥签名(keyless signing),避免长期私钥存储带来的泄露风险。传统密钥对模式适用于离线或内网环境。

2.3 签名与验证的基本流程

Cosign 的签名流程围绕 OCI 镜像仓库展开,签名本身作为 OCI 制品(类型 application/vnd.dev.cosign.simplesigning.v1+json)与镜像关联存储。

2.3.1 签名流程(传统密钥模式)

  1. 准备镜像:确保镜像已推送至目标仓库,且本地可访问。
  2. 执行签名:使用私钥对镜像摘要进行签名,并将签名制品上传至仓库。
  3. 验证签名:使用公钥从仓库拉取签名并验证镜像完整性。
# 使用私钥签名镜像
cosign sign --key cosign.key registry.example.com/my-app:v1

# 使用公钥验证签名
cosign verify --key cosign.pub registry.example.com/my-app:v1

2.3.2 无密钥签名流程(Keyless)

  1. OIDC 身份认证:Cosign 自动获取当前环境的 OIDC (如 GitHub Actions 的 id-)。
  2. 临时密钥生成:Fulcio 证书机构签发短期证书,绑定用户身份与公钥。
  3. 签名与日志记录:签名结果和证书上传至 Rekor 透明度日志。
  4. 验证:验证者从 Rekor 获取签名和证书,确认身份和镜像完整性。
# 无密钥签名(无需指定 --key)
cosign sign registry.example.com/my-app:v1

# 无密钥验证
cosign verify registry.example.com/my-app:v1
关键区别:传统模式依赖本地密钥对,无密钥模式依赖 OIDC 身份和短期证书。无密钥模式更适合 CI/CD 流水线,可完全消除密钥管理负担。
Cosign 签名与验证流程对比 Cosign 签名与验证流程对比 传统密钥模式 ① 生成密钥对 (cosign generate-key-pair) ② 使用私钥签名镜像摘要 ③ 签名制品推送至 OCI 仓库 ④ 验证:拉取签名 + 公钥校验 无密钥模式 (Keyless) ① OIDC 身份认证 (GitHub/Google) ② Fulcio 签发短期证书 ③ 签名 + 证书上传至 Rekor 日志 ④ 验证:从 Rekor 获取证书 + 校验 传统模式:密钥管理成本高,适合离线/内网 无密钥模式:零密钥存储,适合 CI/CD 流水线

2.4 签名制品结构解析

Cosign 签名在 OCI 仓库中以独立 Manifest 形式存在,与目标镜像通过摘要关联。理解其结构有助于调试和策略配置。

组件说明示例
镜像引用被签名的原始镜像地址registry.example.com/my-app@sha256:abc123...
签名 Manifest包含签名载荷和证书的 OCI Manifestregistry.example.com/my-app:sha256-abc123.sig
签名载荷JSON 格式,包含镜像摘要、签名算法、时间戳{"critical":{"identity":{"docker-reference":"..."},"image":{"docker-manifest-digest":"sha256:abc123..."}}}
证书链无密钥模式下包含 Fulcio 签发的短期证书PEM 编码的 X.509 证书
# 查看签名制品列表
cosign list registry.example.com/my-app:v1

# 输出示例:
# sha256:abc123... (签名)
# sha256:def456... (SBOM,可选)
调试技巧:使用 cosign verify --verbose 可输出签名验证的详细日志,包括证书链、OIDC 身份和透明度日志条目,便于排查验证失败原因。
Cosign 签名制品 OCI 存储结构 Cosign 签名制品 OCI 存储结构 OCI 镜像仓库 镜像 Manifest 镜像层 (Layer 1..N) 签名 Manifest 签名载荷 (JSON) 证书链 (PEM) 签名作为独立 OCI 制品存储,通过摘要与镜像关联 验证时 Cosign 自动拉取签名 Manifest 并校验完整性

2.5 常见操作与避坑指南

操作命令注意事项
签名单个镜像cosign sign --key cosign.key <image>确保镜像已推送至仓库;签名前可先 cosign verify 检查是否已签名
批量签名cosign sign --key cosign.key <image1> <image2>支持多镜像同时签名,但需注意仓库写入速率限制
清理签名cosign clean <image>删除指定镜像的所有签名制品,不可逆操作
查看签名详情cosign verify --verbose <image>输出证书、OIDC 身份、Rekor 条目等详细信息
常见错误:
  • 签名后镜像 Digest 变化:签名不会改变镜像内容,但签名制品会占用额外仓库存储空间。
  • 验证失败 - 证书过期:无密钥模式下短期证书有效期通常为 10 分钟,验证需在有效期内完成。
  • 仓库权限不足:签名需要仓库的 push 权限,验证只需要 pull 权限。