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 工作流程
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 容器运行时安全基线检查
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 配置应使用工作负载身份联合,避免在代码中硬编码密钥。