排查服务账号的组织政策错误

组织政策服务具有多项预定义和托管式限制条件,这些限制条件可能会影响您组织中的服务账号。本页面可帮助您了解这些组织政策会生成哪些错误,以及您可以采取哪些步骤来解决这些错误。

排查服务账号密钥创建功能停用问题

如果系统对您的组织强制执行了 iam.disableServiceAccountKeyCreation 限制条件,那么您将无法为您组织中的任何服务账号创建密钥。如需详细了解此限制条件,请参阅停用服务账号密钥创建功能

密钥创建错误

如果您尝试创建服务账号密钥,但该操作被 iam.disableServiceAccountKeyCreation 限制条件阻止,您将收到以下错误消息:

控制台

在 Google Cloud 控制台中,系统会显示标题为服务账号密钥创建已停用的对话框。对话框会指出已对您组织强制执行 iam.disableServiceAccountKeyCreation 限制条件。

gcloud

ERROR: (gcloud.iam.service-accounts.keys.create) FAILED_PRECONDITION: Key
creation is not allowed on this service account.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - description: Key creation is not allowed on this service account.
    subject: projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.iam.gserviceaccount.com
    type: constraints/iam.disableServiceAccountKeyCreation

REST

{
  "error": {
    "code": 400,
    "message": "Key creation is not allowed on this service account.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/iam.disableServiceAccountKeyCreation",
            "subject": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.iam.gserviceaccount.com",
            "description": "Key creation is not allowed on this service account."
          }
        ]
      }
    ]
  }
}

建议针对服务账号密钥创建错误采取的解决方法

如果组织政策阻止您创建服务账号密钥,我们建议您执行以下操作:

  1. 评估是否需要服务账号密钥。

    我们不建议使用服务账号密钥进行身份验证。这是因为,如果服务账号密钥管理不当,则会带来安全风险,这会增加凭据泄露、提升权限、信息泄露和不可否认性等威胁的漏洞。

    在大多数情况下,建议使用更安全的替代方案进行身份验证,而不是使用服务账号密钥。

  2. 如果您的用例需要服务账号密钥,请为您的项目停用 iam.disableServiceAccountKeyCreation 限制条件。

如需停用组织政策限制条件,请停用该限制条件的强制执行功能,或将项目从强制执行中豁免:

  • 如需为整个组织停用此限制条件的强制执行,请执行以下操作:

    1. 确保您在组织级层拥有 Organization Policy Administrator 角色 (roles/orgpolicy.policyAdmin)。此角色仅可在组织中授予,不会显示在项目的角色列表中。

      如需了解如何在组织级层授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

      转到组织政策

    3. 在项目选择器中,选择要为其停用 iam.disableServiceAccountKeyCreation 限制条件的组织。

    4. 过滤条件字段中,输入 iam.disableServiceAccountKeyCreation。 然后,在政策列表中点击停用服务账号密钥创建功能

    5. 点击管理政策

    6. 政策来源部分,确保已选择覆盖父资源的政策

    7. 强制执行部分,为此组织政策限制条件关闭强制执行。

    8. 点击设置政策

  • 如需将项目排除在强制执行范围之外,请执行以下操作:

    1. 确保您在组织级层拥有 Tag Administrator 角色 (roles/resourcemanager.tagAdmin) 和 Organization Policy Administrator 角色 (roles/orgpolicy.policyAdmin)。如需了解如何在组织级层授予角色,请参阅管理对项目、文件夹和组织的访问权限
    2. 在组织级层,创建标记键和标记值,您将使用该标记值来定义资源是否应豁免该组织政策。我们建议使用键 disableServiceAccountKeyCreation 和值 enforcednot_enforced 创建标记。

      如需了解如何创建标记键和标记值,请参阅创建和定义新标记

    3. disableServiceAccountKeyCreation 标记附加到组织,并将其值设置为 enforced。组织中的所有资源都会继承此标记值,除非该标记值被其他标记值覆盖。

      如需了解如何将标记附加到资源,请参阅将标记附加到资源

    4. 对于要从组织政策中豁免的每个服务账号,请附加 disableServiceAccountKeyCreation 标记,并将其值设置为 not_enforced。以这种方式为服务账号设置标记值会替换从组织继承的标记值。
    5. 创建或更新防止创建服务账号密钥的组织政策,使该政策不对豁免资源强制执行限制条件。此政策应具有以下规则:

      • 配置 iam.disableServiceAccountKeyCreation 限制条件,使其不对具有 disableServiceAccountKeyCreation: not_enforced 标记的资源强制执行。此规则中的条件应如下所示:

        "resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyCreation', 'not_enforced')"
        
      • 配置对所有其他资源强制执行的 iam.disableServiceAccountKeyCreation 限制条件。

排查服务账号创建功能停用问题

如果系统对您的组织强制执行 iam.disableServiceAccountCreation 限制条件,则您将无法在您组织的任何项目中创建服务账号。如需详细了解此限制条件,请参阅停用服务账号创建

服务账号创建错误

如果您尝试创建服务账号,但该操作被 iam.disableServiceAccountCreation 限制条件阻止,您将收到以下错误消息:

控制台

在 Google Cloud 控制台中,会显示标题为服务账号创建失败的对话框。对话框显示尝试执行的操作失败,请重试

gcloud

ERROR: (gcloud.iam.service-accounts.create) FAILED_PRECONDITION: Service account
creation is not allowed on this project.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - description: Service account creation is not allowed on this project.
    subject: projects/PROJECT_ID/serviceAccounts/?configvalue=
    type: constraints/iam.disableServiceAccountCreation

REST

{
  "error": {
    "code": 400,
    "message": "Service account creation is not allowed on this project.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/iam.disableServiceAccountCreation",
            "subject": "projects/PROJECT_ID/serviceAccounts/?configvalue=",
            "description": "Service account creation is not allowed on this project."
          }
        ]
      }
    ]
  }
}

建议针对服务账号创建错误采取的解决方法

如果组织政策阻止您创建服务账号,我们建议您执行以下操作:

  1. 评估是否需要服务账号。

    请查看选择何时使用服务账号,确认您的用例是否需要使用服务账号。

  2. 如果您的用例需要使用服务账号,请为您的项目停用 iam.disableServiceAccountCreation 限制条件。

如需停用组织政策限制条件,请停用该限制条件的强制执行功能,或将项目从强制执行中豁免:

  • 如需为整个组织停用此限制条件的强制执行,请执行以下操作:

    1. 确保您在组织级层拥有 Organization Policy Administrator 角色 (roles/orgpolicy.policyAdmin)。此角色仅可在组织中授予,不会显示在项目的角色列表中。

      如需了解如何在组织级层授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

      转到组织政策

    3. 在项目选择器中,选择要为其停用 iam.disableServiceAccountCreation 限制条件的组织。

    4. 过滤条件字段中,输入 iam.disableServiceAccountCreation。 然后,在政策列表中点击停用服务账号创建功能

    5. 点击管理政策

    6. 政策来源部分,确保已选择覆盖父资源的政策

    7. 强制执行部分,为此组织政策限制条件关闭强制执行。

    8. 点击设置政策

  • 如需将项目排除在强制执行范围之外,请执行以下操作:

    1. 确保您在组织级层拥有 Tag Administrator 角色 (roles/resourcemanager.tagAdmin) 和 Organization Policy Administrator 角色 (roles/orgpolicy.policyAdmin)。如需了解如何在组织级层授予角色,请参阅管理对项目、文件夹和组织的访问权限
    2. 在组织级层,创建标记键和标记值,您将使用该标记值来定义资源是否应豁免该组织政策。我们建议使用键 disableServiceAccountCreation 和值 enforcednot_enforced 创建标记。

      如需了解如何创建标记键和标记值,请参阅创建和定义新标记

    3. disableServiceAccountCreation 标记附加到组织,并将其值设置为 enforced。组织中的所有资源都会继承此标记值,除非该标记值被其他标记值覆盖。

      如需了解如何将标记附加到资源,请参阅将标记附加到资源

    4. 对于要从组织政策中豁免的每个项目或文件夹,请附加 disableServiceAccountCreation 标记并将其值设置为 not_enforced。以这种方式设置项目或文件夹的标记值会替换从组织继承的标记值。
    5. 创建或更新防止创建服务账号密钥的组织政策,使该政策不对豁免资源强制执行限制条件。此政策应具有以下规则:

      • 配置 iam.disableServiceAccountCreation 限制条件,使其不对具有 disableServiceAccountCreation: not_enforced 标记的资源强制执行。此规则中的条件应如下所示:

        "resource.matchTag('ORGANIZATION_ID/disableServiceAccountCreation', 'not_enforced')"
        
      • 配置对所有其他资源强制执行的 iam.disableServiceAccountCreation 限制条件。

排查为默认服务账号授予角色的问题

当您使用某些Google Cloud 服务时,系统会自动创建默认服务账号。它们具有以下标识符:

  • App Engine 服务默认服务账号: PROJECT_ID@appspot.gserviceaccount.com
  • Compute Engine 默认服务账号:PROJECT_NUMBER-compute@developer.gserviceaccount.com

所有默认服务账号在创建时都会自动获得 Editor 角色 (roles/editor),除非组织政策停用了此行为。有两种组织政策限制条件可以防止将 Editor 角色授予默认服务账号:

  • iam.automaticIamGrantsForDefaultServiceAccounts:预定义的限制条件,可防止默认服务账号自动获得角色。此限制条件不会阻止您日后向默认服务账号授予 Editor 角色。
  • constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts:一种托管式限制条件,可防止将 Editor 和 Owner (roles/owner) 角色授予默认服务账号。

向服务账号授予基本角色时出错

如果对您的项目强制执行 iam.automaticIamGrantsForDefaultServiceAccounts 限制条件或 constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts 限制条件,那么您的项目中使用默认服务账号的工作负载可能会遇到权限不足错误。如需了解应向默认服务账号授予哪些角色,请参阅向默认服务账号授予角色的建议解决方案

iam.automaticIamGrantsForDefaultServiceAccounts 限制条件本身不会导致错误。但它会限制默认服务账号的权限,可能导致使用此账号的工作负载缺乏所需的权限。

此外,如果您的项目强制执行 constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts 限制条件,那么如果您尝试向默认服务账号授予 Owner 或 Editor 角色,就会看到以下错误消息:

控制台

Google Cloud 控制台中会显示一个标题为 IAM 政策更新失败的对话框。 对话框会指出您的组织政策管理员已限制您尝试对 IAM 政策所做的更改,然后列出阻止更新的限制条件。列出的限制条件包括 customConstraints/custom.cantGrantProjectIamAdmin 限制条件。

gcloud

ERROR: (gcloud.projects.set-iam-policy) FAILED_PRECONDITION: Operation denied by
org policy on resource 'RESOURCE_ID':
["constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts":
"When this constraint is enforced, it prevents anyone from granting the Editor
role (roles/editor) or the Owner role (roles/owner) to the Compute Engine and
App Engine default service accounts, at any time. To learn more about default
service accounts, see
https://cloud.google.com/iam/help/service-accounts/default. Enforcing this
constraint prevents the default service accounts from automatically being
granted the Editor role (roles/editor). This might cause permission issues for
services that use these service accounts. To learn which roles to grant to each
service account, see
https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default."].

REST

{
  "error": {
    "code": 400,
    "message": "Operation denied by org policy on resource
    'RESOURCE_ID':
    [\"constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts\":
    \"When this constraint is enforced, it prevents anyone from granting the
    Editor role (roles/editor) or the Owner role (roles/owner) to the Compute
    Engine and App Engine default service accounts, at any time. To learn more
    about default service accounts, see
    https://cloud.google.com/iam/help/service-accounts/default.\n Enforcing this
    constraint prevents the default service accounts from automatically being
    granted the Editor role (roles/editor). This might cause permission issues
    for services that use these service accounts. To learn which roles to grant
    to each service account, see
    https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default.\"].",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CUSTOM_ORG_POLICY_VIOLATION",
        "domain": "googleapis.com",
        "metadata": {
          "customConstraints": "constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts",
          "resource": "projects/PROJECT_ID"
        }
      }
    ]
  }
}

向默认服务账号授予角色的建议解决方案

如果组织政策阻止您向默认服务账号授予 Editor 或 Owner 角色,那么您应该找到一个权限较低的角色来授予该服务账号。服务账号所需的角色取决于您使用的服务以及您要完成的任务。

请根据您使用的服务,查看下表以确定要向哪个默认服务账号授予哪个角色:

服务 默认服务账号 要授予的角色
App Engine App Engine 默认服务账号 (PROJECT_ID@appspot.gserviceaccount.com) Cloud Build 账号角色 (roles/cloudbuild.builds.builder)
Compute Engine Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)

默认服务账号需要的角色取决于您要完成的任务。如需了解哪些角色是必需的,请参阅您要完成的任务的文档,或者参阅选择预定义角色

在决定要授予哪个角色时,请遵循 Compute Engine 文档服务账号页面中所述的最佳实践。

Cloud Build Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com) Cloud Build Service Account 角色 (roles/cloudbuild.builds.builder)
Cloud Deploy Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com) 如需了解要向此服务账号授予哪些角色,请找到与您的用例相对应的 Cloud Deploy 快速入门,然后授予该快速入门中所述的角色。如需查看 Cloud Deploy 快速入门列表,请参阅 Cloud Deploy 文档中的快速入门
Cloud Run functions 和 Cloud Functions Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)

部署函数:Cloud Build 账号角色 (roles/cloudbuild.builds.builder)

如需了解详情,请参阅 Cloud Build 的自定义服务账号

Cloud Run Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)

默认服务账号需要的角色取决于您要完成的任务。如需了解哪些角色是必需的,请参阅您要完成的任务的文档,或者参阅选择预定义角色

如需详细了解 Cloud Run 角色,请参阅 Cloud Run 文档中的使用 IAM 进行访问权限控制

Google Kubernetes Engine Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)

Kubernetes Engine Default Node Service Account 角色 (roles/container.defaultNodeServiceAccount)

如需了解详情,请参阅使用最小权限 IAM 服务账号

Workflows Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)

默认服务账号需要的角色取决于您要完成的任务。如需了解哪些角色是必需的,请参阅您要完成的任务的文档,或者参阅选择预定义角色

请遵循 Workflows 文档中向工作流授予访问 Google Cloud 资源的权限页面中所述的最佳做法。