本教程演示了如何使用 OpenSSF Scorecard 检查容器映像以获取供应链安全性最佳实践。Scorecard 证明者在 Cloud Build 流水线中运行来生成证明,该证明可在部署前由 Binary Authorization 进行验证。此验证步骤可防止遭入侵的容器工件部署到生产环境,从而避免出现多种供应链漏洞。
概览
Open Source Security Foundation (OpenSSF) 是一个为开源安全计划提供工具、服务和基础架构的组织。Scorecard 是由 OpenSSF 维护的工具,用于扫描源代码管理 (SCM) 代码库以获取供应链安全性最佳实践。
Scorecard 证明者是内置于 Scorecard 中的工具,可让您根据您配置的政策创建 Binary Authorization 证明。Scorecard 证明者会针对容器映像的 SCM 代码库运行 Scorecard,生成结果,根据政策评估结果,并在满足政策时生成证明。
在本教程中,您将构建一个示例代码库,然后使用 Scorecard 证明者。每个示例流水线都包含以下构建步骤:
build
:构建示例容器映像。push
:将映像推送到 Container Registry。attest
:检查映像并进行签名,使用 Scorecard 证明者根据政策创建证明。
在每个流水线的 attest
步骤中,Scorecard 证明者会执行以下操作:
- 提取有关新构建的容器映像的 SCM 代码库的数据。
- 对原始数据运行 Scorecard,并根据用户指定的政策评估 SCM 代码库。
- 如果满足所有政策,则 Scorecard 证明者会创建证明。
- 如果不满足任何政策,则 Scorecard 证明者不会创建证明。
在部署时,Binary Authorization 会检查是否存在可验证的证明。如果没有可验证的证明,强制执行程序会禁止部署映像。
费用
本教程使用以下 Google Cloud 产品。
- Container Registry
- Artifact Analysis
- Cloud Build
- Cloud Key Management Service
请使用价格计算器根据您的预计使用情况来估算费用。
目标
在本教程中,您将执行以下操作:
- 将 Scorecard 证明者设置为 Cloud Build 自定义构建器。
- 查看和配置 Scorecard 证明者政策。
- 对示例代码库运行 Scorecard 证明者,以根据政策创建证明。
- 在“仅验证”模式下对示例代码库运行 Scorecard 证明者,而不会创建证明。## 准备工作
在本部分中,您将对系统执行一次性设置。
设置环境
将您的 Google Cloud 项目存储在环境变量中。
export PROJECT_ID=PROJECT_ID
将 PROJECT_ID 替换为您的 Google Cloud 项目。
将默认项目 ID 设置为您的 Google Cloud 项目:
gcloud config set project $PROJECT_ID
将项目编号存储在环境变量中,以供后续步骤使用:
export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \ --format="value(PROJECT_NUMBER)")
启用 API:
如需确保本指南所需的服务已启用,请执行以下命令:
gcloud services enable \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ containerscanning.googleapis.com \ cloudkms.googleapis.com
设置 IAM 角色
运行以下命令以给 Cloud Build 服务账号配置以下角色:
containeranalysis.notes.editor
:添加 Artifact Analysis Notes Editor 角色以管理证明者。containeranalysis.notes.occurrences.viewer
:添加 Artifact Analysis Occurrences for Notes 角色以管理漏洞和证明发生实例。roles/containeranalysis.occurrences.editor
:添加 Artifact Analysis Occurrences Editor 角色以在 Artifact Analysis 中创建证明发生实例。cloudkms.signer
:添加 Cloud KMS CryptoKey Signer 角色,以允许服务账号访问 Cloud KMS 签名服务。gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
创建 Cloud KMS 签名密钥
Cloud Key Management Service 密钥用于创建证明。
创建名为 scorecard-attestor-key-ring 的新 Cloud KMS 密钥环:
gcloud kms keyrings create scorecard-attestor-key-ring \ --location global
在密钥环中创建名为 scorecard-attestor-key 的新 Cloud KMS 密钥:
gcloud kms keys create scorecard-attestor-key \ --keyring scorecard-attestor-key-ring \ --location global \ --purpose "asymmetric-signing" \ --default-algorithm "rsa-sign-pkcs1-2048-sha256"
将摘要算法和 Cloud KMS 存储在环境变量中,以供后续步骤使用:
export KMS_DIGEST_ALG=SHA256 export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
创建 Binary Authorization 证明者。稍后,Scorecard 证明者会创建与此证明者关联的备注。
gcloud container binauthz attestors create scorecard-attestor \ --attestation-authority-note=scorecard-attestation \ --attestation-authority-note-project=$PROJECT_ID \ --description="Attest that ossf/scorecard policy checks pass"
将 Binary Authorization 证明者与 KMS 密钥相关联:
gcloud container binauthz attestors public-keys add \ --attestor=scorecard-attestor \ --keyversion=1 \ --keyversion-key=scorecard-attestor-key \ --keyversion-keyring=scorecard-attestor-key-ring \ --keyversion-location=global \ --keyversion-project=$PROJECT_ID
如需探索其他签名算法,请参阅创建非对称密钥。
在 Cloud Build 流水线中使用 Scorecard 证明者创建证明
提交属于失败案例的示例构建
在本部分中,您将构建容器映像并使用 OpenSSF Scorecard 检查其供应链安全性实践。映像构建成功,但不会创建证明。基本代码库包含一些不建议的供应链安全性实践,例如在 Dockerfile 中将依赖项取消固定到 Debian 10,以及将已编译的二进制工件签入源代码库。这些实践违反了代码库中的证明政策。
克隆测试代码库:scorecard-binauthz-test-bad。
查看失败案例的证明政策文件。
cat policy-binauthz.yaml
(可选)查看失败案例的构建配置文件。
cat samples/signer/cloudbuild.yaml
提交构建:
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \ --config=cloudbuild.yaml
您应该会看到如下所示的输出:
time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
保存上一个构建的构建 ID:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
验证结果:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
提交属于成功案例的示例构建
在本部分中,您将构建符合其 Scorecard 证明政策的容器映像。在这种情况下,Scorecard 证明者会创建一个证明。
如需将属于成功案例的示例构建提交到 Cloud Build,请运行以下命令:
克隆测试代码库:scorecard-binauthz-test-good。
查看失败案例的证明政策文件。
sh cat policy-binauthz.yaml
(可选)查看失败案例的构建配置文件。
cat samples/signer/cloudbuild.yaml
提交构建:
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \ --config=cloudbuild.yaml
验证结果:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
获取由 Scorecard 构建和检查的容器映像的网址
export IMAGE_URI=$(gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
确认已为容器映像创建了证明。Scorecard 证明者使用备注 ID
ossf-scorecard-attestation
和备注名称projects/${PROJECT_ID}/notes/ossf-scorecard-attestation
。gcloud container binauthz attestations list \ --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \ --filter="resourceUri='https://${IMAGE_URI}'"
清理
如需清理本文档中使用的资源,您可以删除相关项目:
gcloud projects delete $PROJECT_ID