Istio安全策略与制品签名联合验证 - 第4节

4.1 Cosign 工具概述与安装

Cosign 是 Sigstore 项目下的开源容器镜像签名工具,支持对容器镜像进行无密钥(Keyless)或基于密钥对的签名与验证。在 IDP 制品签名链路中,Cosign 承担着“开发者侧签名”与“策略侧验证”的桥梁角色。

4.1.1 安装 Cosign

Cosign 提供多平台二进制与包管理器安装方式,推荐在 CI/CD 节点或开发者工作站上使用以下方法之一:

安装方式 命令 / 步骤 适用场景
Linux / macOS (curl)
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 流水线、临时环境
Homebrew (macOS)
brew install cosign
macOS 开发者工作站
Go 安装
go install github.com/sigstore/cosign/v2/cmd/cosign@latest
已有 Go 环境的团队
验证安装: 执行 cosign version 确认版本号与构建信息。建议使用 v2.x 以上版本以支持 OIDC Keyless 签名。

4.2 密钥对生成

Cosign 支持两种签名模式:本地密钥对(适用于私有仓库或离线环境)与 Keyless 模式(基于 OIDC 身份,适用于公共仓库)。本节聚焦密钥对生成流程。

4.2.1 生成密钥对

使用 cosign generate-key-pair 命令创建一对加密密钥:

cosign generate-key-pair
# 输出示例:
# Enter password for private key: ********
# Enter password for private key again: ********
# Private key written to cosign.key
# Public key written to cosign.pub

生成的文件说明:

  • cosign.key — 私钥文件,必须安全存储,用于签名操作。
  • cosign.pub — 公钥文件,可公开分发,用于验证签名。
安全提示: 私钥密码强度建议不低于 16 位,包含大小写字母与特殊字符。私钥文件应纳入密钥管理系统(KMS)或硬件安全模块(HSM)管理,避免明文存储在代码仓库中。

4.2.2 密钥对结构示意

下图展示了密钥对生成后的文件关系与后续签名验证流程:

Cosign 密钥对生成与签名验证流程 Cosign 密钥对生成与签名验证流程 cosign generate-key-pair cosign.key (私钥) cosign.pub (公钥) cosign sign (签名) cosign verify (验证) 私钥签名 → 公钥验证 密钥对不可互换使用

4.3 对容器镜像进行签名

完成密钥对生成后,即可对容器镜像执行签名操作。签名过程会将签名数据附加到镜像的 OCI 制品清单中,或上传至独立的 OCI 仓库。

4.3.1 签名命令与参数

cosign sign --key cosign.key <镜像引用>

示例:对 registry.example.com/app:v1.0.0 进行签名:

cosign sign --key cosign.key registry.example.com/app:v1.0.0
# 输入私钥密码后,输出签名摘要与签名位置

4.3.2 签名流程关键步骤

  1. 镜像拉取与摘要计算 — Cosign 从仓库拉取镜像清单,计算 SHA256 摘要。
  2. 签名生成 — 使用私钥对镜像摘要进行加密签名,生成签名载荷。
  3. 签名上传 — 将签名载荷以 OCI 制品形式推送到镜像仓库(通常存储在 :sha256-xxx.sig 标签下)。

4.3.3 签名验证

使用公钥验证镜像签名的完整性与来源:

cosign verify --key cosign.pub registry.example.com/app:v1.0.0

验证成功时输出签名信息,包括签名者身份、签名时间与镜像摘要;失败则返回错误码与原因。

关键概念: Cosign 签名不修改原始镜像层数据,而是以 OCI 制品形式独立存储签名元数据。这使得签名操作对镜像运行时无侵入,且支持多签名者共存。

4.4 签名链路与 Istio 安全策略的关联

在 IDP 制品签名链路中,Cosign 签名是上游信任锚点。Istio 安全策略(如 AuthorizationPolicy)可通过 OPA 或自定义适配器,在运行时验证工作负载所使用镜像的 Cosign 签名状态,实现“未签名不部署、签名无效不通信”的零信任原则。

阶段 工具 / 组件 产出物 下游消费方
密钥生成 Cosign cosign.key / cosign.pub CI/CD 签名节点
镜像签名 Cosign + 私钥 OCI 签名制品 (.sig) 镜像仓库 / 策略引擎
签名验证 Cosign + 公钥 验证通过/失败状态 准入控制器 / Istio 策略
实践建议: 在 CI/CD 流水线中,将 cosign sign 步骤置于镜像构建与推送之后、安全扫描之前。公钥应通过 ConfigMap 或 OCI 制品分发给验证端,避免硬编码。