保护 Cloud Run 和 Google Kubernetes Engine 中的映像部署

本页面介绍了如何使用 Cloud Build 保护 Cloud Run 和 Google Kubernetes Engine 中的映像部署。

了解如何配置 Binary Authorization 以检查 build 证明,并阻止部署并非由 Cloud Build 生成的映像。此流程可降低部署未经授权的软件的风险。

准备工作

  1. 启用 Cloud Build API、Binary Authorization API 和 Artifact Registry API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    启用 API

  2. 如需使用本指南中的命令行示例,请安装并配置 Google Cloud SDK

  3. 为您的平台设置 Binary Authorization

使用 Binary Authorization 控制部署

Binary Authorization 中的政策是一组规则,用于管理映像的部署。您可以将规则配置为要求具有数字签名的证明

Cloud Build 会在构建时生成证明并进行签名。借助 Binary Authorization,您可以使用 built-by-cloud-build 证明者来验证证明,并仅部署 Cloud Build 构建的映像。

如需在项目中创建 built-by-cloud-build 证明者,请在该项目中运行 build。

如需仅允许部署 Cloud Build 构建的映像,请执行以下步骤:

控制台

  1. 前往 Google Cloud 控制台中的 Binary Authorization 页面:

    转到 Binary Authorization

  2. 政策标签页中,点击修改政策

  3. 修改政策对话框中,选择只允许已被以下所有证明者批准的映像

  4. 点击添加证明者

  5. 添加证明者对话框中,执行以下操作:

    1. 选择根据项目和证明者名称添加并执行以下步骤:
      1. 项目名称字段中,输入在其中运行 Cloud Build 的项目。
      2. 点击证明者名称字段,可看到 built-by-cloud-build 证明者可用。
      3. 点击 built-by-cloud-build
    2. 或者,您也可以选择根据证明者资源 ID 添加。在证明者资源 ID 中,输入以下内容:

      projects/PROJECT_ID/attestors/built-by-cloud-build
      

      PROJECT_ID 替换为运行 Cloud Build 的项目。

  6. 点击添加 1 个证明者 (Add 1 attestor)。

  7. 点击保存政策

gcloud

  1. 使用以下命令将现有政策导出到一个文件中:

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. 修改政策文件。

  3. 修改以下规则之一:

    • defaultAdmissionRule
    • clusterAdmissionRules
    • istioServiceIdentityAdmissionRules
    • kubernetesServiceAccountAdmissionRules
  4. 如果还没有 requireAttestationsBy 块,请将其添加到规则中。

  5. requireAttestationsBy 块中,添加以下内容:

    projects/PROJECT_ID/attestors/built-by-cloud-build
    

    PROJECT_ID 替换为运行 Cloud Build 的项目。

  6. 保存政策文件。

  7. 导入政策文件。

    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。

您可以在 GKECloud Run 的 Binary Authorization 日志消息中查看政策错误

使用试运行模式

在试运行模式下,Binary Authorization 会检查政策合规性,而不会实际阻止部署。相反,政策合规性状态消息会记录到 Cloud Logging 中。您可以使用这些日志来确定阻止政策是否正常运行以及识别假正例。

如需启用试运行,请执行以下操作:

控制台

  1. 前往 Google Cloud 控制台中的 Binary Authorization 页面。

    转到 Binary Authorization

  2. 点击修改政策

  3. 默认规则或特定规则中,选中试运行模式

  4. 点击保存政策

gcloud

  1. 将 Binary Authorization 政策导出到 YAML 文件:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 在文本编辑器中,将 enforcementMode 设置为 DRYRUN_AUDIT_LOG_ONLY 并保存文件。

  3. 如需更新政策,请执行以下命令以导入文件:

    gcloud container binauthz policy import /tmp/policy.yaml
    

您可以在 GKECloud 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"

后续步骤