限制服务帐号的使用

Resource Manager 提供了多种可在组织政策中使用的限制条件,用以约束 Identity and Access Management (IAM) 服务帐号的使用。

其中许多限制条件决定了服务帐号和其他资源是否可以通过特定方式创建或配置。这些限制条件不具有回溯性,不会影响之前创建和配置的服务帐号。

准备工作

您必须具有修改组织政策的权限才能设置限制条件。例如,orgpolicy.policyAdmin 角色具有设置组织政策限制条件的权限。如需详细了解如何在组织级层管理政策,请参阅使用限制条件页面。

布尔值限制条件

以下限制条件是布尔值限制条件类型,它们设置为 true 或 false。

停用对默认服务帐号的自动角色授予功能

一些 Google Cloud 服务会自动创建默认服务帐号。创建默认服务帐号后,系统会自动为其授予项目的 Editor 角色 (roles/editor)。

为了提高安全性,我们强烈建议您停用自动角色授予功能。使用 iam.automaticIamGrantsForDefaultServiceAccounts 布尔值限制条件来停用自动角色授予功能。

停用服务帐号创建功能

您可以使用 iam.disableServiceAccountCreation 布尔值限制条件来停用创建新服务帐号的功能。这样您可以集中管理服务帐号,同时不会限制开发者对项目的其他权限。

如果您在项目中强制实施此限制条件,则某些 Google Cloud 服务将无法自动创建默认服务帐号。因此,如果项目运行的工作负载需要模拟服务帐号,则该项目可能不包含工作负载可以使用的服务帐号。如要解决此问题,您可以跨项目启用服务帐号模拟。启用此功能后,您可以在集中项目中创建服务帐号,然后将服务帐号附加到其他项目中的资源。

如需详细了解如何组织服务帐号,请参阅服务帐号位置

禁止创建服务帐号密钥

您可以使用 iam.disableServiceAccountKeyCreation 布尔值限制条件来停用创建新外部服务帐号密钥的功能。这样您就可以控制服务帐号的非托管式长期凭据的使用。设置此限制条件后,便无法为受该限制条件影响的项目中的服务帐号创建用户管理的凭据。

停用服务帐号密钥上传功能

您可以使用 iam.disableServiceAccountKeyUpload 布尔值限制条件来停用将外部公钥上传到服务帐号。设置此限制条件后,用户无法将公钥上传到受限制条件影响的项目中的服务帐号。

禁止将服务帐号附加到其他项目中的资源(Beta 版)

每个服务帐号都位于一个项目中。您可以使用 iam.disableCrossProjectServiceAccountUsage 布尔值限制条件来防止某个项目中的服务帐号连接到其他项目中的资源。

如果您希望跨项目使用服务帐号,请参阅跨项目启用服务帐号模拟功能

跨项目使用服务帐号时限制移除项目安全锁(Beta 版)

如果您允许某项目的服务帐号附加到其他项目中的资源,IAM 会添加一个项目安全锁,用于防止删除该项目。默认情况下,任何对该项目具有 resourcemanager.projects.updateLiens 权限的人员都可以删除安全锁。

如果您强制执行 iam.restrictCrossProjectServiceAccountLienRemoval 布尔值限制条件,则只有对组织具有 resourcemanager.projects.updateLiens 权限的成员才能删除安全锁。

如果您的任何项目允许跨项目模拟服务帐号,我们建议您强制执行该限制条件。

停用 Workload Identity 集群创建功能

您可以使用 iam.disableWorkloadIdentityClusterCreation 布尔值限制条件来要求所有新的 Google Kubernetes Engine 集群在创建时都停用 Workload Identity 功能。如果要严格控制您组织中的服务帐号访问权限,除了停用服务帐号创建和服务帐号密钥创建功能之外,您可能还想停用 Workload Identity。

启用了 Workload Identity 的现有 GKE 集群不会受到影响,将继续正常运行。

强制执行布尔值限制条件

控制台

如需设置强制执行限制条件以限制对服务帐号的使用的组织政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的组织政策页面。

    转到“组织政策”页面

  2. 点击页面顶部的组织下拉列表,然后选择您的组织。
  3. 点击上面列出的一项服务帐号使用布尔值限制条件。
  4. 点击修改按钮。
  5. 应用对象下,选择自定义
  6. 实施下,选择开启
  7. 点击保存。此时将显示一条通知,确认政策已更新。

gcloud

您可以通过 gcloud 命令行工具设置政策。

如需限制对服务帐号的使用,请运行以下命令:

gcloud resource-manager org-policies enable-enforce \
    --organization 'ORGANIZATION_ID' \
    BOOLEAN_CONSTRAINT

其中,BOOLEAN_CONSTRAINT 是您要强制执行的布尔值限制条件。

要禁止强制执行,您可以发出相同命令,但需要搭配

disable-enforce
命令。

如需了解如何在组织政策中使用限制条件,请参阅使用限制条件

具有布尔值限制条件的示例政策

以下代码段展示了一项组织政策,用于强制执行 iam.disableServiceAccountCreation 布尔值限制条件,该限制条件会阻止创建服务帐号:

resource: "organizations/842463781240"
policy {
  constraint: "constraints/iam.disableServiceAccountCreation"
  etag: "\a\005L\252\122\321\946\334"
  boolean_policy {
  enforced: true
  }
}

列表限制条件

以下限制条件是列表限制条件类型,后者设置为值列表。

延长 OAuth 2.0 访问令牌的生命周期

您可以创建 OAuth 2.0 访问令牌,以提供服务帐号的短期有效凭据。默认情况下,访问令牌的最长生命周期为 1 小时(3600 秒)。不过,您可以将最长生命周期延长至 12 小时。为此,请确定需要延长访问令牌生命周期的服务帐号,然后将这些服务帐号添加到包含 constraints/iam.allowServiceAccountCredentialLifetimeExtension 列表限制条件的组织政策中。

指定允许的外部身份提供商

如果您使用工作负载身份联合(允许外部身份访问 Google Cloud 资源),则可以指定允许哪些外部身份提供商。默认情况下,允许使用所有提供商。如需设置限制,请使用 constraints/iam.workloadIdentityPoolProviders 列表限制条件,为以下格式指定允许的提供商的 URI:

  • Amazon Web Services (AWS):https://sts.amazonaws.com

    如需限制可以使用的 AWS 帐号,请使用 constraints/iam.workloadIdentityPoolAwsAccounts 列表限制条件,如本页所述。

  • Microsoft Azure:https://sts.windows.net/azure-tenant-id

  • 支持 OpenID Connect (OIDC) 的其他身份提供商:使用身份提供商提供的颁发者 URI。

指定允许的 AWS 帐号

如果您使用工作负载身份联合(允许外部身份访问 Google Cloud 资源),则可以指定哪些 AWS 帐号可以访问您的资源。默认情况下,系统允许来自任何 AWS 帐号的工作负载访问您的 Google Cloud 资源。如需限制可使用哪些 AWS 帐号,请使用 constraints/iam.workloadIdentityPoolAwsAccounts 列表限制条件来指定允许的帐号 ID。

设置列表限制条件

控制台

如需设置包含列表限制条件的组织政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的组织政策页面。

    转到“组织政策”页面

  2. 点击页面顶部的组织下拉列表,然后选择您的组织。
  3. 点击要添加的限制条件。
  4. 点击修改按钮。
  5. 应用对象下,选择自定义
  6. 强制执行政策下,选择与父级合并,将此政策与层次结构中的现有政策合并。
  7. 政策值下方,选择自定义
  8. 政策类型下,选择允许
  9. 自定义值下,输入列表限制条件的第一个值。
    1. 如果要添加更多值,请点击新政策值以创建多个行,并为每行添加一个值。
  10. 点击保存。此时将显示一条通知,确认政策已更新。

gcloud

您可以通过 gcloud 命令行工具设置政策:

gcloud resource-manager org-policies allow \
    CONSTRAINT_NAME \
    VALUE_1 [VALUE_N ...] \
    --organization=ORGANIZATION_ID \

替换以下值:

  • CONSTRAINT_NAME:列表限制条件的名称。例如 constraints/iam.allowServiceAccountCredentialLifetimeExtension
  • VALUE_1VALUE_N...:列表限制条件的值。

如需了解如何在组织政策中使用限制条件,请参阅使用限制条件

包含列表限制条件的示例政策

以下代码段展示了一个强制执行 iam.allowServiceAccountCredentialLifetimeExtension 列表限制条件的组织政策,它将为所列服务帐号延长 OAuth 2.0 访问令牌的最长生命周期:

resource: "organizations/842463781240"
policy {
  constraint: "constraints/iam.allowServiceAccountCredentialLifetimeExtension"
  etag: "\a\005L\252\122\321\946\334"
  listPolicy {
    allowedValues:
      - SERVICE_ACCOUNT_ADDRESS
  }
  updateTime: CURRENT_TIME
}

错误消息

停用服务帐号创建功能

如果您实施了 iam.disableServiceAccountCreation,则创建服务帐号的操作将失败,并显示以下错误:

FAILED_PRECONDITION: Service account creation is not allowed on this project.

停用服务帐号密钥创建功能

如果您实施了 iam.disableServiceAccountKeyCreation,则创建服务帐号的操作将失败,并显示以下错误:

FAILED_PRECONDITION: Key creation is not allowed on this service account.

停用 Workload Identity 集群创建功能

如果您实施了 iam.disableWorkloadIdentityClusterCreation,则创建启用了 Workload Identity 的 GKE 集群将失败,并显示以下错误:

FAILED_PRECONDITION: Workload Identity is disabled by the organization
policy constraints/iam.disableWorkloadIdentityClusterCreation. Contact your
administrator to enable this feature.

排查已知问题

默认服务帐号

应用 iam.disableServiceAccountCreation 限制条件后,系统将阻止在相关项目中创建服务帐号。此限制也会影响到 Google Cloud 服务,这些服务在启用时会自动在项目中创建默认服务帐号,例如:

  • Compute Engine
  • GKE
  • App Engine
  • Dataflow

在应用 iam.disableServiceAccountCreation 限制条件后,由于系统无法为这些服务创建默认服务帐号,尝试启用这些服务的操作将会失败。

要解决此问题,请执行以下操作:

  1. 暂时移除 iam.disableServiceAccountCreation 限制条件。
  2. 启用所需服务。
  3. 创建任何其他所需的服务帐号。
  4. 最后,重新应用该限制条件。