配置用户指定的服务账号

为了遵循 Cloud Storage 中的最小权限原则, 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. 如果此处未列出构建流水线所需的角色,您可以授予 更多角色

您可以详细了解 请参阅配置对 Cloud Build 的访问权限 资源以及 Cloud Build IAM 的完整列表 角色和权限

设置构建日志

当您为 build 指定自己的服务账号时,必须存储您的 build Cloud Logging 或用户创建的 Cloud Storage 存储桶中。您 无法将您的日志存储在默认日志存储桶中。

使用配置文件执行构建

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

  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 替换为 用于存储构建日志的 Cloud Storage 存储桶。例如 gs://mylogsbucket

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

    控制台

    如需使用 Google Cloud 控制台中的“触发器”页面运行构建, 用户指定的服务账号必须与您的 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
    
  • 在具有用户指定的服务账号的项目中, roles/iam.serviceAccountTokenCreator 角色 您所在项目的 Cloud Build 服务代理 运行 build:

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

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

    • SERVICE_ACCOUNT_PROJECT_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。如需使用 Google Cloud 控制台中的“触发器”页面,请执行以下操作: 用户指定的服务账号和构建触发器必须位于同一 项目。

后续步骤