组织政策服务有多个预定义的受管理限制条件,可能会影响组织中的服务账号。本页将帮助您了解这些组织政策会生成哪些错误,以及您可以采取哪些步骤来解决这些错误。
排查服务账号密钥创建功能被停用的问题
如果系统对您的组织强制执行了 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."
}
]
}
]
}
}
针对服务账号密钥创建错误的建议解决方法
如果组织政策阻止您创建服务账号密钥,我们建议您执行以下操作:
评估是否需要服务账号密钥。
我们不建议使用服务账号密钥进行身份验证。这是因为,如果服务账号密钥未正确管理,则会带来安全风险,这会增加凭据泄露、提升权限、信息泄露和不可否认性等威胁的漏洞。
在大多数情况下,您应使用更安全的替代方案进行身份验证,而不是使用服务账号密钥。
如果您的用例需要服务账号密钥,请为您的项目停用
iam.disableServiceAccountKeyCreation
限制条件。
如需停用组织政策限制条件,请停用相应限制条件的强制执行功能,或为您的项目豁免强制执行:
如需为整个组织停用此限制的强制执行,请执行以下操作:
确保您在组织级层拥有 Organization Policy Administrator 角色 (
roles/orgpolicy.policyAdmin
)。此角色只能授予组织,不会显示在项目的角色列表中。如需了解如何在组织级授予角色,请参阅管理对项目、文件夹和组织的访问权限。
在 Google Cloud 控制台中,转到组织政策页面。
在项目选择器中,选择要为其停用
iam.disableServiceAccountKeyCreation
限制条件的组织。在过滤条件字段中,输入
iam.disableServiceAccountKeyCreation
。然后,在政策列表中,点击停用服务账号密钥创建功能。点击管理政策。
在政策来源部分,确保选择了覆盖父资源的政策。
在强制执行下,为此组织政策限制条件关闭强制执行。
点击设置政策。
如需将您的项目从违规处置名单中豁免,请执行以下操作:
-
确保您在组织级拥有“Tag Administrator”角色 (
roles/resourcemanager.tagAdmin
) 和“Organization Policy Administrator”角色 (roles/orgpolicy.policyAdmin
)。如需了解如何在组织级授予角色,请参阅管理对项目、文件夹和组织的访问权限。 -
在组织级层,创建标记键和标记值,您将使用该标记值来定义资源是否应豁免该组织政策。我们建议使用键
disableServiceAccountKeyCreation
和值enforced
和not_enforced
创建标记。如需了解如何创建标记键和标记值,请参阅创建和定义新标记。
-
将
disableServiceAccountKeyCreation
标记附加到组织,并将其值设置为enforced
。组织中的所有资源都会继承此标记值,除非该标记值被其他标记值覆盖。如需了解如何将标记附加到资源,请参阅将标记附加到资源。
-
对于要从组织政策中豁免的每个服务账号,请附加
disableServiceAccountKeyCreation
标记并将其值设置为not_enforced
。以这种方式为服务账号设置标记值会替换从组织继承的标记值。 -
创建或更新防止创建服务账号密钥的组织政策,以使该政策不对豁免资源强制执行限制条件。 此政策应具有以下规则:
-
配置
iam.disableServiceAccountKeyCreation
限制条件,使其不对具有disableServiceAccountKeyCreation: not_enforced
标记的资源强制执行。此规则中的条件应如下所示:"resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyCreation', 'not_enforced')"
- 配置对所有其他资源强制执行的
iam.disableServiceAccountKeyCreation
限制条件。
-
-
确保您在组织级拥有“Tag Administrator”角色 (
排查服务账号创建功能被停用的问题
如果系统对您的组织强制执行了 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."
}
]
}
]
}
}
针对服务账号创建错误的建议解决方法
如果组织政策阻止您创建服务账号,我们建议您执行以下操作:
评估是否需要服务账号。
查看选择何时使用服务账号,确认您的用例是否需要服务账号。
如果您的用例需要服务账号,请为您的项目停用
iam.disableServiceAccountCreation
约束条件。
如需停用组织政策限制条件,请停用相应限制条件的强制执行功能,或为您的项目豁免强制执行:
如需为整个组织停用此限制的强制执行,请执行以下操作:
确保您在组织级层拥有 Organization Policy Administrator 角色 (
roles/orgpolicy.policyAdmin
)。此角色只能授予组织,不会显示在项目的角色列表中。如需了解如何在组织级授予角色,请参阅管理对项目、文件夹和组织的访问权限。
在 Google Cloud 控制台中,转到组织政策页面。
在项目选择器中,选择要为其停用
iam.disableServiceAccountCreation
限制条件的组织。在过滤条件字段中,输入
iam.disableServiceAccountCreation
。然后,在政策列表中,点击停用服务账号创建功能。点击管理政策。
在政策来源部分,确保选择了覆盖父资源的政策。
在强制执行下,为此组织政策限制条件关闭强制执行。
点击设置政策。
如需将您的项目从违规处置名单中豁免,请执行以下操作:
-
确保您在组织级拥有“Tag Administrator”角色 (
roles/resourcemanager.tagAdmin
) 和“Organization Policy Administrator”角色 (roles/orgpolicy.policyAdmin
)。如需了解如何在组织级授予角色,请参阅管理对项目、文件夹和组织的访问权限。 -
在组织级层,创建标记键和标记值,您将使用该标记值来定义资源是否应豁免该组织政策。我们建议使用键
disableServiceAccountCreation
和值enforced
和not_enforced
创建标记。如需了解如何创建标记键和标记值,请参阅创建和定义新标记。
-
将
disableServiceAccountCreation
标记附加到组织,并将其值设置为enforced
。组织中的所有资源都会继承此标记值,除非该标记值被其他标记值覆盖。如需了解如何将标记附加到资源,请参阅将标记附加到资源。
-
对于要从组织政策中豁免的每个项目或文件夹,请附加
disableServiceAccountCreation
标记并将其值设置为not_enforced
。以这种方式设置项目或文件夹的标记值会替换从组织继承的标记值。 -
创建或更新防止创建服务账号的组织政策,以使该政策不对豁免资源强制执行限制条件。 此政策应具有以下规则:
-
配置
iam.disableServiceAccountCreation
限制条件,使其不对具有disableServiceAccountCreation: not_enforced
标记的资源强制执行。此规则中的条件应如下所示:"resource.matchTag('ORGANIZATION_ID/disableServiceAccountCreation', 'not_enforced')"
- 配置对所有其他资源强制执行的
iam.disableServiceAccountCreation
限制条件。
-
-
确保您在组织级拥有“Tag Administrator”角色 (
排查向默认服务账号授予角色时出现的问题
当您使用某些 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 账号角色 ( 如需了解详情,请参阅 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 角色 ( 如需了解详情,请参阅使用最小权限 IAM 服务账号。 |
Workflows |
Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
默认服务账号需要的角色取决于您要完成的任务。如需了解所需的角色,请查看您要完成的任务的文档,或参阅选择预定义角色。 请遵循“Workflows”文档中向工作流授予访问 Google Cloud 资源的权限页面上介绍的最佳实践。 |