Istio安全策略与制品签名联合验证 - 第4节
4.1 Cosign 工具概述与安装
Cosign 是 Sigstore 项目下的开源容器镜像签名工具,支持对容器镜像进行无密钥(Keyless)或基于密钥对的签名与验证。在 IDP 制品签名链路中,Cosign 承担着“开发者侧签名”与“策略侧验证”的桥梁角色。
4.1.1 安装 Cosign
Cosign 提供多平台二进制与包管理器安装方式,推荐在 CI/CD 节点或开发者工作站上使用以下方法之一:
| 安装方式 | 命令 / 步骤 | 适用场景 |
|---|---|---|
| Linux / macOS (curl) | |
CI/CD 流水线、临时环境 |
| Homebrew (macOS) | |
macOS 开发者工作站 |
| Go 安装 | |
已有 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 密钥对结构示意
下图展示了密钥对生成后的文件关系与后续签名验证流程:
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 签名流程关键步骤
- 镜像拉取与摘要计算 — Cosign 从仓库拉取镜像清单,计算 SHA256 摘要。
- 签名生成 — 使用私钥对镜像摘要进行加密签名,生成签名载荷。
- 签名上传 — 将签名载荷以 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 制品分发给验证端,避免硬编码。