4、环境准备:安装Cosign、配置OIDC身份提供商、初始化Rekor实例

在开始集成Sigstore身份验证与镜像回滚策略之前,必须完成底层工具链的部署与配置。本章节将指导你完成三个核心组件的环境准备:Cosign(签名/验证客户端)、OIDC身份提供商(OIDC IdP,用于自动化身份绑定)以及Rekor(透明性日志实例,用于记录签名元数据)。

环境前提: 以下操作默认在 Linux x86_64 或 macOS ARM64 环境下执行,已安装 Docker 24+ 和 kubectl 1.28+。若使用 Windows,建议通过 WSL2 或 Docker Desktop 的 Linux 容器模式运行。

4.1 安装Cosign CLI

Cosign 是 Sigstore 生态中的客户端工具,负责对容器镜像进行签名、验证和存储。推荐使用官方发布的二进制文件进行安装,以确保版本一致性和签名校验能力。

安装方式 适用场景 命令/步骤
二进制下载(推荐) CI/CD 环境、生产节点 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
Homebrew(macOS) 本地开发工作站 brew install cosign
Go 源码编译 定制化构建或调试 go install github.com/sigstore/cosign/v2/cmd/cosign@latest

安装完成后,执行版本验证命令:

cosign version

输出应包含类似 GitVersion: v2.4.0 的信息。若出现 command not found,请检查 /usr/local/bin 是否在 $PATH 中。

安全提示: 始终从 Sigstore 官方 GitHub Release 页面下载 Cosign 二进制文件,并验证其 GPG 签名或 SLSA provenance。避免使用第三方镜像或未经验证的包管理器源。

4.2 配置OIDC身份提供商

OIDC IdP 是 Sigstore 无密钥签名流程的核心。Cosign 通过 OIDC 协议从 IdP 获取短期身份令牌,并将其绑定到签名证书中。常见的 IdP 包括 GitHub、GitLab、Google 以及自建的 Dex 或 Keycloak。

以下以 GitHub OIDC 为例,展示配置步骤:

  1. 创建 GitHub OIDC 应用:在 GitHub 组织或用户 Settings → Developer settings → OIDC 中,添加一个新的 OIDC 应用。回调 URL 填写 http://localhost:8080/auth/callback(本地开发)或你的 CI 回调地址。
  2. 获取 Issuer URL 与 Client ID:GitHub 的 Issuer URL 固定为 https://.actions.githubusercontent.com。Client ID 由 GitHub 自动生成。
  3. 配置 Cosign 使用 OIDC:设置环境变量或 Cosign 配置文件,指定 IdP 端点。
# 设置 GitHub OIDC 环境变量
export COSIGN_OIDC_ISSUER=https://.actions.githubusercontent.com
export COSIGN_OIDC_CLIENT_ID=your-client-id

# 可选:指定额外的 OIDC 作用域
export COSIGN_OIDC_EXTRA_SCOPES="openid,email"

对于自建 IdP(如 Keycloak),需要额外配置 JWKS 端点 和 令牌签名算法。以下表格对比了常见 IdP 的关键参数:

IdP 类型 Issuer URL 示例 默认令牌格式 是否需要额外配置
GitHub Actions https://.actions.githubusercontent.com JWT (RS256) 否
GitLab CI https://gitlab.com JWT (RS256) 否
Google Cloud IAM https://accounts.google.com JWT (RS256) 需绑定服务账号
Keycloak(自建) https://keycloak.example.com/realms/myrealm JWT (RS256/ES256) 需配置 JWKS 端点
关键概念: OIDC 令牌中的 sub 声明(通常是 repo:owner/repo:ref:refs/heads/main)会被 Cosign 提取并嵌入到签名证书的 SAN(Subject Alternative Name)中。后续验证时,策略引擎会检查 SAN 是否匹配允许的 OIDC 身份。

4.3 初始化Rekor实例

Rekor 是 Sigstore 的透明性日志服务,用于存储所有签名事件的元数据(包括签名哈希、证书指纹、时间戳等)。生产环境中建议使用 Sigstore 公共 Rekor 实例(https://rekor.sigstore.dev),但为了故障排查和离线场景,你可能需要部署私有 Rekor 实例。

以下步骤演示如何使用 Docker Compose 快速启动一个本地 Rekor 实例:

  1. 创建 Docker Compose 文件:
version: '3.8'
services:
  rekor-server:
    image: ghcr.io/sigstore/rekor-server:v1.3.6
    ports:
      - "3000:3000"
    environment:
      - REKOR_ADDRESS=0.0.0.0:3000
      - REKOR_STORAGE_TYPE=memory
      - REKOR_TRUSTED_PUBLIC_KEYS_PATH=/etc/rekor/keys
    volumes:
      - ./keys:/etc/rekor/keys
    command: ["rekor-server", "serve"]

  rekor-cli:
    image: ghcr.io/sigstore/rekor-cli:v1.3.6
    entrypoint: ["/bin/sh"]
    stdin_open: true
    tty: true
  1. 启动服务:
docker-compose up -d rekor-server
  1. 验证 Rekor 实例状态:
curl -s http://localhost:3000/api/v1/log | jq .

成功响应应包含 rootHash、treeSize 等字段,表示日志已初始化。

  1. 配置 Cosign 使用私有 Rekor:
export COSIGN_REKOR_URL=http://localhost:3000
export COSIGN_REKOR_PUBLIC_KEY_PATH=/path/to/rekor-public-key.pem
生产环境注意事项: 私有 Rekor 实例需要配置持久化存储(如 PostgreSQL 或 Trillian 树)、TLS 证书以及访问控制策略。内存模式仅适用于开发测试。此外,必须妥善保管 Rekor 的签名私钥,该密钥用于对日志树头进行签名,一旦泄露将破坏透明性日志的不可篡改性。

4.4 环境验证与集成检查

完成上述安装后,执行以下端到端验证流程,确保三个组件能够协同工作:

  1. 生成测试密钥对:cosign generate-key-pair
  2. 使用 OIDC 令牌签名一个测试镜像:cosign sign --oidc-issuer $COSIGN_OIDC_ISSUER --rekor-url $COSIGN_REKOR_URL your-registry/test-image:latest
  3. 验证签名并查询 Rekor 日志:cosign verify --rekor-url $COSIGN_REKOR_URL your-registry/test-image:latest

若验证通过,Cosign 会输出 Verified OK 以及 Rekor 日志条目索引。此时,环境准备全部完成,可以进入下一阶段的回滚策略与身份验证集成设计。

环境组件架构与交互流程 Cosign CLI 签名 / 验证客户端 OIDC IdP 身份令牌颁发 Rekor 实例 透明性日志 镜像仓库 存储签名 & 镜像 ① 请求令牌 ② 返回 JWT ③ 上传签名元数据 ④ 返回日志索引 ⑤ 推送签名 + 镜像 ⑥ 拉取验证 流程说明:Cosign 首先从 OIDC IdP 获取身份令牌,然后使用该令牌对镜像签名,并将签名元数据上传至 Rekor 实例。 验证时,Cosign 从 Rekor 查询日志条目,并与 OIDC 身份绑定进行比对。