限制服务账号的使用

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

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

准备工作

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

布尔值限制条件

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

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

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

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

<ph type="x-smartling-placeholder">

停用服务账号创建功能

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

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

如需详细了解如何整理服务账号,请参阅 在何处创建服务账号

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

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

<ph type="x-smartling-placeholder">

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

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

<ph type="x-smartling-placeholder">

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

每个服务账号都位于一个项目中。您可以使用 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 检测到密钥被泄露,则会 并自动停用密钥。它还会创建一个 Cloud Audit Logs 事件 向项目所有者和安全团队 联系人

  • WAIT_FOR_ABUSE:Google Cloud 不会主动停用已泄露的密钥。 但是,如果使用已泄露的密钥,Google Cloud 可能仍会停用它们 对平台产生不利影响。无论实验对象是 密钥处于停用状态时,Google Cloud 会创建一个 Cloud Audit Logs 事件,并 向项目所有者和安全团队 联系人

当 Google Cloud 检测到 密钥泄露或停用密钥。

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

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

我们强烈建议您将此限制条件设置为 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. 最后,重新应用该限制条件。