3. 环境准备:安装 Cosign CLI、配置 OpenID Connect (OIDC) 身份提供者、设置容器运行时环境

本章是《镜像安全实战》课程的实操起点。在开始签名和验证镜像之前,必须完成三个核心环境的搭建:Cosign CLI(签名工具)、OIDC 身份提供者(密钥管理基础)以及容器运行时(镜像执行环境)。以下步骤均经过生产环境验证,请按顺序执行。

前置检查:确保你拥有 Linux/macOS 终端(Windows 建议使用 WSL2),并已安装 Docker Engine 或 containerd。本教程以 Docker 作为默认容器运行时。

3.1 安装 Cosign CLI

Cosign 是 Sigstore 项目下的容器签名工具,支持密钥对、密钥托管(Keyless)以及硬件安全模块(HSM)三种签名模式。推荐使用最新稳定版本 v2.x。

3.1.1 安装方式对比

安装方式 适用平台 命令/步骤 验证命令
Linux (deb/rpm) Ubuntu/Debian, Fedora/CentOS sudo dpkg -i cosign.deb 或 sudo rpm -ivh cosign.rpm cosign version
macOS (Homebrew) macOS brew install cosign cosign version
Go 安装 任意(需 Go 1.18+) go install github.com/sigstore/cosign/v2/cmd/cosign@latest cosign version
二进制下载 Linux/macOS/Windows 从 GitHub Releases 下载对应架构的二进制文件 ./cosign version

3.1.2 推荐安装步骤(Linux 示例)

# 1. 下载最新版 Cosign(v2.4.1 为例)
wget https://github.com/sigstore/cosign/releases/download/v2.4.1/cosign-linux-amd64

# 2. 赋予执行权限并移动到 PATH
chmod +x cosign-linux-amd64
sudo mv cosign-linux-amd64 /usr/local/bin/cosign

# 3. 验证安装
cosign version

# 4. (可选)安装 Cosign 的 Docker 插件,支持 docker cosign 子命令
cosign docker-install
输出示例:
______ ______ _______. __ _______ .__ __.
/ | / __ \ / || | / _____|| \ | |
| ,----'| | | | | (----`| | | | __ | \| |
| | | | | | \ \ | | | | |_ | | . ` |
| `----.| `--' | .----) | | | | |__| | | |\ |
\______| \______/ |_______/ |__| \______| |__| \__|
cosign: 2.4.1
GitVersion: v2.4.1
...

3.2 配置 OpenID Connect (OIDC) 身份提供者

OIDC 是 Cosign Keyless 签名的核心依赖。通过 OIDC,Cosign 可以获取短期身份令牌,无需管理长期密钥。本课程使用 GitHub OIDC 作为身份提供者,因为它与 CI/CD 集成最紧密,且免费。

3.2.1 OIDC 工作流程

OIDC 身份验证流程(Cosign Keyless 模式) 开发者/CI 流水线 OIDC 身份提供者 Fulcio(证书颁发) Rekor(透明日志) 容器镜像仓库 1. 请求身份令牌 2. 验证身份 3. 请求签名证书 4. 记录到 Rekor 5. 签名镜像并推送 说明:Keyless 模式下,Cosign 不生成长期密钥,而是通过 OIDC 获取短期证书,签名后证书自动记录到 Rekor 透明日志。 验证者只需查询 Rekor 即可验证签名,无需预先导入公钥。

3.2.2 配置 GitHub OIDC(推荐)

GitHub Actions 原生支持 OIDC,无需额外配置身份提供者。只需在 GitHub 仓库设置中启用 OIDC 权限:

# 在 .github/workflows/ 的 workflow 文件中添加以下权限
permissions:
  id-: write   # 允许获取 OIDC 令牌
  contents: read    # 读取仓库内容

3.2.3 配置其他 OIDC 提供者(可选)

提供者 Issuer URL 客户端 ID 适用场景
Google Cloud https://accounts.google.com 从 GCP Workload Identity 获取 GKE、Cloud Run
Microsoft Azure https://login.microsoftonline.com/{tenant-id}/v2.0 Azure AD 应用注册 AKS、Azure Container Registry
GitLab https://gitlab.com GitLab CI/CD 内置 GitLab CI/CD 流水线
自定义 OIDC 自定义 URL 手动注册 企业内部身份系统
安全提示:OIDC 令牌有效期通常为 5-10 分钟。不要在日志中打印或持久化存储 OIDC 令牌。Cosign 会自动处理令牌的获取和刷新。

3.3 设置容器运行时环境

容器运行时负责拉取、运行和管理容器镜像。Cosign 签名验证需要运行时支持 OCI 镜像规范。本课程以 Docker Engine 为主,同时介绍 containerd 的配置方法。

3.3.1 Docker Engine 安装与配置

# Ubuntu/Debian 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
newgrp docker

# 验证安装
docker --version
docker run hello-world

3.3.2 配置镜像仓库认证

Cosign 需要访问镜像仓库来读取/写入签名。配置 Docker 凭证以便 Cosign 可以透明使用:

# 登录到 Docker Hub(或其他 OCI 兼容仓库)
docker login

# 登录到私有仓库(如 Harbor、GitHub Container Registry)
docker login ghcr.io -u YOUR_USERNAME --password-stdin < .txt

# 验证凭证是否生效
cat ~/.docker/config.json

3.3.3 容器运行时安全基线检查

容器运行时安全基线检查清单 ✅ 运行时版本 Docker ≥ 24.0 ✅ 非 root 运行 用户命名空间 ✅ 镜像拉取策略 always 或 digest ✅ 日志审计 Docker 事件日志 ✅ 网络隔离 默认 bridge 限制 ✅ 资源限制 CPU/内存配额 提示:以上基线检查可通过 docker info、docker system df 和 docker events 命令验证。

3.4 环境验证脚本

完成上述安装后,运行以下脚本验证所有组件是否就绪:

#!/bin/bash
# cosign-env-check.sh - 环境验证脚本

echo "=== Cosign 环境验证 ==="

# 1. 检查 Cosign
if command -v cosign > /dev/null 2>&1; then
    echo "✅ Cosign 版本: $(cosign version 2>&1 | grep 'GitVersion' | awk '{print $2}')"
else
    echo "❌ Cosign 未安装"
fi

# 2. 检查 Docker
if command -v docker > /dev/null 2>&1; then
    echo "✅ Docker 版本: $(docker --version 2>&1)"
    echo "✅ Docker 运行状态: $(docker info 2>&1 | grep 'Server Version')"
else
    echo "❌ Docker 未安装"
fi

# 3. 检查 OIDC 令牌获取能力(需要 GitHub Actions 环境)
if [ -n "$ACTIONS_ID__REQUEST_" ]; then
    echo "✅ GitHub OIDC 令牌可用"
else
    echo "⚠️  非 GitHub Actions 环境,OIDC 令牌需手动配置"
fi

# 4. 检查镜像仓库登录状态
if [ -f ~/.docker/config.json ]; then
    echo "✅ Docker 凭证已配置"
else
    echo "⚠️  未检测到 Docker 凭证,请执行 docker login"
fi

echo "=== 验证完成 ==="
预期输出(全部通过):
=== Cosign 环境验证 ===
✅ Cosign 版本: v2.4.1
✅ Docker 版本: Docker version 24.0.7, build afdd53b
✅ Docker 运行状态: Server Version: 24.0.7
⚠️ 非 GitHub Actions 环境,OIDC 令牌需手动配置
✅ Docker 凭证已配置
=== 验证完成 ===

3.5 常见问题与排错

问题 可能原因 解决方案
cosign: command not found Cosign 未加入 PATH 检查 /usr/local/bin/cosign 是否存在,或使用路径
Error: no OIDC found 非 CI 环境且未配置 OIDC 使用 cosign generate-key-pair 生成本地密钥对,或配置 OIDC 环境变量
denied: requested access to the resource is denied 镜像仓库认证失败 执行 docker login 并检查 ~/.docker/config.json
FATA[0000] error getting credentials Docker 凭证助手未安装 安装 docker-credential-helpers 或使用 docker login 存储明文凭证
生产环境建议:在 CI/CD 流水线中,建议将 Cosign 和 Docker 的安装步骤写入 Dockerfile 或使用官方 Action(如 sigstore/cosign-installer),确保每次构建环境一致。OIDC 配置应使用工作负载身份联合,避免在代码中硬编码密钥。