本页面介绍了如何使用 Cloud Build 保护 Cloud Run 和 Google Kubernetes Engine 中的映像部署。
了解如何配置 Binary Authorization 以检查构建 证明,并阻止部署非 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 证明者,请在该项目中运行构建。
如需仅允许部署 Cloud Build 构建的映像,请执行以下步骤:
控制台
转到Binary Authorization页面中的 Google Cloud 控制台:
在政策标签页中,点击修改政策。
在修改政策对话框中,选择只允许已被以下所有证明者批准的映像。
点击添加证明者。
在添加证明者对话框中,执行以下操作:
- 选择根据项目和证明者名称添加并执行以下步骤:
- 在项目名称字段中,输入在其中运行 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。
您可以在 Binary Authorization 日志消息中查看政策错误,适用于 GKE 或 Cloud Run
使用试运行模式
在试运行模式下,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 会为您的映像启用证明生成和 来源元数据。
查看证明者元数据
首次在项目中运行构建时,系统会创建 证明者。证明者 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"