使用 Binary Authorization 控制映像部署

本页面介绍了如何使用 Binary Authorization 来仅允许部署 Cloud Build 构建的映像。

准备工作

  1. 启用 Cloud Build, Binary Authorization, and Artifact Registry API。

    启用 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 证明者,请在该项目中运行构建。

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

控制台

  1. 转到 Google Cloud Console 中的 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 Console 中的“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 必须位于同一项目中。如果您在另一个项目中运行部署平台,请在 Binary Authorization 中添加 built-by-cloud-build 证明者时参考 Cloud Build 项目。

在专用池中启用证明

默认情况下,Cloud Build 不会为专用池中的构建生成 Binary Authorization 证明。如需生成证明,请将 requestedVerifyOption: VERIFIED 选项添加到您的构建配置文件

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"

后续步骤