配置用户指定的服务账号

如需在 Cloud Build 中遵循最低权限原则,您可以将 Cloud Build 配置为使用权限仅足以执行构建的服务账号。本页介绍了如何设置服务账号。

如果您未指定服务账号,Cloud Build 可能会自动选择一个服务账号来代表您执行构建。此服务账号可能拥有不必要的广泛权限,例如对您的 Cloud Source Repositories 和项目中的任何 Cloud Storage 存储分区的访问权限。

为了提高项目的安全状况并降低错误配置或恶意用户的潜在影响,我们建议您遵循最小权限原则。采用此原则后,您可以向每个服务账号分配与其执行的任务范围相符的权限和角色。例如,您可以使用一个服务账号来构建映像并将其推送到 Artifact Registry,如 Google Cloud 博客中所示。

准备工作

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • 如果您打算使用此账号创建和管理凭据(例如创建短期有效的凭据),请启用 IAM Service Account Credentials API。

    Enable the API

  • 如果您还没有创建服务账号,请先创建一个。

授予 IAM 权限

如需允许 build 访问其需要连接到的服务,您必须授予一些角色和权限:

  1. 打开 Cloud Build 的“设置”页面:

    打开 Cloud Build 的“设置”页面

    您将会看到服务账号权限标签页:

    “服务账号权限”页面的屏幕截图

  2. 从下拉列表中,选择您要更改角色的服务账号。

  3. 将您要添加的角色的状态设置为启用

  4. 如果您需要为 build 流水线授予的角色未在此处列出,您可以在 IAM 配置页面中授予其他角色

如需详细了解构建通常需要的角色,请参阅配置对 Cloud Build 资源的访问权限以及 Cloud Build IAM 角色和权限的完整列表。

设置构建日志

为构建指定您自己的服务账号时,您必须将构建日志存储在 Cloud Logging 或用户创建的 Cloud Storage 存储分区中。您不能将日志存储在默认日志存储分区中。

使用配置文件执行 build

如需使用配置文件手动运行 build,请执行以下操作:

  1. 在项目根目录中,创建一个名为 cloudbuild.yamlcloudbuild.json 的Cloud Build 构建配置文件。

  2. 添加 serviceAccount 字段和首选日志记录设置。

    • 如果您将构建日志存储在 Cloud Logging 中,请添加 logging 字段并将字段的值设置为 CLOUD_LOGGING_ONLY

    • 如果要将构建日志存储在用户创建的 Cloud Storage 存储分区中,请执行以下操作:

      • 添加 logging 字段并将其值设置为 GCS_ONLY
      • 添加 logsBucket 字段,并将其值设置为您的 Cloud Storage 存储桶位置。

    以下示例将 Cloud Build 配置为使用用户指定的服务账号执行构建,并将构建日志配置为存储在用户创建的 Cloud Storage 存储分区中:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    
    

    将构建配置文件中的占位值替换为以下内容:

    • LOGS_BUCKET_LOCATION:用于存储构建日志的 Cloud Storage 存储桶。例如 gs://mylogsbucket
    • PROJECT_ID 是运行构建的 Google Cloud 项目的 ID。
    • SERVICE_ACCOUNT 是您要为构建指定的服务账号的电子邮件地址或唯一 ID。 例如,服务账号电子邮件地址如下所示:service-account-name@project-id.iam.gserviceaccount.com
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    将上述命令中的占位值替换为以下内容:

    • CONFIG_FILE_PATH 是构建配置文件的路径。
    • SOURCE_DIRECTORY 是源代码的路径或网址。

    如果您未在 gcloud builds submit 命令中指定 CONFIG_FILE_PATHSOURCE_DIRECTORY,Cloud Build 会假定构建配置文件和源代码位于当前工作目录中。

使用触发器执行 build

如需使用您自己的服务账号通过 Cloud Build 触发器执行构建,请设置首选日志记录选项,并在创建触发器时选择首选服务账号。

  1. 在构建配置文件中:

    • 如果您将构建日志存储在 Cloud Logging 中,请添加 logging 字段并将字段的值设置为 CLOUD_LOGGING_ONLY

    • 如果要将构建日志存储在用户创建的 Cloud Storage 存储分区中,请执行以下操作:

      • 添加 logging 字段并将其值设置为 GCS_ONLY
      • 添加 logsBucket 字段,并将其值设置为您的 Cloud Storage 存储桶位置。

    以下示例将构建日志配置为存储在用户创建的 Cloud Storage 存储分区中:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    

    LOGS_BUCKET_LOCATION 替换为用于存储 build 日志的 Cloud Storage 存储分区。例如 gs://mylogsbucket

  2. 指定要用于构建触发器的服务账号:

    控制台

    如需使用 Google Cloud 控制台中的“触发器”页面运行 build,用户指定的服务账号必须与 build 触发器位于同一项目中。如需将触发器与跨项目服务账号搭配使用,请使用 gcloud 工具创建构建触发器。

    1. 创建或修改构建触发器

    2. 服务账号字段中,指定您的服务账号。如果您未指定服务账号,则 Cloud Build 会使用默认服务账号

    3. 点击创建以保存您的构建触发器。

    gcloud

    创建构建触发器时,请使用 --service-account 标志指定服务账号。在以下示例中,gcloud 命令会创建一个用于从 Git 代码库拉取代码的构建触发器:

    gcloud builds triggers create github \
       --name=TRIGGER_NAME \
       --repo-name=REPO_NAME \
       --repo-owner=REPO_OWNER \
       --branch-pattern=BRANCH_PATTERN
       --build-config=BUILD_CONFIG_FILE
       --service-account=SERVICE_ACCOUNT
       --project=BUILD_PROJECT
    

    将构建配置文件中的占位值替换为以下内容:

    • TRIGGER_NAME 是构建触发器的名称。
    • REPO_NAME 是代码库的名称。
    • REPO_OWNER 是代码库所有者的用户名。
    • BRANCH_PATTERN 是代码库中要在其上调用构建的分支名称。
    • TAG_PATTERN 是代码库中要在其上调用构建的标记名称。
    • BUILD_CONFIG_FILE 是构建配置文件的路径。
    • SERVICE_ACCOUNT 是您的服务账号,格式为 /projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL
    • BUILD_PROJECT 是您要开始构建的项目。

跨项目设置

如果用户指定的服务账号位于与您启动构建的项目不同的项目中,请授予必要的访问权限:

  • 在具有用户指定的服务账号的项目中,确保未强制执行 iam.disableCrossProjectServiceAccountUsage 组织政策限制条件。默认情况下,系统会强制执行此限制条件。如需停用此组织政策限制条件,请运行以下命令,其中 SERVICE_ACCOUNT_PROJECT_ID 是包含用户指定的服务账号的项目:

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    
  • 在包含用户指定的服务账号的项目中,为运行构建所在项目的 Cloud Build 服务代理授予 roles/iam.serviceAccountTokenCreator 角色:

    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member="serviceAccount:BUILD_SERVICE_AGENT" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    将命令中的占位值替换为以下内容:

    • SERVICE_ACCOUNT_PROJECT_ID:包含用户指定的服务账号的项目的项目 ID。
    • BUILD_SERVICE_AGENT:服务代理的电子邮件 ID,格式为 service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com,其中 BUILD_PROJECT_NUMBER 是您运行 build 的项目的项目编号。您可以从项目设置页面获取项目编号。

限制:

  • 您的 Google Cloud 项目必须位于某个 Google Cloud 组织中。

  • 您必须使用 gcloud builds submitgcloud builds triggers create 在命令行中启动 build。如需使用 Google Cloud 控制台中的“触发器”页面,用户指定的服务账号和 build 触发器必须位于同一项目中。

后续步骤