3. 签名链路核心组件:签名密钥管理(HSM/KMS)、签名工具(Cosign/GPG)、签名验证网关
签名链路的可靠性取决于三个核心组件的协同工作:密钥管理提供安全的签名材料,签名工具执行签名操作,验证网关确保签名在部署前被正确校验。在回滚场景中,这三个组件必须支持历史密钥的追溯和旧签名的重新验证。
3.1 签名密钥管理:HSM 与 KMS
密钥管理是签名链路的安全基石。生产环境中,私钥绝不能以明文形式存储在构建节点或代码仓库中。企业级方案通常采用硬件安全模块(HSM)或云密钥管理服务(KMS)。
| 特性 | HSM(硬件安全模块) | KMS(密钥管理服务) |
|---|---|---|
| 部署形态 | 物理设备或云HSM实例 | 云服务API(AWS KMS / Azure Key Vault / GCP Cloud KMS) |
| 密钥存储 | 专用硬件,防篡改 | 软件+硬件安全区,由云厂商管理 |
| 签名速率 | 高,取决于设备规格 | 受API限速和网络延迟影响 |
| 密钥轮换 | 需手动或脚本触发 | 支持自动轮换策略 |
| 回滚支持 | 需保留旧密钥槽位 | 支持多版本密钥,可禁用旧版本 |
| 合规认证 | FIPS 140-2 Level 3 | FIPS 140-2 Level 2/3(视服务) |
回滚关键点:密钥管理组件必须支持密钥版本化。当回滚到旧版本制品时,验证网关需要能够获取到当初签名时使用的公钥版本。KMS 的密钥版本 ID 和 HSM 的密钥标签(Key Label)是实现这一追溯能力的基础。
3.2 签名工具:Cosign 与 GPG
签名工具负责调用密钥管理组件,对制品进行签名或验证。在云原生生态中,Cosign 已成为容器镜像签名的标准工具,而 GPG 则广泛用于通用文件签名。
3.2.1 Cosign(容器镜像签名)
Cosign 支持与 KMS/HSM 集成,通过 PKCS#11 接口或云厂商 SDK 调用签名操作。其签名结构包含负载、签名值和公钥信息,存储在 OCI 仓库中。
# 使用 Cosign 对镜像进行签名(引用 KMS 密钥)
cosign sign --key gcpkms://projects/my-project/locations/global/keyRings/my-ring/cryptoKeys/my-key/versions/1 \
registry.example.com/my-app:v2.1.0
# 验证签名(自动获取公钥)
cosign verify --key gcpkms://projects/my-project/locations/global/keyRings/my-ring/cryptoKeys/my-key/versions/1 \
registry.example.com/my-app:v2.1.0
3.2.2 GPG(通用文件签名)
GPG 使用非对称密钥对,适合对 Helm Chart、JAR 包、配置文件等非容器制品进行签名。在回滚场景中,GPG 的密钥吊销和过期机制需要特别管理。
# 使用 GPG 对 Helm Chart 进行签名
gpg --local-user "release-engineering@company.com" \
--detach-sign --armor \
--output my-chart-1.2.3.tgz.asc \
my-chart-1.2.3.tgz
# 验证签名
gpg --verify my-chart-1.2.3.tgz.asc my-chart-1.2.3.tgz
| 对比维度 | Cosign | GPG |
|---|---|---|
| 适用对象 | 容器镜像、OCI 制品 | 通用文件、Helm Chart、二进制包 |
| 密钥管理集成 | 原生支持 KMS/HSM(PKCS#11) | 需通过 gpg-agent 或 smartcard |
| 签名存储 | OCI 仓库(与镜像同仓库) | 独立 .asc 文件或内嵌 |
| 回滚验证 | 支持多签名,可保留历史签名 | 需保留旧公钥环 |
| 密钥轮换 | 通过 KMS 版本管理 | 通过子密钥或新密钥对 |
3.3 签名验证网关
签名验证网关是部署流水线的最后一道安全门。它拦截所有即将部署的制品,在准入前执行签名校验。在回滚场景中,网关必须能够验证历史版本的签名,即使该签名使用的密钥已被轮换。
核心要求:验证网关必须维护一个可信公钥池,包含所有历史版本的公钥。仅验证最新公钥会导致回滚到旧版本时验证失败,从而阻塞回滚流程。
3.4 回滚场景下的组件协同
当触发回滚操作时,三个核心组件必须按以下顺序协同工作:
- 制品定位:从制品仓库中定位目标回滚版本及其关联签名文件。
- 密钥追溯:验证网关从签名元数据中提取密钥版本 ID,向 KMS/HSM 请求对应版本的公钥。
- 签名验证:使用追溯到的公钥对制品签名进行校验,确认制品未被篡改。
- 准入决策:验证通过后,网关允许该制品进入部署环境;验证失败则阻断回滚并告警。
常见陷阱:如果密钥管理组件在轮换后删除了旧版本密钥,验证网关将无法获取对应公钥,导致回滚被永久阻塞。建议为 KMS 密钥设置禁用而非删除策略,并为 HSM 中的旧密钥设置只读导出权限。
3.5 组件选型建议
| 场景 | 推荐密钥管理 | 推荐签名工具 | 验证网关方案 |
|---|---|---|---|
| 容器镜像流水线 | AWS KMS / GCP Cloud KMS | Cosign | Kyverno + Cosign 验证 |
| Helm Chart 部署 | Azure Key Vault | GPG + Helm Provenance | Helm 内置验证 + OPA Gatekeeper |
| 通用二进制/配置文件 | HSM(本地部署) | GPG | 自定义验证代理 |
| 混合云/多云环境 | Hashicorp Vault(KMS 引擎) | Cosign + GPG | Vault 签名验证 API |