Policy Troubleshooter 可以帮您更轻松地理解用户为何能够访问资源或无权调用 API。给定电子邮件、资源和权限后、政策问题排查工具将能够检查适用于该资源的所有 Identity and Access Management (IAM) 政策。然后,它会显示该成员的角色是否包含该资源的权限,如果是,则显示该成员通过哪些政策绑定到这些角色。
您可以使用 Cloud Console、gcloud
命令行工具或 REST API 访问 Policy Troubleshooter。对于简单查询,使用 Cloud Console 通常速度最快。对于更复杂的场景,请考虑使用 gcloud
工具或 REST API。
所需权限
Policy Troubleshooter 根据您有权查看的 IAM 政策和角色来分析主帐号对资源的访问权限。如果您没有查看应用于资源的政策的权限,或者没有查看自定义角色的权限,则可能无法确定主帐号是否具有访问权限。
如要全面排查主帐号的访问权限,您需要拥有以下权限的角色:
resourcemanager.projects.getIamPolicy
resourcemanager.folders.getIamPolicy
resourcemanager.organizations.getIamPolicy
iam.roles.get
iam.roles.list
如要获得这些权限,同时遵循最小权限原则,请让您的管理员在组织级别授予您 Security Reviewer 角色 (roles/iam.securityReviewer
)。
或者,管理员也可以向您授予具有所需权限的其他角色,例如自定义角色或更宽松的预定义角色。
排查访问权限问题
要排查访问权限问题,您需要以下信息:
- 主帐号:要检查的电子邮件地址。电子邮件地址必须引用用户或服务帐号。不支持其他类型的成员。
- 资源:资源的完整名称。例如,要检查项目 my-project,请输入 //cloudresourcemanager.googleapis.com/projects/my-project。对于其他类型的资源,请参阅完整资源名称示例。
权限:要检查的权限。如果您使用 Cloud Console,则它会在您输入时显示建议列表。有关权限的完整列表,请查看权限参考。
控制台
排查访问权限问题
如要排查访问权限问题,请执行以下操作:
在 Cloud Console 中,转到政策问题排查工具页面。
接下来,输入要检查的电子邮件、资源名称和权限。
可选:要检查多项资源和权限,请选择添加其他权限对,并重复上一步骤。
点击检查 API 调用。
了解政策问题排查工具结果
Policy Troubleshooter 结果会告知您主帐号是否具有给定资源的指定权限。还列出了适用于该资源的 IAM 政策以及这些政策中的角色绑定。
默认情况下,结果显示在精简视图中,该视图仅显示包含指定权限的角色的角色绑定。如果您排查多项权限问题,请使用查看方式下拉列表在权限之间切换。
您可以通过点击紧凑视图切换开关来停用精简视图。停用精简视图会在适用于该资源的政策中显示所有角色绑定。
结果页面包含以下信息:
访问权限摘要:主账号访问权限摘要。您可以通过此信息查看主帐号是否拥有该资源的权限。在以下示例中,
my-user@example.com
有my-project
上的logging.logs.view
权限:相关政策和角色绑定:适用于给定资源的 IAM 政策的列表,以及每个政策中的角色绑定。每个角色绑定旁边都有一个图标,指示该角色绑定是否向主帐号授予了指定的权限。点击角色绑定即可查看其原始文本。
在以下示例中,Logs Viewer 角色绑定会授予权限:
相关角色绑定的原始文本:相关角色绑定列表中每个角色绑定的原始文本。如需详细了解角色绑定的结构,请参阅了解政策。
在角色绑定中,突出显示如下行:
- 绿色:如果行包含指定权限的角色、引用了指定的主帐号或者引用了指定主账号的群组,则以绿色突出显示。
- 红色:如果其他行包含其他角色、引用另一个主帐号,或引用不包含指定主账号的群组,则以红色突出显示。
- 黄色:如果某些角色包含您无权查看的详细信息,或您无权查看其成员资格的群组,则以黄色突出显示。
gcloud
首先,确保您的环境设置为可以使用 Policy Troubleshooter。
启用 Policy Troubleshooter API:
gcloud services enable policytroubleshooter.googleapis.com --project=project-id
然后,设置您的项目:
gcloud config set project project-id
完成设置后,您可以使用政策问题排查工具来检查用户是否拥有某项资源的权限。运行以下命令:
gcloud policy-troubleshoot iam resource --principal-email=email \
--permission=permission
例如,以下命令可检查 foo@example.com
是否有项目 my-
project
上的 resourcemanager.projects.getIamPolicy
权限。
gcloud policy-troubleshoot iam //cloudresourcemanager.googleapis.com/projects/my-project \
--permission=resourcemanager.projects.getIamPolicy --principal-email=foo@example.com
输出是 YAML,它指示用户是否具有权限以及相关原因。输出应如下所示:
access: GRANTED
explainedPolicies:
- access: GRANTED
bindingExplanations:
- access: NOT_GRANTED
memberships:
serviceAccount:service-123@compute-system.iam.gserviceaccount.com: MEMBERSHIP_NOT_INCLUDED
role: roles/compute.serviceAgent
rolePermission: ROLE_PERMISSION_NOT_INCLUDED
- access: GRANTED
memberships:
serviceAccount:service@my-project.iam.gserviceaccount.com: MEMBERSHIP_NOT_INCLUDED
user:foo@example.com: MEMBERSHIP_INCLUDED
role: roles/owner
rolePermission: ROLE_PERMISSION_INCLUDED
fullResourceName: //cloudresourcemanager.googleapis.com/projects/my-project
policy:
bindings:
- members:
- serviceAccount:service-123@compute-system.iam.gserviceaccount.com
role: roles/compute.serviceAgent
- members:
- serviceAccount:foo@my-project.iam.gserviceaccount.com
- user:foo@example.com
role: roles/owner
etag: BwWAOWEaIEg=
version: 1
- access: UNKNOWN_INFO_DENIED
policy: {}
REST API
iam.troubleshoot
方法告诉您成员拥有或没有 IAM 权限的原因。
在使用下面的请求数据之前,请先进行以下替换:
- email:您要排查其权限问题的成员的电子邮件地址。
- resource:向其授予权限的资源。
- permission:您要排查其问题的权限。
HTTP 方法和网址:
POST https://policytroubleshooter.googleapis.com/v1/iam:troubleshoot
请求 JSON 正文:
{ "accessTuple": { "principal": "email", "fullResourceName": "resource", "permission": "permission" } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "access": "GRANTED", "explainedPolicies": [ { "access": "GRANTED", "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "policy": { "version": 1, "etag": "BwWBUZjK9YQ=", "bindings": [ { "role": "roles/owner", "members": [ "user:foo@example.com" ] } ] }, "bindingExplanations": [ { "access": "GRANTED", "role": "roles/owner", "rolePermission": "ROLE_PERMISSION_INCLUDED", "rolePermissionRelevance": "HIGH", "memberships": { "key": "user:foo@example.com", "value": { "membership": "MEMBERSHIP_INCLUDED", "relevance": "HIGH", } }, "relevance: HIGH", } ] }, { "access": "UNKNOWN_INFO_DENIED", "policy": {} } ] }
排查群组成员资格问题
只有在您有权查看某个 Google 群组的成员时,才能排查该群组授予的资源访问权限的问题。
如果您没有权限,则该群组会在 Cloud Console 中以黄色突出显示,并且系统会显示警告,告知您群组是否包含主帐号。如果您使用的是 gcloud
工具或 REST API,响应会包含 UNKNOWN_INFO_DENIED
或 ACCESS_TO_INFO_DENIED
。
Google Workspace 超级用户和群组管理员通常有权查看群组成员资格。如需允许非超级用户或群组管理员的用户排查访问权限的问题,请创建自定义 Google Workspace 管理员角色(该角色拥有 Admin API 权限下的 groups.read
权限),并将该角色授予此用户。这样用户就可以查看您所在网域中所有群组的成员资格,并更有效地排查访问权限问题。
排查条件角色绑定问题
为了排查条件角色绑定问题,政策问题排查工具需要有关请求的其他背景信息。比方说,为了根据日期/时间属性排查条件,政策问题排查工具需要请求的时间。
如需提供此额外的背景信息,您可以直接从任何管理员活动审核日志或数据访问审核日志进行问题排查。每个审核日志条目对应于 Google Cloud API 的请求,或 Google Cloud 代表您执行的操作。当您从审核日志进行问题排查时,政策问题排查工具会自动获取有关该请求的其他信息(例如日期和时间),这使政策问题排查工具能够分析条件角色绑定。
此功能仅在 Cloud Console 中提供。
如需排查条件角色绑定问题,请执行以下操作:
在 Cloud Console 中,转到日志浏览器页面。
如果页面标题为旧式日志查看器,请点击升级下拉列表,然后选择升级新的日志浏览器。
如需仅查看管理员活动和数据访问审核日志,请在查询构建器中输入以下查询,然后点击运行查询:
logName=("RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity" OR "RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Fdata_access")
替换以下值:
RESOURCE_TYPE
:要为其列出审核日志的资源类型。请使用projects
、folders
或organizations
。RESOURCE_ID
:您的资源的 ID。
找到对应于您要排查问题的请求的审核日志条目。如需了解如何使用日志浏览器查找特定日志条目,请参阅使用日志浏览器。
在日志条目的摘要列中,点击 IAM,然后点击排查访问权限问题。
政策问题排查工具会使用日志条目中的信息进行问题排查,然后向您显示结果。额外的上下文会列在访问权限摘要正下方。如需详细了解政策问题排查工具结果页面,请参阅本页面上的排查访问权限问题。
可选:如需排查涉及条件角色绑定的其他请求的问题,请返回日志浏览器页面并重复以上步骤。
后续步骤
使用权限参考文档或预定义角色参考文档确定向缺少权限的用户授予哪个角色。