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

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

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

如果系统对您的组织强制执行了 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 约束条件,那么当您尝试向默认服务账号授予所有者或编辑者角色时,会看到如下错误消息:

控制台

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 Account 角色 (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 服务账号角色 (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 资源的权限页面上介绍的最佳实践。