限制服务账号的使用

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

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

准备工作

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

布尔值限制条件

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

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

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

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

停用服务账号创建功能

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

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

如需详细了解如何组织服务账号,请参阅在哪里创建服务账号

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

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

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

您可以使用 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:1,440 小时(60 天)
  • 2160h:2,160 小时(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 检测到已泄露的密钥,则会自动停用该密钥。它还会创建一个 Cloud Audit Logs 事件,并向项目所有者和安全联系人发送有关已泄露密钥的通知。

  • WAIT_FOR_ABUSE:Google Cloud 不会主动停用已泄露的密钥。不过,如果公开的密钥的使用方式对平台产生不利影响,Google Cloud 可能仍会停用这些密钥。无论已公开的密钥是否已停用,Google Cloud 都会创建 Cloud Audit Logs 事件,并向项目所有者和安全联系人发送有关已公开的密钥的通知。

当 Google Cloud 检测到已公开的密钥或停用已公开的密钥时,还会执行以下操作:

  • 生成 Cloud Audit Logs 事件。

    • 当 Google Cloud 检测到密钥已泄露时,系统会在滥用事件日志中创建滥用事件。

    • 当 Google Cloud 停用密钥时,审核日志中会包含主账号 gcp-compromised-key-response@system.gserviceaccount.com 执行的停用操作。

  • 设置已公开或已停用的按键的 extendedStatus.value 字段。扩展状态字段包含检测到泄漏的位置。

我们强烈建议您将此约束条件设置为 DISABLE_KEY。将此约束条件设为 WAIT_FOR_ABUSE 会增加公开密钥被滥用的风险。

如果您决定将约束条件设为 WAIT_FOR_ABUSE,我们建议您订阅 Cloud Audit Logs 事件,在重要联系人中查看您的安全联系人信息,并确保您的安全联系人及时回复通知。

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. 最后,重新应用该限制条件。