配置用户指定的服务账号

为了遵循 Cloud Build 中的最小权限原则,您可以配置 Cloud Build 以使用具有执行构建所需的最低权限的服务 账号。本页面介绍了如何设置服务帐号。

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

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

准备工作

授予 IAM 权限

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

  1. 在 Google Cloud 控制台中,前往 Cloud Build 权限 页面:

    前往权限

  2. 前往服务账号 菜单,然后选择您的服务帐号。

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

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

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

设置构建日志

如果您为构建指定自己的服务帐号,则必须将构建日志存储在以下任一类型的存储桶中:

如果您创建了日志存储桶,请确保该存储桶没有保留政策,因为该政策可能会阻止 Cloud Build 将构建日志写入存储桶。

无法 将日志存储在 Google Google Cloud拥有的日志存储桶中。

如需详细了解存储构建日志的位置,请参阅 构建日志存储选项

使用配置文件执行构建

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

  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.
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

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

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

    如果您未在 gcloud builds submit 命令中指定 CONFIG_FILE_PATHSOURCE_DIRECTORY,Cloud 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 替换为用于存储构建日志的 Cloud Storage 存储桶。例如,gs://mylogsbucket

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

    控制台

    如需使用 Google Cloud 控制台中的 “触发器”页面运行构建,用户指定的服务帐号必须与构建 触发器位于同一项目中。如需将触发器与跨项目服务账号搭配使用,请使用 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 组织政策限制条件的情况下,您才能使用用户指定的服务帐号在与创建服务帐号的项目不同的项目中运行构建。默认情况下,此限制条件处于强制执行状态。 了解详情

  • 以下命令会停用该限制条件的强制执行,并授予必要的访问权限。在组织政策中设置限制条件之前,您的组织需要了解所涉及的安全权衡:

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    

    在此命令中,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., 其中 BUILD_PROJECT_NUMBER 是运行构建的 项目的项目编号。您可以从 项目设置页面获取项目编号。

限制

  • 您的 Google Cloud 项目必须位于 Google Cloud 组织内。

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

后续步骤