排查 IAM 权限问题

Policy Troubleshooter 可帮助您了解主帐号是否可以访问资源。给定主账号、资源和权限,Policy Troubleshooter 会检查影响主账号访问权限的允许政策、拒绝政策和主账号访问边界 (PAB) 政策。然后,它会根据这些政策告诉您主帐号是否可以使用指定的权限访问该资源。本页面还列出了相关政策,并说明了这些政策对主帐号的访问权限有何影响。

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST API 访问 Policy Troubleshooter。对于基本查询,使用 Google Cloud 控制台通常速度最快。对于更复杂的场景,请考虑使用 gcloud CLI 或 REST API。

准备工作

  • 启用 Policy Troubleshooter API。

    启用 API

所需权限

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

用于排查个别主账号访问问题的权限

Policy Troubleshooter 会根据您的允许政策、拒绝政策、主账号访问边界政策和您有权查看的角色来分析主账号对资源的访问权限。如果您无权查看应用于资源的政策,或者无权查看自定义角色,则您可能无法判断主帐号是否具有访问权限。

如需获取排查主账号访问权限问题所需的权限,请让管理员向您授予组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

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

如果您的允许和拒绝政策包含群组,您需要 Google Workspace Admin API 权限 groups.read 来排查个别群组成员的访问权限问题。超级用户和群组管理员会自动拥有此权限。如需为不是超级用户或群组管理员的用户授予此权限,请创建一个自定义 Google Workspace 管理员角色,该角色拥有 groups.read 权限(位于 Admin API 权限下),并将其授予该用户。

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

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

如果您的允许和拒绝政策包含 Google Workspace 帐号或 Cloud Identity 网域,则您必须是网域管理员才能排查各个网域成员的访问权限问题。

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

排查权限问题

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

  • 主账号:要检查的电子邮件地址。电子邮件地址必须引用用户或服务账号。其他类型的主帐号(包括群组、网域、员工身份和工作负载身份)不受支持。
  • 资源:资源的完整名称。例如,如需检查项目 my-project,请输入 //cloudresourcemanager.googleapis.com/projects/my-project。对于其他类型的资源,请参阅完整资源名称示例
  • 权限:要检查的权限。如果您使用 Google Cloud 控制台,它会在您输入时显示建议列表。

    要对权限进行问题排查,该权限必须适用于请求中的资源。换言之,必须能够以某种方式使用该权限来访问资源。如果权限不适用于资源,则请求将失败。例如,如果您尝试对 Google Kubernetes Engine 集群的 compute.instances.get 权限进行问题排查,则请求会失败,因为 compute.instance.get 权限不能用于访问 Google Kubernetes Engine 集群。

    如需查看完整的权限列表,请参阅权限参考文档

控制台

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

  1. 在 Google Cloud 控制台中,转到 Policy Troubleshooter 页面。

    转到政策问题排查工具

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

  3. 输入要检查的资源的完整资源名称。

    如果您不知道完整的资源名称,请执行以下操作之一:

    • 如果您要排查项目、文件夹或组织的访问权限问题,请开始输入以查看自动补全选项。
    • 如果您要排查其他资源类型的访问权限,请点击浏览打开资源搜索对话框,然后搜索相应资源:

      1. 选择范围框中,选择要在其中进行搜索的项目、文件夹或组织。
      2. Resource type 框中,选择要搜索的资源类型。
      3. 搜索资源框中,输入资源名称的一部分。
      4. 在结果部分中,选择您要查看的资源。
      5. 点击选择以选择资源并关闭对话框。
  4. 输入要检查的权限。

    如果您不知道完整的权限名称,请开始输入内容,以查看自动补全选项。

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

  6. 点击检查访问权限

gcloud

如需了解主帐号具有或没有 IAM 权限的原因,请使用 gcloud beta policy-troubleshoot iam 命令。

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

  • VERSION:可选。要使用的命令的版本。如需仅根据允许和拒绝政策排查访问权限问题,请不要指定版本,如需根据允许、拒绝和主账号访问边界政策排查访问权限问题,请使用版本 beta
  • EMAIL:您要排查其权限问题的主账号的电子邮件地址。
  • RESOURCE:向其授予权限的资源。
  • PERMISSION:您要排查其问题的权限。

执行 gcloud beta policy-troubleshoot iam 命令:

Linux、macOS 或 Cloud Shell

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION

Windows (PowerShell)

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION

Windows (cmd.exe)

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION

您应该会收到类似如下所示的响应:

响应

{
  "accessTuple": {
    "conditionContext": {
      "destination": {},
      "effectiveTags": [
        {
          "namespacedTagKey": "project-1/tag-key-1",
          "namespacedTagValue": "project-1/tag-key-1/tag-value-1",
          "tagKey": "tagKeys/123456789012",
          "tagKeyParentName": "projects/123456789012",
          "tagValue": "tagValues/123456789012"
        },
      ],
      "request": {},
      "resource": {}
    },
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/project-1",
    "permission": "bigtable.instances.create",
    "permissionFqdn": "bigtable.googleapis.com/instances.create",
    "principal": "service-account-3@project-1.iam.gserviceaccount.com"
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "condition": {
              "expression": "resource.type == \"cloudresourcemanager.googleapis.com/Project\"",
              "title": "Resource-based condition"
            },
            "conditionExplanation": {
              "evaluationStates": [
                {
                  "end": 62,
                  "value": false
                }
              ],
              "value": false
            },
            "memberships": {
              "serviceAccount:service-account-1@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/bigquery.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "condition": {
              "expression": "resource.matchTag(\"project-1/tag-key-1\", \"tag-value-1\")",
              "title": "Tag-based condition"
            },
            "conditionExplanation": {
              "evaluationStates": [
                {
                  "end": 73,
                  "value": true
                }
              ],
              "value": true
            },
            "memberships": {
              "serviceAccount:service-account-2@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/bigquery.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/compute.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-1@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "user:user-3@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/iam.serviceAccountTokenCreator",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "user:user-1@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "role": "roles/owner",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "serviceAccount:service-account-3@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.projectIamAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.tagViewer",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/project-1",
        "policy": {
          "bindings": [
            {
              "condition": {
                "expression": "resource.type == \"cloudresourcemanager.googleapis.com/Project\"",
                "title": "Resource-based condition"
              },
              "members": [
                "serviceAccount:service-account-1@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/bigquery.admin"
            },
            {
              "condition": {
                "expression": "resource.matchTag(\"project-1/tag-key-1\", \"tag-value-1\")",
                "title": "Tag-based condition"
              },
              "members": [
                "serviceAccount:service-account-2@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/bigquery.admin"
            },
            {
              "members": [
                "user:user-2@example.com"
              ],
              "role": "roles/compute.admin"
            },
            {
              "members": [
                "user:user-1@example.com",
                "user:user-3@example.com"
              ],
              "role": "roles/iam.serviceAccountTokenCreator"
            },
            {
              "members": [
                "user:user-2@example.com",
                "user:user-1@example.com"
              ],
              "role": "roles/owner"
            },
            {
              "members": [
                "serviceAccount:service-account-3@project-1.iam.gserviceaccount.com",
                "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/resourcemanager.projectIamAdmin"
            },
            {
              "members": [
                "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/resourcemanager.tagViewer"
            }
          ],
          "etag": "BwYY6ttEMEY=",
          "version": 3
        },
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      },
    ],
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
            "policy": {
              "createTime": "2024-04-09T23:28:24.103203Z",
              "displayName": "Troubleshooter v3 prober non-tag deny policy",
              "etag": "MTgyMzk3MDY4OTY4MDE0ODg4OTY=",
              "kind": "DenyPolicy",
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F546942305807/denypolicies/deny-policy-1",
              "rules": [
                {
                  "denyRule": {
                    "deniedPermissions": [
                      "bigquery.googleapis.com/datasets.create"
                    ],
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/service-account-1@project-1.iam.gserviceaccount.com"
                    ]
                  }
                }
              ],
              "uid": "fab63b4d-ecfb-5f06-8a6d-602bf1be5062",
              "updateTime": "2024-05-20T23:29:38.428095Z"
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "ruleExplanations": [
              {
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_HIGH"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_HIGH"
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "bigquery.googleapis.com/datasets.create": {
                    "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_HIGH"
                  }
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/service-account-1@project-1.iam.gserviceaccount.com": {
                    "membership": "MEMBERSHIP_NOT_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_HIGH"
                  }
                },
                "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ]
          },
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "permissionDeniable": true,
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "overallAccessState": "CANNOT_ACCESS",
  "pabPolicyExplanation": {
    "explainedBindingsAndPolicies": [
      {
        "bindingAndPolicyAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
        "explainedPolicy": {
          "explainedRules": [
            {
              "combinedResourceInclusionState": "RESOURCE_INCLUSION_STATE_NOT_INCLUDED",
              "effect": "ALLOW",
              "explainedResources": [
                {
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL",
                  "resource": "//cloudresourcemanager.googleapis.com/projects/project-2",
                  "resourceInclusionState": "RESOURCE_INCLUSION_STATE_NOT_INCLUDED"
                }
              ],
              "relevance": "HEURISTIC_RELEVANCE_NORMAL",
              "ruleAccessState": "PAB_ACCESS_STATE_NOT_ALLOWED"
            }
          ],
          "policy": {
            "createTime": "2024-04-09T17:40:51.627668Z",
            "details": {
              "enforcementVersion": "1",
              "rules": [
                {
                  "effect": "ALLOW",
                  "resources": [
                    "//cloudresourcemanager.googleapis.com/projects/project-2"
                  ]
                }
              ]
            },
            "displayName": "Troubleshooter v3 PAB Policy",
            "etag": "m64s4IgR80eDJDywuVA2DA==",
            "name": "organizations/123456789012/locations/global/principalAccessBoundaryPolicies/example-pab-policy",
            "uid": "puid_11875429267422576641",
            "updateTime": "2024-04-09T17:40:51.627668Z"
          },
          "policyAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
          "policyVersion": {
            "enforcementState": "PAB_POLICY_ENFORCEMENT_STATE_NOT_ENFORCED",
            "version": 1
          },
          "relevance": "HEURISTIC_RELEVANCE_NORMAL"
        },
        "explainedPolicyBinding": {
          "conditionExplanation": {
            "evaluationStates": [
              {
                "end": 53,
                "value": true
              },
              {
                "end": 153,
                "start": 58,
                "value": false
              },
              {
                "end": 248,
                "start": 157,
                "value": false
              }
            ],
            "value": false
          },
          "policyBinding": {
            "condition": {
              "expression": "principal.type == 'iam.googleapis.com/ServiceAccount' && (principal.subject=='service-account-1@project-1.iam.gserviceaccount.com' || principal.subject=='service-account-2@project-1.iam.gserviceaccount.com')"
            },
            "createTime": "2024-04-09T17:51:13.504418Z",
            "displayName": "PAB Policy Binding on project-1 project",
            "etag": "W/\"hz9IKzHsIqvopqDRcVYDxQ==\"",
            "name": "projects/123456789012/locations/global/policyBindings/example-policy-binding",
            "policy": "organizations/123456789012/locations/global/principalAccessBoundaryPolicies/example-pab-policy",
            "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
            "policyUid": "puid_11875429267422576641",
            "target": {
              "principalSet": "//cloudresourcemanager.googleapis.com/projects/project-1"
            },
            "uid": "buid_1012746966204940289", 
            "updateTime": "2024-05-09T23:08:56.846355Z"
          },
          "policyBindingState": "POLICY_BINDING_STATE_NOT_ENFORCED",
          "relevance": "HEURISTIC_RELEVANCE_NORMAL"
        },
        "relevance": "HEURISTIC_RELEVANCE_NORMAL"
      }
    ],
    "principalAccessBoundaryAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  }
}

REST

如需了解主账号拥有或没有 IAM 权限的原因,请使用 Policy Troubleshooter API 的 iam.troubleshoot 方法。

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

  • VERSION:要用于此请求的 API 版本。如需仅根据允许和拒绝政策排查访问权限问题,请使用 v3。如需根据允许、拒绝和主账号访问边界政策排查访问权限问题,请使用 v3beta
  • EMAIL:您要排查其权限问题的主账号的电子邮件地址。
  • RESOURCE:向其授予权限的资源。
  • PERMISSION:您要排查其问题的权限。
  • PROJECT_ID:您要用于发出请求的项目的 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

了解问题排查工具结果

控制台

结果页面包含以下信息:

评估详情

评估详情部分包含您要排查的访问权限摘要,包括指定的主账号、资源和权限。如果您要对多个资源权限对进行问题排查,可以使用访问权限评估列表在它们之间切换。

政策详情

政策详情部分详细说明了相关的允许、拒绝和主账号访问边界政策如何影响主账号的访问权限。

相关主账号访问边界政策包括绑定到包含主账号的主账号集的所有主账号访问边界政策。

相关的允许和拒绝政策包括:

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

父级项目、文件夹和组织的允许和拒绝政策因政策沿用而相关。当您将允许或拒绝政策附加到项目、文件夹或组织时,该政策也适用于该项目、文件夹或组织内的所有资源。

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

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

政策详情部分包含以下部分:

访问权限状态

访问权限状态部分汇总了每种政策类型(主账号访问边界政策、拒绝政策和允许政策)的结果,以及总体结果。结果指示主帐号是否能够根据相关政策利用该权限访问资源。

所有政策类型都必须允许访问资源,用户才能使用该权限访问资源。如需了解详情,请参阅政策评估

Principal Access Boundary Policy

主账号访问边界政策部分,您可以查看主账号受主账号影响的所有主账号访问边界政策,以及将这些政策绑定到主账号的政策绑定。

政策窗格列出了绑定到包含主账号的主账号集的所有政策。每项政策旁边都有一个图标,指示该政策如何影响主帐号的访问权限。

主账号访问边界政策可通过以下方式影响主账号的访问权限:

  • 主账号有权访问资源:主账号访问边界政策适用于主账号,并且它的某条规则包含查询的资源。
  • 主账号无法访问该资源:主账号访问边界政策适用于主账号,但查询的资源不在该政策的规则中。
  • 不强制执行:在以下情况下,不会强制执行主账号访问边界政策:

    • IAM 不会在主账号访问边界政策的强制执行版本强制执行指定的权限。因此,主账号访问边界政策无法阻止访问。
    • 由于政策绑定中的条件,主账号访问边界政策或绑定不适用于主账号。
    • Principal Access Boundary Policy 没有任何规则。

    如果未强制执行主账号访问边界政策,则它不会影响主账号能否访问该资源。

如需查看与主账号访问边界政策关联的规则和绑定,请点击该政策名称。政策窗格旁边的窗格会显示政策的详细信息。

如需查看该政策中的规则,请点击边界规则标签页。此标签页显示包含相关主账号访问边界政策规则的表格。

如果主账号访问边界规则会影响 Policy Troubleshooter 查询的总体结果,该规则是相关的。因此,相关规则会因 Policy Troubleshooter 的结果而异。例如,请考虑以下情况:

  • Policy Troubleshooter 会指示主账号可以访问该资源。因此,相关规则才是使主帐号有资格访问资源的规则。
  • Policy Troubleshooter 会指示主账号无法访问该资源。但是,根据相关的 Principal Access Boundary Policy,主账号可以访问该资源。因此,没有相关的规则,因为主账号访问边界政策不是主账号无法访问资源的原因。
  • Policy Troubleshooter 会指示主账号无法访问该资源。此外,根据相关的主账号访问边界政策,主账号无法访问该资源。因此,相关规则使主帐号不符合访问资源的条件。

如需查看政策中的所有主账号访问边界规则,请取消选中仅显示相关规则和绑定复选框。

边界规则表中的 Findings 列指示主账号访问边界规则是否包含查询的资源。如需详细了解规则,请点击查看规则详细信息

如需查看政策的政策绑定,请点击绑定标签页。此标签页会显示所选主账号访问边界政策的相关政策绑定的表。

如果政策绑定有效地将主账号访问边界政策应用于查询的主账号,则该绑定是相关的。如需让政策绑定将主账号访问边界政策应用于主账号,必须满足以下条件:

  • 政策绑定中的主账号集必须包含查询的主账号
  • 对于查询的主账号,政策绑定中的任何条件都必须评估为 true

如需查看与包含查询的主账号的主账号集的所有政策绑定(无论查询的主账号是否满足绑定中的条件),请取消选中仅显示相关规则和绑定复选框。

绑定表中的 Findings 列指示是否对查询的主账号强制执行绑定。如需详细了解政策绑定,请点击查看绑定详情

拒绝政策

拒绝政策部分,您可以查看所有相关的拒绝政策,确定拒绝主帐号访问的拒绝规则,并了解拒绝规则拒绝或不拒绝主帐号权限的原因。

具有拒绝政策的资源窗格列出了所有相关的拒绝政策,并按其附加到的资源进行整理。每个拒绝政策旁边都是访问权限评估。此评估仅适用于该拒绝政策,不反映继承的政策提供的任何访问权限。如果您无权查看某个资源的拒绝政策,则资源列表不会包含该资源或其拒绝政策。

如需查看这些拒绝政策中的相关拒绝规则,请点击拒绝政策。如需查看资源的拒绝政策中的所有拒绝规则,请点击资源。拒绝规则会显示在 Deny rules 窗格中。此窗格包含一个表,其中包含所有拒绝规则,以及针对您选择的资源或拒绝政策查询的主账号或权限。

访问权限列指示拒绝规则是否拒绝主帐号授予该权限。如需详细了解拒绝规则,请点击该规则所在行中的查看拒绝规则

允许政策

允许政策部分中,您可以浏览所有相关的允许政策,确定向主帐号授予访问权限的角色绑定,并了解角色绑定向主帐号授予或不向主帐号授予权限的原因。

资源窗格列出了指定的资源及其祖先实体。每个资源旁边都会显示一个访问权限评估。此评估仅适用于该资源的允许政策,不反映继承的政策提供的任何访问权限。如果您无权查看某项资源的允许政策,则资源列表不会包含该资源。

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

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

访问权限列指示角色绑定是否向主帐号授予了权限。如需查看有关角色绑定的更多详细信息,请点击该角色绑定所在行中的查看绑定详情

gcloud

响应包含四个主要部分:请求中的访问权限元组说明、允许政策评估的结果、拒绝政策评估的结果以及整体访问权限状态。

  • accessTuple:请求中访问元组的说明,包括您提供的任何条件上下文。本部分还包含适用于资源的标记的摘要。
  • allowPolicyExplanation:相关允许政策是否向主帐号授予了权限的摘要,后跟允许政策及其角色绑定的列表。

    对于每个允许政策,响应会列出政策中的所有角色绑定,并根据以下条件对其进行评估:

    • 角色绑定是否包含该权限。
    • 角色绑定是否包含主帐号。
    • 是否满足角色绑定中的条件(如果有)。

    然后,响应会输出允许政策的完整 JSON 文本。

  • denyPolicyExplanation:相关拒绝政策是否拒绝主帐号权限的摘要,后跟具有拒绝政策的资源列表。对于每个资源,响应会列出附加到资源的所有拒绝政策。

    对于每个拒绝政策,响应会输出政策的元数据,列出政策中的拒绝规则,然后根据以下条件评估每条规则:

    • 拒绝规则是否包含权限。
    • 权限是否在拒绝规则中列为例外情况。
    • 拒绝规则是否包含主账号。
    • 主账号是否在拒绝规则中列为例外情况。
    • 是否满足拒绝规则中的条件(如果有)。
  • overallAccessState:根据相关允许政策、拒绝政策和主账号访问边界政策,主账号是否能够使用指定的权限访问指定资源。

    相关主账号访问边界政策包括绑定到包含主账号的主账号集的所有主账号访问边界政策。

    相关的允许和拒绝政策包括:

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

    父级项目、文件夹和组织的允许和拒绝政策因政策沿用而相关。当您将允许或拒绝政策附加到项目、文件夹或组织时,该政策也适用于该项目、文件夹或组织内的所有资源。

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

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

    所有政策类型都必须允许访问资源,用户才能使用该权限访问资源。如需了解详情,请参阅政策评估

  • pabPolicyExplanation:相关主账号访问边界政策是否允许主账号访问资源的摘要,后跟相关主账号访问边界政策绑定和主账号访问边界政策。

    主账号访问边界政策可以允许访问、不允许访问或不强制执行。在以下情况下,系统不会强制执行主账号访问边界政策:

    • IAM 不会在主账号访问边界政策的强制执行版本强制执行指定的权限。因此,主账号访问边界政策无法阻止访问。
    • 由于政策绑定中的条件,主账号访问边界政策或绑定不适用于主账号。
    • Principal Access Boundary Policy 没有任何规则。

    如果未强制执行主账号访问边界政策,则它不会影响主账号能否访问该资源。

    该响应还会列出包含主账号的所有政策绑定,以及其中每个政策绑定中的主账号访问边界政策的详细信息:

    • 对于每个主账号访问边界政策绑定,响应将输出是否对主账号强制执行政策绑定,然后输出政策绑定的文本。如果绑定中的主账号集包含查询的主账号,并且政策绑定中的条件对查询的主账号的计算结果为 true,则强制执行政策绑定。如果未强制执行政策绑定,则政策不会影响主帐号能否访问资源。
    • 对于每项 Principal Access Boundary Policy,响应都会输出以下内容:

      • 此政策是允许访问、不允许访问还是未强制执行。
      • 政策的强制执行版本。此版本号决定了 IAM 是否对查询的权限强制执行此主账号访问边界政策。如果未强制执行该权限,则此政策不会影响主帐号能否访问该资源。
      • Principal Access Boundary Policy 中的规则以及每条规则是否允许访问。对于每条规则,响应都会指明规则中是否包含查询的资源。

        如果满足以下任一条件,规则中就会包含资源:

        • 相应资源列在规则中。只有 Resource Manager 资源(项目、文件夹和组织)可以直接在主账号访问边界规则中列出。
        • 规则中列出了该资源的其中一个祖先(即资源层次结构中资源之上的项目、文件夹或组织)。

响应中的许多对象也具有 relevance 字段。此字段中的值表示该对象对整体访问状态的贡献程度。relevance 字段可以具有以下值:

  • HEURISTIC_RELEVANCE_HIGH:表示对象对结果有很大影响。换句话说,移除该对象可能会改变整体访问权限状态。例如,向主账号授予指定权限的角色绑定将具有此相关性值。

  • HEURISTIC_RELEVANCE_NORMAL:表示对象对结果的影响有限。换句话说,移除对象不太可能改变整体访问状态。例如,不包含权限或主账号的拒绝规则将具有此相关性值。

REST

响应包含四个主要部分:整体访问权限状态、请求中的访问元组说明、允许政策评估结果和拒绝政策评估结果。

  • overallAccessState:根据相关允许政策、拒绝政策和主账号访问边界政策,主账号是否能够使用指定的权限访问指定资源。

    相关主账号访问边界政策包括绑定到包含主账号的主账号集的所有主账号访问边界政策。

    相关的允许和拒绝政策包括:

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

    父级项目、文件夹和组织的允许和拒绝政策因政策沿用而相关。当您将允许或拒绝政策附加到项目、文件夹或组织时,该政策也适用于该项目、文件夹或组织内的所有资源。

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

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

    所有政策类型都必须允许访问资源,用户才能使用该权限访问资源。如需了解详情,请参阅政策评估

  • accessTuple:请求中访问元组的说明,包括您提供的任何条件上下文。本部分还包含适用于资源的标记的摘要。
  • allowPolicyExplanation:相关允许政策是否向主帐号授予了权限的摘要,后跟允许政策及其角色绑定的列表。

    对于每个允许政策,响应会列出政策中的所有角色绑定,并根据以下条件对其进行评估:

    • 角色绑定是否包含该权限。
    • 角色绑定是否包含主帐号。
    • 是否满足角色绑定中的条件(如果有)。

    然后,响应会输出允许政策的完整 JSON 文本。

  • denyPolicyExplanation:相关拒绝政策是否拒绝主帐号权限的摘要,后跟具有拒绝政策的资源列表。对于每个资源,响应会列出附加到资源的所有拒绝政策。

    对于每个拒绝政策,响应会输出政策的元数据,列出政策中的拒绝规则,然后根据以下条件评估每条规则:

    • 拒绝规则是否包含权限。
    • 权限是否在拒绝规则中列为例外情况。
    • 拒绝规则是否包含主账号。
    • 主账号是否在拒绝规则中列为例外情况。
    • 是否满足拒绝规则中的条件(如果有)。
  • pabPolicyExplanation:相关主账号访问边界政策是否允许主账号访问资源的摘要,后跟相关主账号访问边界政策绑定和主账号访问边界政策。

    主账号访问边界政策可以允许访问、不允许访问或不强制执行。在以下情况下,系统不会强制执行主账号访问边界政策:

    • IAM 不会在主账号访问边界政策的强制执行版本强制执行指定的权限。因此,主账号访问边界政策无法阻止访问。
    • 由于政策绑定中的条件,主账号访问边界政策或绑定不适用于主账号。
    • Principal Access Boundary Policy 没有任何规则。

    如果未强制执行主账号访问边界政策,则它不会影响主账号能否访问该资源。

    该响应还会列出包含主账号的所有政策绑定,以及其中每个政策绑定中的主账号访问边界政策的详细信息:

    • 对于每个主账号访问边界政策绑定,响应将输出是否对主账号强制执行政策绑定,然后输出政策绑定的文本。如果绑定中的主账号集包含查询的主账号,并且政策绑定中的条件对查询的主账号的计算结果为 true,则强制执行政策绑定。如果未强制执行政策绑定,则政策不会影响主帐号能否访问资源。
    • 对于每项 Principal Access Boundary Policy,响应都会输出以下内容:

      • 此政策是允许访问、不允许访问还是未强制执行。
      • 政策的强制执行版本。此版本号决定了 IAM 是否对查询的权限强制执行此主账号访问边界政策。如果未强制执行该权限,则此政策不会影响主帐号能否访问该资源。
      • Principal Access Boundary Policy 中的规则以及每条规则是否允许访问。对于每条规则,响应都会指明规则中是否包含查询的资源。

        如果满足以下任一条件,规则中就会包含资源:

        • 相应资源列在规则中。只有 Resource Manager 资源(项目、文件夹和组织)可以直接在主账号访问边界规则中列出。
        • 规则中列出了该资源的其中一个祖先(即资源层次结构中资源之上的项目、文件夹或组织)。

响应中的许多对象也具有 relevance 字段。此字段中的值表示该对象对整体访问状态的贡献程度。relevance 字段可以具有以下值:

  • HEURISTIC_RELEVANCE_HIGH:表示对象对结果有很大影响。换句话说,移除该对象可能会改变整体访问权限状态。例如,向主账号授予指定权限的角色绑定将具有此相关性值。

  • HEURISTIC_RELEVANCE_NORMAL:表示对象对结果的影响有限。换句话说,移除对象不太可能改变整体访问状态。例如,不包含权限或主账号的拒绝规则将具有此相关性值。

排查条件角色绑定问题

Policy Troubleshooter 会根据标记自动对条件角色绑定和拒绝规则进行问题排查。它还可以根据主账号的条件自动排查主账号访问边界政策绑定问题。

如需对其他类型的条件角色绑定或条件拒绝规则进行问题排查,Policy Troubleshooter 需要有关请求的其他上下文。例如,如需根据日期/时间特性排查条件问题,Policy Troubleshooter 需要请求的时间。

在 gcloud CLI 和 REST API 中,您需要手动提供这些额外的上下文。

在 Google Cloud 控制台中,您可以直接从任何管理员活动审核日志数据访问审核日志进行问题排查,以提供这些额外的背景信息。每个审核日志条目都对应于对 Google Cloud API 的请求或 Google Cloud 代表您执行的操作。通过审核日志进行问题排查时,Policy Troubleshooter 会自动获取关于请求的其他信息(例如其日期和时间),以便 Policy Troubleshooter 可以分析条件角色绑定和拒绝规则。

控制台

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

  1. 在 Google Cloud 控制台中,转到 Logs Explorer 页面。

    转到日志浏览器

  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. 可选:如需对涉及条件角色绑定和拒绝规则的其他请求进行问题排查,请返回“日志浏览器”页面并重复上述步骤。

gcloud

如需排查条件角色绑定问题和拒绝规则,请使用 gcloud policy-troubleshoot iam 命令。

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

  • EMAIL:您要排查其权限问题的主账号的电子邮件地址。
  • RESOURCE:针对其授予权限的资源。
  • PERMISSION:您要进行问题排查的权限。
  • DESTINATION_IP:可选。检查条件角色绑定时使用的请求目标 IP 地址。例如 198.1.1.1
  • DESTINATION_PORT:可选。检查条件角色绑定时使用的请求目标端口。例如,`8080`。
  • REQUEST_TIME:可选。检查条件角色绑定时使用的请求时间戳。使用 RFC 3339 格式的时间戳,例如 2099-02-01T00:00:00Z
  • RESOURCE_NAME:可选。检查条件角色绑定时使用的资源名称值。如需查看接受的资源名称格式的列表,请参阅资源名称格式
  • RESOURCE_SERVICE:可选。检查条件角色绑定时使用的资源服务值。如需查看接受的服务名称列表,请参阅资源服务值
  • RESOURCE_TYPE:可选。如需查看接受的资源类型的列表,请参阅资源类型值

执行 gcloud policy-troubleshoot iam 命令:

Linux、macOS 或 Cloud Shell

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION --destination-ip=DESTINATION_IP \
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME \
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE \
    --resource-type=RESOURCE_TYPE

Windows (PowerShell)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION --destination-ip=DESTINATION_IP `
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME `
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE `
    --resource-type=RESOURCE_TYPE

Windows (cmd.exe)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION --destination-ip=DESTINATION_IP ^
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME ^
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE ^
    --resource-type=RESOURCE_TYPE

响应包含主帐号访问权限的说明。对于具有条件的每个角色绑定和拒绝规则,响应将包含一个 conditionExplanation 字段,用于描述根据您提供的条件上下文该条件是 true 还是 false。

例如,以下是对角色绑定的评估,该绑定具有指定资源类型和资源服务的条件:

响应

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "evaluationStates": [{
      "end": 51,
      "start": 1,
      "value": true
    }, {
      "end": 99,
      "start": 55,
      "value": true
    }],
    "value": true,
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
}
...

REST

如需排查条件角色绑定问题和拒绝规则问题,请使用 Policy Troubleshooter API 的 iam.troubleshoot 方法。

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

  • EMAIL:您要排查其权限问题的主账号的电子邮件地址。
  • RESOURCE:针对其授予权限的资源。
  • PERMISSION:您要进行问题排查的权限。
  • DESTINATION_IP:可选。检查条件角色绑定时使用的请求目标 IP 地址。例如 198.1.1.1
  • DESTINATION_PORT:可选。检查条件角色绑定时使用的请求目标端口。例如,`8080`。
  • REQUEST_TIME:可选。检查条件角色绑定时使用的请求时间戳。使用 RFC 3339 格式的时间戳,例如 2099-02-01T00:00:00Z
  • RESOURCE_NAME:可选。检查条件角色绑定时使用的资源名称值。如需查看接受的资源名称格式的列表,请参阅资源名称格式
  • RESOURCE_SERVICE:可选。检查条件角色绑定时使用的资源服务值。如需查看接受的服务名称列表,请参阅资源服务值
  • RESOURCE_TYPE:可选。如需查看接受的资源类型的列表,请参阅资源类型值

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION",
    "conditionContext": {
      "destination": {
        "ip": DESTINATION_IP,
        "port": DESTINATION_PORT
      },
      "request": {
        "receiveTime": REQUEST_TIME
      },
      "resource": {
        "name": RESOURCE_NAME,
        "service": RESOURCE_SERVICE,
        "type": RESOURCE_TYPE
      }
    }
  }
}

如需发送您的请求,请展开以下选项之一:

响应包含主帐号访问权限的说明。对于具有条件的每个角色绑定和拒绝规则,响应将包含一个 conditionExplanation 字段,用于描述根据您提供的条件上下文该条件是 true 还是 false。

例如,以下是对角色绑定的评估,该绑定具有指定资源类型和资源服务的条件:

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "value": true,
    "evaluationStates": [{
      "start": 1,
      "end": 51,
      "value": true
    }, {
      "start": 55,
      "end": 99,
      "value": true
    }]
  }
}
...

后续步骤