3. 环境准备:安装 Cosign CLI、配置 OIDC 认证、初始化密钥对
本章是实践课程的基石环节。在开始镜像签名、水位巡检与阈值建模之前,必须完成以下三项核心准备工作:安装 Cosign 命令行工具、配置基于 OIDC 的身份认证、以及初始化用于签名的密钥对(涵盖本地密钥与云密钥管理服务 KMS)。以下步骤均以生产环境稳定性为前提,兼顾安全性与可复现性。
3.1 安装 Cosign CLI
Cosign 是 Sigstore 项目提供的无密钥签名工具,支持多种安装方式。推荐使用官方发布的最新稳定版本,以确保与 Sigstore 生态的兼容性。
| 安装方式 | 适用平台 | 命令 / 步骤 |
|---|---|---|
| Linux (amd64) | Ubuntu / CentOS / Debian | |
| macOS (Intel / Apple Silicon) | Homebrew | |
| Windows | PowerShell | |
| 容器化安装 | Docker / Podman | |
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"
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
awskms://、gcpkms://、azurekms://)透明调用云服务。
3.4 环境准备全景图
下图展示了从工具安装到密钥初始化的完整流程,以及各组件之间的依赖关系:
3.5 常见问题与避坑指南
在 GitHub Actions 中,如果工作流未设置
permissions: id-: write,Cosign 将无法获取 OIDC 令牌,导致签名失败。错误信息通常为 failed to get OIDC : no OIDC available。
Cosign 要求 KMS 密钥使用
EC_P256 或 RSA_2048 算法。如果创建密钥时选择了 EC_P384 或 RSA_4096,Cosign 将无法识别。请严格使用 ec-sign-p256-sha256 或 rsa-sign-pkcs1-2048-sha256。
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> |
验证通过,输出镜像摘要和签名信息 |
完成以上所有步骤后,您的环境已具备执行镜像签名、水位巡检与容量阈值建模的全部前置条件。接下来将进入镜像签名策略与水位指标定义的核心章节。