本页面介绍了如何使用 Cloud Build 保护 Cloud Run 和 Google Kubernetes Engine 中的映像部署。
了解如何配置 Binary Authorization 以检查 build 证明,并阻止部署并非由 Cloud Build 生成的映像。此流程可降低部署未经授权的软件的风险。
准备工作
启用 Cloud Build API、Binary Authorization API 和 Artifact Registry API。
启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予角色。如需使用本指南中的命令行示例,请安装并配置 Google Cloud SDK。
使用 Binary Authorization 控制部署
Binary Authorization 中的政策是一组规则,用于管理映像的部署。您可以将规则配置为要求具有数字签名的证明。
Cloud Build 会在构建时生成证明并进行签名。借助 Binary Authorization,您可以使用 built-by-cloud-build 证明者来验证证明,并仅部署 Cloud Build 构建的映像。
如需在项目中创建 built-by-cloud-build 证明者,请在该项目中运行 build。
如需仅允许部署 Cloud Build 构建的映像,请执行以下步骤:
控制台
前往 Google Cloud 控制台中的 Binary Authorization 页面:
在政策标签页中,点击修改政策。
在修改政策对话框中,选择只允许已被以下所有证明者批准的映像。
点击添加证明者。
在添加证明者对话框中,执行以下操作:
- 选择根据项目和证明者名称添加并执行以下步骤:
- 在项目名称字段中,输入在其中运行 Cloud Build 的项目。
- 点击证明者名称字段,可看到
built-by-cloud-build证明者可用。 - 点击
built-by-cloud-build。
或者,您也可以选择根据证明者资源 ID 添加。在证明者资源 ID 中,输入以下内容:
projects/PROJECT_ID/attestors/built-by-cloud-build将
PROJECT_ID替换为运行 Cloud Build 的项目。
- 选择根据项目和证明者名称添加并执行以下步骤:
点击添加 1 个证明者 (Add 1 attestor)。
点击保存政策。
gcloud
使用以下命令将现有政策导出到一个文件中:
gcloud container binauthz policy export > /tmp/policy.yaml修改政策文件。
修改以下规则之一:
defaultAdmissionRuleclusterAdmissionRulesistioServiceIdentityAdmissionRuleskubernetesServiceAccountAdmissionRules
如果还没有
requireAttestationsBy块,请将其添加到规则中。在
requireAttestationsBy块中,添加以下内容:projects/PROJECT_ID/attestors/built-by-cloud-build将
PROJECT_ID替换为运行 Cloud Build 的项目。保存政策文件。
导入政策文件。
gcloud container binauthz policy import /tmp/policy.yaml以下是包含对
built-by-cloud-build-attestor的引用的示例政策文件:defaultAdmissionRule: evaluationMode: REQUIRE_ATTESTATION enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG requireAttestationsBy: - projects/PROJECT_ID/attestors/built-by-cloud-build name: projects/PROJECT_ID/policy将
PROJECT_ID替换为运行 Cloud Build 的项目的项目 ID。
您可以在 GKE 或 Cloud Run 的 Binary Authorization 日志消息中查看政策错误
使用试运行模式
在试运行模式下,Binary Authorization 会检查政策合规性,而不会实际阻止部署。相反,政策合规性状态消息会记录到 Cloud Logging 中。您可以使用这些日志来确定阻止政策是否正常运行以及识别假正例。
如需启用试运行,请执行以下操作:
控制台
前往 Google Cloud 控制台中的 Binary Authorization 页面。
点击修改政策。
在默认规则或特定规则中,选中试运行模式。
点击保存政策。
gcloud
将 Binary Authorization 政策导出到 YAML 文件:
gcloud container binauthz policy export > /tmp/policy.yaml在文本编辑器中,将
enforcementMode设置为DRYRUN_AUDIT_LOG_ONLY并保存文件。如需更新政策,请执行以下命令以导入文件:
gcloud container binauthz policy import /tmp/policy.yaml
您可以在 GKE 或 Cloud Run 的 Binary Authorization 日志消息中查看政策错误
限制
Cloud Build 和 Binary Authorization 必须位于同一项目中。 如果您在另一个项目中运行部署平台,请为多项目设置配置 IAM 角色,并在 Binary Authorization 中添加
built-by-cloud-build证明者时引用 Cloud Build 项目。如果您使用明确的
docker push构建步骤将映像推送到 Artifact Registry,Cloud Build 不会生成证明。确保您在docker build构建步骤中使用images字段将内容推送到 Artifact Registry。如需详细了解images,请参阅在 Artifact Registry 中存储映像的不同方式。您必须为构建流水线和部署流水线使用单独的构建配置文件。这是因为 Cloud Build 仅在构建流水线成功完成后才会生成证明。然后,Binary Authorization 会在部署映像之前检查证明。
在专用池中启用证明
默认情况下,Cloud Build 不会为专用池中的构建生成 Binary Authorization 证明。如需生成证明,请将 requestedVerifyOption: VERIFIED 选项添加到您的build 配置:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
requestedVerifyOption: VERIFIED
添加 requestedVerifyOption 后,Cloud Build 会为您的映像启用证明生成和来源元数据。
查看证明者元数据
首次在项目中运行 build 时,系统会创建证明者。证明者 ID 的格式为 projects/PROJECT_ID/attestors/built-by-cloud-build,其中 PROJECT_ID 是您的项目 ID。
您可以使用以下命令检查构建证明者元数据:
curl -X GET -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://binaryauthorization.googleapis.com/v1beta1/projects/PROJECT_ID/attestors/built-by-cloud-build
将 PROJECT_ID 替换为运行 Cloud Build 的项目。
输出包含关于证明者和相应公钥的信息。例如:
name": "projects/PROJECT_ID/attestors/built-by-cloud-build",
"userOwnedDrydockNote": {
"noteReference": "projects/PROJECT_ID/notes/built-by-cloud-build",
"publicKeys": [
{
"id": "//cloudkms.googleapis.com/v1/projects/verified-builder/locations/asia/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1",
"pkixPublicKey": {
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMMvFxZLgIiWOLIXsaTkjTmOKcaK7\neIZrgpWHpHziTFGg8qyEI4S8O2/2wh1Eru7+sj0Sh1QxytN/KE5j3mTvYA==\n-----END PUBLIC KEY-----\n",
"signatureAlgorithm": "ECDSA_P256_SHA256"
}
},
...
}
],
"delegationServiceAccountEmail": "service-942118413832@gcp-binaryauthorization.iam.gserviceaccount.com"
},
"updateTime": "2021-09-24T15:26:44.808914Z",
"description": "Attestor autogenerated by build ID fab07092-30f4-4f70-caf7-4545cbc404d6"