排查 IAM 权限问题

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

您可以使用 Google Cloud Console、Google Cloud CLI 或 REST API 访问 Policy Troubleshooter。对于简单查询,使用 Google Cloud Console 通常是最快的。对于更复杂的场景,请考虑使用 gcloud CLI 或 REST API。

如果有任何可能影响主帐号访问权限的拒绝政策,Google Cloud 控制台也会提醒您。gcloud CLI 和 REST API 不提供拒绝政策的相关信息。

准备工作

  • 启用 Policy Troubleshooter API。

    启用 API

所需权限

如需对主帐号的访问权限进行全面问题排查,您需要以下权限。

对各个主帐号的访问权限进行问题排查

Policy Troubleshooter 根据您有权查看的 IAM 政策和角色来分析主帐号对资源的访问权限。如果您无权查看应用于资源的政策,或者无权查看自定义角色,则您可能无法确定主帐号是否具有访问权限。

如需获得排查主帐号访问权限问题所需的权限,请让管理员向您授予组织的 Security Reviewer (roles/iam.securityReviewer) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含排查主帐号访问权限问题所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

  • iam.roles.get
  • iam.roles.list
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.projects.getIamPolicy

您也可以使用自定义角色或其他预定义角色来获取这些权限。

排查群组成员访问问题的权限

如果您的 IAM 政策包含群组,则需要 Google Workspace Admin API 权限 groups.read 来排查各个群组成员的访问权限。超级用户和群组管理员会自动获得此权限。如需向非超级用户或群组管理员授予此权限,请创建自定义 Google Workspace 管理员角色(其中包含 Admin API 权限下的 groups.read 权限),然后授予该用户。

如果您没有这些权限,则包含群组或网域的角色绑定的访问权限结果为 Unknown,除非角色绑定明确包含主帐号。

排查网域成员的访问权限问题

如果您的 IAM 政策包含网域,则您必须是网域管理员,才能排查各个网域成员的访问权限。

如果您没有这些权限,则包含群组或网域的角色绑定的访问权限结果为 Unknown,除非角色绑定明确包含主帐号。

排查访问权限问题

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

  • 主帐号:要检查的电子邮件地址。电子邮件地址必须引用用户或服务帐号。不支持其他类型的主帐号。
  • 资源:资源的完整名称。例如,如需检查项目 my-project,请输入 //cloudresourcemanager.googleapis.com/projects/my-project。对于其他类型的资源,请参阅完整资源名称示例
  • 权限:要检查的权限。如果您使用 Google Cloud 控制台,它会在您输入时显示建议列表。有关权限的完整列表,请查看权限参考

控制台

排查访问权限问题

如要排查访问权限问题,请执行以下操作:

  1. 在 Google Cloud Console 中,转到政策问题排查工具页面。

    转到政策问题排查工具

  2. 输入您要检查其访问权限的主帐号的电子邮件地址。

  3. 输入要检查的资源名称和权限。如果您不知道完整的资源名称或权限名称,请开始输入以查看自动补全选项。

  4. 可选:要检查多项资源和权限,请选择添加其他权限对,并重复上一步骤。

  5. 点击检查访问权限

了解政策问题排查工具结果

对于每个资源和权限对,Policy Troubleshooter 都会提供一个结果页,用于说明主帐号的访问权限。

结果页面包含以下信息:

  • 评估详情:您要排查的访问情况的摘要,包括指定的主帐号、资源和权限。如果您正在排查多个资源权限对的问题,可以使用访问评估列表在这些资源/权限对之间切换。

  • 拒绝政策声明:如果拒绝政策可能影响您要排查的访问问题,则政策问题排查工具会显示通知。

    在以下情况下,会显示此通知:

    • 您正在对拒绝政策支持的权限进行问题排查,但有一项问题排查政策适用于您要排查的资源。
    • 您正在排查拒绝政策支持的权限,但您无权查看拒绝政策。

    如果您没有看到该通知,则说明没有影响主帐号访问权限的拒绝政策。

  • IAM 允许政策详情:主帐号基于相关 IAM 允许政策的访问权限的简明摘要。这些政策政策包括指定资源的允许政策以及资源所有祖先实体的允许政策。由于政策继承,如果主帐号对任何此类资源具有权限,则主帐号对您在问题排查查询中指定的资源具有权限。

    通过此信息,您可以了解主帐号是否具有资源权限。

  • 资源:指定资源及其祖先实体的列表。每个资源旁边都有一个评估,用于评估该资源的允许政策是否向主帐号提供指定的权限。此评估仅与该资源的允许政策相关,不反映继承的政策的任何访问权限。

    如果您无权查看祖先实体的允许政策,则资源列表中不会包含该祖先实体。

    如需查看资源允许政策中的相关角色绑定,以及了解它们如何向主帐号授予权限,或不向主帐号授予权限,请点击资源。允许政策的绑定显示在角色绑定窗格中。

  • 角色绑定:所选资源的允许政策中的角色绑定列表。默认情况下,该列表仅显示包含具有指定权限的角色的角色绑定。如果主帐号没有访问权限,则此列表还会显示具有可修改自定义角色的角色绑定。要查看所有角色绑定,请取消选中仅显示相关绑定复选框。

    访问权限列指示角色绑定是否向主帐号授予权限。此列可具有以下任何值:

    • 已授予:角色绑定包含主帐号和具有该权限的角色。
    • 未授予:角色绑定不包含主帐号,或者绑定中的角色不包含权限。
    • 条件:角色绑定包含具有该权限的主帐号和角色。但是,它也包含条件,主帐号只有在满足条件时才能访问。
    • 未知:角色绑定包含您无权查看的角色,或您无权检查成员的群组。

    如需详细了解角色绑定,请点击查看绑定详情。此操作会打开绑定详情窗格。此窗格的详细信息标签页会显示有关角色绑定中的角色、主帐号和条件的信息。如果角色绑定没有向主帐号授予访问权限,则此窗格还会介绍您可以如何向主帐号授予访问权限。

    JSON 标签页会显示角色绑定的原始文本。如需详细了解角色绑定的结构,请参阅了解政策

gcloud

首先,确保您的环境已设置为使用 Policy Troubleshooter。

启用 Policy Troubleshooter API:

gcloud services enable policytroubleshooter.googleapis.com --project=project-id

然后,设置您的项目:

gcloud config set project project-id

完成设置后,您可以使用 Policy Troubleshooter 检查用户是否拥有资源的权限。运行以下命令:

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 权限的原因,请使用 Policy Troubleshooter API 的 iam.troubleshoot 方法。

在使用任何请求数据之前,请先进行以下替换:

  • EMAIL:您要排查其权限问题的主帐号的电子邮件地址。
  • RESOURCE:向其授予权限的资源。
  • PERMISSION:您要排查其问题的权限。
  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

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 API 的请求或 Google Cloud 代表您执行的操作。当您通过审核日志排查问题时,Policy Troubleshooter 会自动获取有关请求的其他信息(例如日期和时间),以便 Policy Troubleshooter 能够分析条件角色绑定。

此功能仅在 Google Cloud Console 中提供。

如需排查条件角色绑定问题,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 如果页面标题为旧式日志查看器,请点击升级下拉列表,然后选择升级新的日志浏览器

  3. 如需仅查看管理员活动和数据访问审核日志,请在查询构建器中输入以下查询,然后点击运行查询

    logName=("RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity" OR "RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Fdata_access")
    

    替换以下值:

    • RESOURCE_TYPE:要为其列出审核日志的资源类型。请使用 projectsfoldersorganizations
    • RESOURCE_ID:您的资源的 ID。
  4. 找到对应于您要排查问题的请求的审核日志条目。如需了解如何使用日志浏览器查找特定日志条目,请参阅使用日志浏览器

  5. 在日志条目的摘要列中,点击 IAM,然后点击排查访问权限问题

    Policy Troubleshooter 使用日志条目中的信息对访问权限进行问题排查,然后向您展示结果。附加上下文列在条件上下文下的评估详情中。如需查看上下文详情,请点击查看条件上下文。如需详细了解 Policy Troubleshooter 结果页面,请参阅本页面上的排查访问权限问题

  6. 可选:如需排查涉及条件角色绑定的其他请求的问题,请返回日志浏览器页面并重复以上步骤。

后续步骤