排查访问权限问题

政策问题排查工具可以帮您更轻松地理解用户为何能够访问资源或无权调用 API。给定电子邮件、资源和权限后,政策问题排查工具将能够检查适用于该资源的所有 Cloud IAM 政策。然后,它会显示该成员的角色是否包含该资源的权限,如果是,则显示该成员通过哪些政策绑定到这些角色。

您可以使用 Cloud Console、gcloud 命令行工具或 REST API 访问政策问题排查工具。对于简单查询,请使用 Cloud Console,因为它很简单且直观显示。对于更复杂的场景,请考虑使用 gcloud 工具或 REST API。

排查访问权限问题

要排查访问权限问题,您需要以下信息:

  • 主帐号:要检查的电子邮件地址。电子邮件地址可以指用户、服务帐号或其他类型的成员。
  • 资源:资源的完整名称。 例如,要检查项目my-project,请输入//cloudresourcemanager.googleapis.com/projects/my-project。对于其他类型的资源,请参阅完整资源名称示例
  • 权限:要检查的权限。如果您使用Cloud Console,则它会在您输入时显示建议列表。有关权限的完整列表,请查看权限参考

控制台

首先,在 Cloud Console 中打开政策问题排查工具页面。

打开政策问题排查工具页面

接下来,输入要检查的电子邮件、资源名称和权限。

您可以选择添加其他权限对并重复上一步骤,以便检查多项资源和权限。

最后,选择检查 API 调用

在结果页面的顶部中间位置,您可以快速查看用户是否已被授予该资源的权限。

问题排查工具结果

默认情况下,结果显示在精简视图中,该视图仅包含与给定用户访问权限问题排查直接相关的信息。具体而言,如果已授予访问权限,将只显示授予访问权限的绑定。如果访问权限被拒绝,则只显示包含所需权限的角色(或可以更改为包含该权限的自定义角色)。

可使用切换开关停用精简视图。此时会显示所有绑定和成员。

左侧窗格包含应用于给定资源的政策列表以及指示每个政策是否包含向成员授予权限的绑定的图标。在下面的示例中,所有者绑定具有访问权限。

问题排查工具绑定列表

右侧窗格显示每个绑定的原始文本,用红色突出显示未授予权限的所有行。请注意,用户授予访问权限的第 39-46 行代码未突出显示。

问题排查工具绑定列表

您可以通过在左侧窗格中选择特定绑定来展开细目。 如果您输入了多个资源和权限对,请使用查看方式下拉列表在二者之间切换。

gcloud

首先,确保您的环境设置为可以使用政策问题排查工具。

使用 Cloud Console启用 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

您可以使用API Explorer 来试用 REST API。

请求:

POST https://policytroubleshooter.googleapis.com/v1/iam:troubleshoot
    

正文:

{
      "principal": "[EMAIL]",
      "fullResourceName": "[RESOURCE]",
      "permission": "[PERMISSION]"
    }
    

所有参数均必填。

以下示例正文检查foo@example.com是否被授予my-project项目的resourcemanager.projects.getIamPolicy权限。

{
      "principal": "foo@example.com",
      "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
      "permission": "resourcemanager.projects.getIamPolicy"
    }
    

输出是 JSON,它指示用户是否被授予权限及相关原因。输出应如下所示:

{
      "access": "GRANTED",
      "explained_policies": [
          {
              "access": "GRANTED",
              "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
              "policy": {
                  "version": 1,
                  "etag": "BwWBUZjK9YQ=",
                  "bindings": [
                      {
                          "role": "roles/owner",
                          "members": [
                              "user:foo@example.com"
                          ]
                      }
                  ]
              },
              "binding_explanations": [
                  {
                      "access": "GRANTED",
                      "relevance: HIGH",
                      "role": "roles/owner",
                      "role_permission": "ROLE_PERMISSION_INCLUDED",
                      "role_permission_relevance": "HIGH",
                      "memberships": {
                          "key":  "user:foo@example.com",
                          "value": {
                              "membership": "MEMBERSHIP_INCLUDED",
                              "relevance":  "HIGH",
                          }
                      }
                  }
              ]
          },
          {
              "access": "UNKNOWN_INFO_DENIED",
              "policy": {}
          }
      ]
    }
    

排查群组成员资格问题

只有在您有权查看某个 Google 群组的成员时,才能排查该群组授予的资源访问权限的问题。

如果您没有权限,则该群组将在 Cloud Console 中以橙色突出显示,并且您将看到一条警告,显示您不知道主帐号是否具有访问权限。如果您使用的是 gcloud 或 REST API,响应将包含 UNKNOWN_INFO_DENIEDACCESS_TO_INFO_DENIED

排查群组成员资格问题

G Suite 超级用户和群组管理员通常有权查看群组成员资格。要允许非超级用户或群组管理员的用户排查访问权限的问题,请创建自定义 G Suite Administrator 角色该角色拥有(Admin API 权限下的) groups.read 权限,并将该角色授予此用户。这样,用户就可以查看您所在网域中所有群组的成员资格,并更有效地排查访问权限问题。

限制

政策问题排查工具并不总是可以完全解释对资源的访问权限。如果您无权访问应用于资源的政策,则政策问题排查工具不会对其进行分析。例如,如果您是项目所有者但没有组织级层的权限,则政策问题排查工具将不会显示可授予对项目的访问权限的组织级层政策。

要最大限度地提高政策问题排查工具的效率,请确保您具有 Security Reviewer (roles/iam.securityReviewer) 角色。这可确保您有权阅读所有适用的 Cloud IAM 政策。