限制服务账号的使用

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

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

准备工作

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

布尔值限制条件

以下限制条件是boolean constraint类型,它们设置为 true 或 false。

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

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

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

停用服务账号创建功能

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

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

如需详细了解如何组织服务帐号,请参阅在何处创建服务帐号

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

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

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

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

禁止将服务账号附加到其他项目中的资源

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

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

跨项目使用服务账号时限制移除项目安全锁

如果您允许某项目的服务账号附加到其他项目中的资源,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 控制台中,转到组织政策页面。

    转到“组织政策”

  2. 从项目选择器中,选择您要限制服务帐号使用的组织。

  3. 点击此页面上列出的某项服务帐号使用布尔值限制条件。

  4. 点击管理政策

  5. 应用对象下方,选择覆盖父级政策

  6. 点击添加规则

  7. 强制执行下,选择开启

  8. 如需强制执行政策,请点击设置政策

gcloud

您可以通过 Google Cloud CLI 设置政策。

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

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

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

如需停用强制执行,可以使用

disable-enforce
命令发出相同的命令。

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

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

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

name: organizations/012345678901/policies/iam.disableServiceAccountCreation
spec:
  rules:
  - enforce: true

列表限制条件

以下限制条件是列表限制条件的类型,它们被设置为值列表。

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

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

限制服务帐号密钥的生命周期

服务帐号密钥使您能够以服务帐号的身份对请求进行身份验证。默认情况下,服务帐号密钥永不过期。您可以通过为项目、文件夹或组织中所有新创建的密钥设置过期时间来更改此默认设置。

如需设置过期时间,请使用 constraints/iam.serviceAccountKeyExpiryHours 列表限制条件指定新创建的密钥的有效小时数。此时间过后,服务帐号密钥将会过期,您无法再使用它。

此列表限制条件接受以下 ALLOW 值;它不接受 DENY 值。最佳做法是,使用能满足您需求的最短过期时间:

  • 1h:1 小时
  • 8h:8 小时
  • 24h:24 小时(1 天)
  • 168h:168 小时(7 天)
  • 336h:336 小时(14 天)
  • 720h:720 小时(30 天)
  • 1440h:1440 小时(60 天)
  • 2160h:2160 小时(90 天)

constraints/iam.serviceAccountKeyExpiryHours 限制条件无法与父政策合并。如需强制执行此限制条件,您必须替换或继承父政策。

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

如果您使用工作负载身份联合(允许外部身份访问 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。

自动停用已泄露的服务帐号密钥

Google Cloud 偶尔会检测到特定服务帐号密钥已泄露,例如,它可能会检测到公共代码库中的密钥。如需指定 Google Cloud 使用这些键执行的操作,请使用 iam.serviceAccountKeyExposureResponse 列表限制条件。

此列表限制条件接受以下 ALLOW 值;它不接受 DENY 值。

  • DISABLE_KEY:如果 Google Cloud 检测到已泄露的密钥,会自动停用该密钥。它还会向项目所有者和安全联系人发送有关已泄露密钥的通知。

  • WAIT_FOR_ABUSE:Google Cloud 不会主动停用已泄露的密钥。但是,如果以对平台产生负面影响的方式使用泄露的密钥,Google Cloud 可能仍会停用这些密钥。无论已泄露的密钥是否被停用,Google Cloud 都会向项目所有者和安全联系人发送有关已泄露密钥的通知。

当 Google Cloud 停用密钥时,审核日志包含主帐号 gcp-compromised-key-response@system.gserviceaccount.com

我们强烈建议您将此限制条件设置为 DISABLE_KEY。将此限制条件设置为 WAIT_FOR_ABUSE 会增加滥用已泄露的密钥的风险。

如果您决定将限制条件设置为 WAIT_FOR_ABUSE,建议您在重要联系人中查看安全联系信息,并确保您的安全联系人及时响应通知。

iam.serviceAccountKeyExposureResponse 限制条件无法与父政策合并。如需强制执行此限制条件,您必须替换父政策。

设置列表限制条件

控制台

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

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到“组织政策”

  2. 从项目选择器中,选择您要设置组织政策的资源。

  3. 组织政策页面上,从列表中选择限制条件。系统会显示该限制条件的政策详情页面。

  4. 如需更新此资源的组织政策,请点击管理政策

  5. 强制执行下,选择强制执行选项:

    • 要合并和评估组织政策,请选择与父资源规则合并。如需详细了解继承与资源层次结构,请参阅了解层次结构评估
    • 如需覆盖从父资源继承的政策,请选择替换
  6. 点击添加规则

  7. 政策值下方,选择自定义

  8. 政策类型下,选择允许

  9. 自定义值下,为列表限制条件输入第一个值。

    1. 如果要添加更多值,请点击添加值以创建更多行,并为每行添加一个值。
  10. 添加完值后,点击完成

  11. 如需强制执行政策,请点击设置政策

gcloud

您可以通过 Google Cloud CLI 设置政策:

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 访问令牌的最长生命周期:

name: organizations/012345678901/policies/iam.allowServiceAccountCredentialLifetimeExtension
spec:
  rules:
  - values:
      allowedValues:
      - SERVICE_ACCOUNT_ADDRESS

错误消息

停用服务账号创建功能

如果您实施了 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. 最后,重新应用该限制条件。