3. 环境准备:安装 Cosign CLI、配置 OIDC 认证、初始化密钥对

本章是实践课程的基石环节。在开始镜像签名、水位巡检与阈值建模之前,必须完成以下三项核心准备工作:安装 Cosign 命令行工具、配置基于 OIDC 的身份认证、以及初始化用于签名的密钥对(涵盖本地密钥与云密钥管理服务 KMS)。以下步骤均以生产环境稳定性为前提,兼顾安全性与可复现性。

3.1 安装 Cosign CLI

Cosign 是 Sigstore 项目提供的无密钥签名工具,支持多种安装方式。推荐使用官方发布的最新稳定版本,以确保与 Sigstore 生态的兼容性。

安装方式 适用平台 命令 / 步骤
Linux (amd64) Ubuntu / CentOS / Debian
# 下载最新二进制
wget "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign
macOS (Intel / Apple Silicon) Homebrew
brew install cosign
Windows PowerShell
# 使用官方安装脚本
iwr -useb https://github.com/sigstore/cosign/releases/latest/download/cosign-windows-amd64.exe -OutFile cosign.exe
# 将 cosign.exe 添加到 PATH
容器化安装 Docker / Podman
docker pull gcr.io/projectsigstore/cosign:latest
alias cosign='docker run --rm -v $HOME/.cosign:/root/.cosign gcr.io/projectsigstore/cosign:latest'
验证安装: 执行 cosign version 命令,确认输出中包含版本号、GitCommit 以及 BuildDate 信息。若出现 command not found,请检查 PATH 环境变量或二进制文件权限。

3.2 配置 OIDC 认证

OIDC(OpenID Connect)是 Sigstore 无密钥签名流程的核心身份层。通过 OIDC,Cosign 可以自动获取短期有效的身份令牌,无需手动管理长期密钥。本课程以 GitHub Actions 和 Google Cloud Workload Identity Federation 为例进行配置。

3.2.1 理解 OIDC 在 Cosign 中的角色

在无密钥签名模式下,Cosign 使用 OIDC 令牌向 Fulcio(证书颁发机构)证明身份,Fulcio 签发短期证书后,Cosign 使用该证书对镜像进行签名。整个过程无需生成或存储私钥。

关键概念:
  • Issuer(发行者): OIDC 令牌的颁发方,例如 https://.actions.githubusercontent.com(GitHub Actions)或 https://accounts.google.com(Google Cloud)。
  • Subject(主体): 令牌所代表的身份,例如 GitHub 仓库的完整路径或 GCP 服务账号邮箱。
  • Fulcio: Sigstore 的证书颁发机构,验证 OIDC 令牌后签发 X.509 证书。

3.2.2 配置 GitHub Actions OIDC

在 GitHub Actions 工作流中启用 OIDC 认证,需要为工作流分配 id-: write 权限,并配置信任关系。

# .github/workflows/sign-image.yml
name: Sign Container Image with Cosign
on:
  push:
    branches: [ main ]

permissions:
  id-: write   # 允许工作流请求 OIDC 令牌
  contents: read

jobs:
  sign:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Cosign
        run: |
          wget "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
          sudo mv cosign-linux-amd64 /usr/local/bin/cosign
          sudo chmod +x /usr/local/bin/cosign

      - name: Sign the image
        env:
          IMAGE: ghcr.io/${{ github.repository }}:latest
        run: |
          cosign sign --yes $IMAGE

3.2.3 配置 Google Cloud Workload Identity Federation

对于 GCP 环境,需要创建 Workload Identity Pool 和 Provider,并将 GitHub 仓库或 GCP 服务账号映射为 OIDC 主体。

# 创建 Workload Identity Pool
gcloud iam workload-identity-pools create "cosign-pool" \
  --location="global" \
  --display-name="Cosign OIDC Pool"

# 创建 OIDC Provider
gcloud iam workload-identity-pools providers create-oidc "github-provider" \
  --location="global" \
  --workload-identity-pool="cosign-pool" \
  --issuer-uri="https://.actions.githubusercontent.com" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository"

# 绑定服务账号
gcloud iam service-accounts add-iam-policy-binding "cosign-sa@PROJECT.iam.gserviceaccount.com" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/cosign-pool/attribute.repository/your-org/your-repo"
安全提示: OIDC 令牌具有时效性(通常为 5-10 分钟),请勿将令牌硬编码或持久化存储。Cosign 会自动从环境变量 ACTIONS_ID__REQUEST_(GitHub Actions)或 GOOGLE_APPLICATION_CREDENTIALS(GCP)中获取令牌。

3.3 初始化密钥对

虽然 Cosign 支持无密钥签名,但在某些场景下(如离线环境、合规要求、长期密钥管理),仍然需要生成并管理密钥对。本课程同时覆盖本地密钥生成与云 KMS 集成两种模式。

3.3.1 本地密钥对生成

使用 Cosign 内置的 generate-key-pair 命令生成加密密钥对。私钥默认使用密码保护,公钥以 cosign.pub 文件形式输出。

# 生成密钥对(交互式输入密码)
cosign generate-key-pair

# 非交互式生成(通过环境变量传递密码)
export COSIGN_PASSWORD="your-strong-password"
cosign generate-key-pair

# 查看生成的文件
ls -la ~/.cosign/
# 输出示例:
# -rw-------  1 user user  528 Mar 15 10:00 cosign.key
# -rw-r--r--  1 user user  178 Mar 15 10:00 cosign.pub
文件 用途 安全要求
cosign.key 签名私钥(加密存储) 严格访问控制,建议使用硬件安全模块或密钥管理服务
cosign.pub 验证公钥(可公开) 确保完整性,防止篡改

3.3.2 集成密钥管理服务(KMS)

对于生产环境,推荐将私钥托管在云 KMS 中,避免本地密钥泄露风险。Cosign 原生支持 AWS KMS、GCP Cloud KMS、Azure Key Vault 以及 HashiCorp Vault。

以下以 GCP Cloud KMS 为例,展示密钥创建与 Cosign 集成步骤:

# 1. 创建密钥环和密钥
gcloud kms keyrings create "cosign-keyring" --location "global"
gcloud kms keys create "cosign-signing-key" \
  --location "global" \
  --keyring "cosign-keyring" \
  --purpose "asymmetric-signing" \
  --default-algorithm "ec-sign-p256-sha256"

# 2. 授予 Cosign 访问权限
gcloud kms keys add-iam-policy-binding "cosign-signing-key" \
  --location "global" \
  --keyring "cosign-keyring" \
  --member "serviceAccount:cosign-sa@PROJECT.iam.gserviceaccount.com" \
  --role "roles/cloudkms.signerVerifier"

# 3. 使用 KMS 密钥进行签名
cosign sign --key "gcpkms://projects/PROJECT/locations/global/keyRings/cosign-keyring/cryptoKeys/cosign-signing-key/versions/1" \
  --yes ghcr.io/your-org/your-image:latest

# 4. 使用 KMS 密钥进行验证
cosign verify --key "gcpkms://projects/PROJECT/locations/global/keyRings/cosign-keyring/cryptoKeys/cosign-signing-key/versions/1" \
  ghcr.io/your-org/your-image:latest
KMS 优势: 密钥永不离开 KMS 边界;支持自动轮转、访问审计、细粒度权限控制;符合 SOC2、PCI DSS 等合规要求。Cosign 通过 KMS URI 格式(awskms://、gcpkms://、azurekms://)透明调用云服务。

3.4 环境准备全景图

下图展示了从工具安装到密钥初始化的完整流程,以及各组件之间的依赖关系:

环境准备全景图:Cosign + OIDC + 密钥初始化 安装 Cosign CLI 二进制 / Homebrew / Docker 配置 OIDC 认证 GitHub Actions / GCP Workload 初始化密钥对 本地密钥 / KMS 集成 Linux / macOS 多平台支持 版本验证 cosign version Issuer 配置 令牌端点 Subject 映射 身份绑定 本地密钥 cosign.key KMS 云托管 环境准备完成后的关键产物 Cosign CLI 就绪 | OIDC 令牌可自动获取 | 签名密钥对已初始化(本地或 KMS) 下一步:使用 cosign sign 对镜像进行签名,并开始水位巡检 安全基线要求 私钥加密存储 · OIDC 令牌最小权限 · KMS 访问审计启用

3.5 常见问题与避坑指南

避坑 1:OIDC 令牌权限不足
在 GitHub Actions 中,如果工作流未设置 permissions: id-: write,Cosign 将无法获取 OIDC 令牌,导致签名失败。错误信息通常为 failed to get OIDC : no OIDC available。
避坑 2:KMS 密钥算法不匹配
Cosign 要求 KMS 密钥使用 EC_P256 或 RSA_2048 算法。如果创建密钥时选择了 EC_P384 或 RSA_4096,Cosign 将无法识别。请严格使用 ec-sign-p256-sha256 或 rsa-sign-pkcs1-2048-sha256。
最佳实践: 在 CI/CD 流水线中,建议将 Cosign 安装、OIDC 配置和密钥初始化步骤封装为可复用的 Action 或脚本,避免在每个工作流中重复编写。同时,将 KMS 密钥的版本号作为环境变量注入,便于密钥轮转时无需修改代码。

3.6 环境就绪检查清单

在进入下一章之前,请逐项确认以下检查点均已通过:

检查项 验证命令 / 方法 预期结果
Cosign CLI 安装 cosign version 显示版本号、GitCommit、BuildDate
OIDC 令牌获取 在 CI 环境中执行 cosign sign --yes <image> 成功获取令牌并完成签名(可先使用测试镜像)
本地密钥对 ls -la ~/.cosign/ 存在 cosign.key 和 cosign.pub 文件
KMS 密钥集成 cosign sign --key "gcpkms://..." --yes <image> 签名成功,无权限或算法错误
公钥验证 cosign verify --key cosign.pub <image> 验证通过,输出镜像摘要和签名信息

完成以上所有步骤后,您的环境已具备执行镜像签名、水位巡检与容量阈值建模的全部前置条件。接下来将进入镜像签名策略与水位指标定义的核心章节。