Cloud Build 默认服务账号更改

除非您替换此行为,否则 Cloud Build 会自动选择 Cloud Build 服务账号来代表您执行构建。此默认服务账号可能具有对于您的使用情形而言不必要的广泛权限,例如访问项目中的任何 Cloud Storage 存储桶。

在 2024 年 5 月和 6 月,Cloud Build 在新项目中使用服务账号的默认行为发生了变化,持续了数周时间。这些变化将有助于改善客户未来的默认安全状况。您可以配置组织政策限制条件,选择不采用这些更改。

在此变更之前,Cloud Build 使用 Cloud Build 专用服务账号作为默认服务账号,该服务账号现在称为 Cloud Build 旧版服务账号。

更改后,Cloud Build 现在使用 Compute Engine 默认服务账号作为默认服务账号。

您的项目受到的影响取决于您是否属于某个组织:

  • 没有组织的项目。如果您在更改后首次在项目中运行 build,则该项目默认会使用 Compute Engine 服务账号来执行通过 Cloud Build API 或 Google Cloud CLI 提交的 build。这些项目将无法使用 Cloud Build 旧版服务账号,但可以使用用户指定的服务账号。

  • 与组织关联的项目。如果您在更改后首次在项目中运行 build,则该项目默认会使用 Compute Engine 服务账号来执行通过 Cloud Build API 或 Google Cloud CLI 提交的 build。您可以使用用户指定的服务账号,也可以通过在组织中启用 Cloud Build 服务账号来选择不采用此变更。

  • 没有组织的现有项目。如果您在更改之前在项目中运行了首次 build,则该项目将继续沿用旧行为,默认使用 Cloud Build 旧版服务账号来执行所有 build。您可以继续使用用户指定的服务账号,方法是选择 Compute Engine 服务账号或创建自己的服务账号。

  • 组织中的现有项目。如果您在更改之前在项目中运行了第一个 build,则该项目将继续沿用旧行为,默认使用 Cloud Build 旧版服务账号。您也可以继续使用用户指定的服务账号。

  • 触发。创建或更新触发器时,您必须指定服务账号,除非项目的默认服务账号是 Cloud Build 旧版服务账号。

  • Cloud Build 服务账号:Cloud Build 服务账号将称为 Cloud Build 旧版服务账号。

您需要做些什么?

如果您是某个组织的成员,则您的组织可以通过设置组织政策并选择相应的限制条件来配置所有项目的行为。

您的组织可以设置以下组织政策布尔值限制条件,选择不采用这些更改:

  • 未强制执行:constraints/cloudbuild.disableCreateDefaultServiceAccount
  • 未强制执行:constraints/cloudbuild.useComputeServiceAccount
  • 强制执行:constraints/cloudbuild.useBuildServiceAccount

如果您无法或不想调整组织政策,并且在更改后启用了 Cloud Build API,请验证Compute Engine 默认服务账号或您创建的用户服务账号是否具有足够的 build 权限。具体而言,提交 build 的用户必须拥有服务账号的 iam.serviceAccounts.actAs 权限。

新的组织政策限制条件

Cloud Build 引入了新的组织政策布尔值限制条件,用于配置:

  • 使用 Cloud Build 旧版服务账号的权限。
  • 组织中所有项目的默认服务账号。

如需修改组织政策,您可以使用 Google Cloud 控制台或 Google Cloud CLI:

如需详细了解组织政策,请参阅Organization Policy Service 简介。

配置 Cloud Build 旧版服务账号的可用性

在启用 Cloud Build API 时,为了配置 Cloud Build 旧版服务账号的可用性,Cloud Build 将引入以下布尔值政策限制:

  • 未强制执行:constraints/cloudbuild.disableCreateDefaultServiceAccount。 允许在新项目中使用 Cloud Build 旧版服务账号。

  • 强制执行:constraints/cloudbuild.disableCreateDefaultServiceAccount。 在新项目中停用 Cloud Build 旧版服务账号。这是约束的默认值。

此限制仅影响在更改推出后首次运行 build 的项目。如果您决定不强制执行此政策限制,那么当相应配置处于有效状态时,首次运行 build 的所有项目都将永久受到此变更的影响。如果某个项目的 Cloud Build 旧版服务账号之前可用,您就无法在该项目上切换关闭该服务账号的可用性。不过,即使服务账号可用,您也可以阻止组织中的用户使用该账号,如下一部分所述。

与所有组织政策和限制条件一样,您可以在组织级或项目级设置这些政策。

为组织配置默认服务账号

为了配置组织中使用哪个默认服务账号,Cloud Build 推出了两项新的政策布尔值限制:

  • constraints/cloudbuild.useBuildServiceAccount:配置 Cloud Build 旧版服务账号的使用。
  • constraints/cloudbuild.useComputeServiceAccount:配置 Compute Engine 默认服务账号的使用。

您可以单独配置这些政策,但当在以下场景中结合使用强制执行规则时,这些政策最为有用:

  • 最安全的选项:对于手动提交的 build 和触发的 build,都使用用户指定的服务账号。为此,请在组织政策中设置以下限制条件:

    • 未强制执行:constraints/cloudbuild.useBuildServiceAccount
    • 未强制执行:constraints/cloudbuild.useComputeServiceAccount
  • Compute Engine 默认服务账号:如需将 Compute Engine 默认服务账号用于手动提交的 build 和触发的 build,请在组织政策中设置以下限制:

    • 未强制执行:constraints/cloudbuild.useBuildServiceAccount
    • 强制执行:constraints/cloudbuild.useComputeServiceAccount
  • Cloud Build 旧版服务账号:如果您了解其中涉及的安全权衡,请在组织政策中设置以下限制:

    • 未强制执行:constraints/cloudbuild.disableCreateDefaultServiceAccount
    • 未强制执行:constraints/cloudbuild.useComputeServiceAccount
    • 强制执行:constraints/cloudbuild.useBuildServiceAccount
  • 旧版服务账号和 Compute Engine 默认服务账号:对于在更改之前已启用 Cloud Build API 的项目,继续使用 Cloud Build 旧版服务账号;对于新项目,开始使用 Compute Engine 默认服务账号。如果您了解其中涉及的安全权衡,请在组织政策中设置以下限制条件:

    • 强制执行:constraints/cloudbuild.disableCreateDefaultServiceAccount
    • 强制执行:constraints/cloudbuild.useComputeServiceAccount
    • 强制执行:constraints/cloudbuild.useBuildServiceAccount

IAM 角色指南

iam.automaticIamGrantsForDefaultServiceAccounts 组织政策可防止在创建时向某些默认服务账号授予 Editor 角色 (roles/editor)。此政策已于 2024 年 5 月 3 日在组织中启用,适用于 2024 年 5 月 3 日或之后创建的 Compute Engine 和 App Engine 默认服务账号。我们建议您保持此政策处于启用状态,因为 Editor 角色非常广泛,授予的权限比大多数使用情形所需的权限更多。

此组织政策不适用于 Cloud Build 旧版服务账号,因为该服务账号默认情况下未被授予 Editor 角色。不过,Cloud Build 旧版服务账号默认具有 Cloud Build Service Account 角色 (roles/cloudbuild.builds.builder),该角色也具有广泛的权限。如果您使用的是 Cloud Build 旧版服务账号,建议您验证 Cloud Build 服务账号角色是否是您的使用情形所必需的,或者您是否可以将其替换为权限较少的角色。

如需了解详情,请参阅限制 IAM 服务账号使用和安全使用 IAM。

获取项目的当前默认服务账号

如需确定 Cloud Build 正在为项目默认使用哪个服务账号,您可以使用 Google Cloud CLI 或 Cloud Build API:

gcloud CLI

运行以下命令,获取当前项目的默认服务账号:

gcloud builds get-default-service-account

Cloud Build API

使用 cURL 调用 Cloud Build API:

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/defaultServiceAccount

将占位值替换为以下内容: