排查允许和拒绝政策问题

您可以使用多种方法来排查 Identity and Access Management (IAM) 允许和拒绝政策的问题。

使用政策问题排查工具

如果您需要排查特定主账号的访问权限,请使用 IAM 的政策问题排查工具。

IAM 的政策问题排查工具可帮助您了解用户为何能够访问资源或无权调用 API。给定电子邮件地址、资源和权限后,政策问题排查工具会检查适用于该资源的所有允许和拒绝政策。然后,它使用这些政策来告知您主账号是否具有该权限。它还列出了政策中的角色绑定和拒绝规则,并说明了它们如何影响主账号的访问权限。

如需了解如何使用政策问题排查工具来排查 IAM 允许和拒绝政策,请参阅排查访问权限

查看应用于资源的所有允许和拒绝政策

在 Google Cloud 中,以下 IAM 政策会影响对资源的访问权限:

  • 资源的允许政策
  • 资源的拒绝政策(如果有)
  • 资源的父级项目、文件夹和组织的允许政策(如果有)
  • 资源的父级项目、文件夹和组织的拒绝政策(如果有)

由于政策沿用,父级项目、文件夹和组织的允许和拒绝政策会影响对资源的访问权限。 将允许或拒绝政策附加到项目、文件夹或组织时,该政策也适用于该项目、文件夹或组织中的所有资源。

例如,如果组织的拒绝政策表示主账号无法使用特定权限,则主账号无法将该权限用于组织中的任何资源。即使该组织中的文件夹和项目具有更宽松的拒绝政策,或者允许主账号授予权限的政策,此规则仍然适用。

同样,如果项目的允许政策为主账号授予了特定权限,则主账号对该项目中的任何资源拥有该权限,前提是他们未拒绝该权限。

所有这些政策的并集称为适用政策或有效政策

在 Google Cloud 中,您可以使用带有 --include-deny 标志的 gcloud beta projects get-ancestors-iam-policy 命令来获取影响项目访问权限的所有 IAM 政策的列表。这些政策共同构成了项目的适用政策。您可以调查每个政策,了解该政策对主账号的访问权限有何影响。

gcloud

在使用下面的命令数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project

执行 gcloud beta projects get-ancestors-iam-policy 命令:

Linux、macOS 或 Cloud Shell

gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json

Windows (PowerShell)

gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json

Windows (cmd.exe)

gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json

响应将包含以下对象的允许和拒绝政策:项目;作为项目祖先实体的任何文件夹;以及组织。以下示例展示了组织 1234567890123 和项目 my-project 的允许政策,以及项目 my-project 的拒绝政策:

[
  {
    "id": "1234567890123",
    "policy": {
      "bindings": [
        {
          "members": [
            "group:cloud-admins@example.com"
          ],
          "role": "roles/iam.denyAdmin"
        },
        {
          "members": [
            "user:raha@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ],
      "etag": "BwXW6Eab7TI=",
      "version": 1
    },
    "type": "organization"
  },
  {
    "id": "my-project",
    "policy": {
      "bindings": [
        {
          "members": [
            "group:cloud-admins@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwXXjOM7L6M=",
      "type": "project"
    }
  },
  {
    "id": "my-project",
    "policy": {
      "createTime": "2022-02-14T21:46:35.865279Z",
      "displayName": "My deny policy",
      "etag": "MTgyMzg2ODcwNTEyMjMxMTM3Mjg=",
      "kind": "DenyPolicy",
      "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/my-deny-policy",
      "rules": [
        {
          "denyRule": {
            "deniedPermissions": [
              "iam.googleapis.com/serviceAccounts.create"
            ],
            "deniedPrincipals": [
              "principal://goog/subject/raha@example.com"
            ]
          },
          "description": "Prevent service account creation"
        }
      ],
      "uid": "c83e3dc3-d8a6-6f51-4018-814e9f200b05",
      "updateTime": "2022-02-14T21:46:35.865279Z"
    },
    "type": "project"
  }
]

在此示例中,用户 raha@example.com 被授予组织的 Service Account Admin 角色 (roles/iam.serviceAccountAdmin),但是项目的一个拒绝政策禁止 raha@example.com 使用 iam.googleapis.com/serviceAccounts.create 权限。因此,如果 raha@example.com 尝试在项目 my-project 中创建服务账号,该请求将被拒绝。

在某些情况下,您可能只需要查看资源的有效允许政策,例如,如果您的组织不使用拒绝政策。在这些情况下,您可以使用以下方法查看有效的允许政策:

  • 在 Google Cloud 控制台中查看资源的 IAM 允许政策。Google Cloud 控制台会自动显示每个资源的有效政策。

    如需了解如何在 Google Cloud 控制台中查看资源的 IAM 允许政策,请参阅查看当前访问权限

  • 使用 Cloud Asset API 获取资源的有效允许政策。如需了解详情,请参阅查看有效的 IAM 政策

如果您需要在允许政策中查找特定角色绑定,则可以搜索允许政策。

借助 Cloud Asset Inventory,您可以在允许政策中搜索与指定参数匹配的角色绑定。您可以使用多种搜索参数,包括:

  • 资源类型
  • 主账号类型
  • 角色
  • 项目
  • 文件夹
  • 组织

如需了解详情,请参阅搜索 IAM 允许政策