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-amd64chmod +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 签名流程(传统密钥模式)
- 准备镜像:确保镜像已推送至目标仓库,且本地可访问。
- 执行签名:使用私钥对镜像摘要进行签名,并将签名制品上传至仓库。
- 验证签名:使用公钥从仓库拉取签名并验证镜像完整性。
# 使用私钥签名镜像
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)
- OIDC 身份认证:Cosign 自动获取当前环境的 OIDC (如 GitHub Actions 的
id-)。 - 临时密钥生成:Fulcio 证书机构签发短期证书,绑定用户身份与公钥。
- 签名与日志记录:签名结果和证书上传至 Rekor 透明度日志。
- 验证:验证者从 Rekor 获取签名和证书,确认身份和镜像完整性。
# 无密钥签名(无需指定 --key)
cosign sign registry.example.com/my-app:v1
# 无密钥验证
cosign verify registry.example.com/my-app:v1
关键区别:传统模式依赖本地密钥对,无密钥模式依赖 OIDC 身份和短期证书。无密钥模式更适合 CI/CD 流水线,可完全消除密钥管理负担。
2.4 签名制品结构解析
Cosign 签名在 OCI 仓库中以独立 Manifest 形式存在,与目标镜像通过摘要关联。理解其结构有助于调试和策略配置。
| 组件 | 说明 | 示例 |
|---|---|---|
| 镜像引用 | 被签名的原始镜像地址 | registry.example.com/my-app@sha256:abc123... |
| 签名 Manifest | 包含签名载荷和证书的 OCI Manifest | registry.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 身份和透明度日志条目,便于排查验证失败原因。
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权限。