政策疑難排解工具可協助您瞭解主體是否能存取資源。指定主體、資源和權限後,政策疑難排解工具會檢查影響主體存取權的允許政策、拒絕政策和主體存取權範圍 (PAB) 政策。然後,根據這些政策,系統會告知主體是否能使用指定權限存取資源。並列出相關政策,說明這些政策對主體存取權的影響。
您可以使用Google Cloud 控制台、Google Cloud CLI 或 REST API 存取政策疑難排解工具。如果是基本查詢,使用 Google Cloud 控制台通常最快。對於更複雜的場景,請考慮使用 gcloud CLI 或 REST API。
事前準備
-
Enable the Policy Troubleshooter API.
所需權限
如要完整排解主體的存取權問題,您需要下列權限。
具備排解個別主體存取權問題的權限
政策疑難排解工具會根據您有權查看的允許政策、拒絕政策、主體存取邊界政策和角色,分析主體對資源的存取權。如果您沒有權限查看適用於資源的政策,或是沒有權限查看自訂角色,可能就無法判斷主體是否具有存取權。
具備排解允許和拒絕政策問題的權限
如要排解允許和拒絕政策問題,您必須具備權限,才能存取包含要排解問題資源的機構。這些權限可讓您查看允許和拒絕政策,藉此控管資源的存取權。
如要取得排解主體存取權問題所需的權限,請要求管理員在包含要排解存取權問題的資源的機構中,授予您下列 IAM 角色:
-
安全審查員 (
roles/iam.securityReviewer
) -
排解拒絕政策問題:
「拒絕審查者」 (
roles/iam.denyReviewer
) -
使用 Google Cloud CLI 進行疑難排解:
服務用量消費者 (
roles/serviceusage.serviceUsageConsumer
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
如果沒有權限查看資源的允許和拒絕政策,這些政策的存取結果會顯示 Unknown
。
具備排解主體存取邊界政策問題的權限
如要排解主體存取邊界政策問題,您必須擁有主體所屬機構的權限。識別這個機構的方式取決於主體類型:
- Google 帳戶和 Google 群組:與包含主體的 Google Workspace 網域相關聯的機構
- 聯合身分 (工作團隊身分集區或工作負載身分集區中的身分):包含主體的身分集區所屬的機構
- 服務帳戶:包含建立服務帳戶專案的機構
有了這些權限,您就能查看主體存取邊界政策,瞭解主體可存取的項目。
如要取得排解主體存取權問題所需的權限,請要求管理員在適當的機構中授予下列 IAM 角色:
-
主體存取邊界政策檢視者 (
roles/iam.principalAccessBoundaryViewer
) -
排解繫結至專案、資料夾或機構主體集的主體存取邊界政策問題:
機構管理員 (
roles/resourcemanager.organizationAdmin
) -
排解繫結至 Google Workspace 網域的主體存取權界線政策:
Workspace 集區 IAM 管理員 (
roles/iam.workspacePoolAdmin
) -
排解繫結至工作團隊身分集區的主體存取權界線政策問題:
身分與存取權管理工作團隊集區管理員 (
roles/iam.workforcePoolAdmin
) -
排解繫結至 Workload Identity 集區的主體存取權界線政策:
身分與存取權管理 Workload Identity 集區管理員 (
roles/iam.workloadIdentityPoolAdmin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
如果沒有權限查看適用於主體的主體存取邊界政策,主體存取邊界政策的存取結果會顯示 Unknown
。
排解群組成員存取權問題的權限
如果允許和拒絕政策包含群組,您需要 Google Workspace 管理員 API 權限 groups.read
,才能針對個別群組成員排解存取權問題。超級管理員和群組管理員會自動具備這項權限。如要授予非超級使用者或群組管理員這項權限,請建立自訂 Google Workspace 管理員角色,這個角色包含 groups.read
權限 (位於「Admin API Privileges」(Admin API 權限) 下),然後將該角色授予使用者。
如果您沒有這些權限,除非角色繫結或拒絕規則也明確包含主體,否則包含群組或網域的角色繫結和拒絕規則,存取結果會顯示「不明」。
排解網域成員存取權問題的權限
如果允許和拒絕政策包含 Google Workspace 帳戶或 Cloud Identity 網域,您必須是網域管理員,才能針對個別網域成員排解存取權問題。
如果您沒有這些權限,除非角色繫結或拒絕規則也明確包含主體,否則包含群組或網域的角色繫結和拒絕規則,存取結果會顯示「不明」。
疑難排解存取
如要排解存取權問題,請提供下列資訊:
- Principal:要檢查的電子郵件地址。電子郵件地址必須參照使用者或服務帳戶。系統不支援其他類型的主體,包括群組、網域、員工身分和工作負載身分。
資源:您要排解存取權問題的資源完整名稱。舉例來說,如要排解專案
my-project
的存取權問題,請輸入//cloudresourcemanager.googleapis.com/projects/my-project
。如需其他類型的資源,請參閱完整資源名稱範例。權限:要檢查的權限。如果您使用Google Cloud 控制台,系統會在您輸入時顯示建議清單。
如要排解權限問題,權限必須適用於要求中的資源。換句話說,必須能以某種方式使用該權限存取資源。如果權限不適用於資源,要求就會失敗。舉例來說,如果您嘗試對 Google Kubernetes Engine 叢集的
compute.instances.get
權限進行疑難排解,則要求會失敗,因為compute.instance.get
權限無法用於存取 Google Kubernetes Engine 叢集。如需權限的完整清單,請參閱權限參考資料。
控制台
如要排解存取權問題,請按照下列步驟操作:
前往 Google Cloud 控制台的「Policy Troubleshooter」頁面。
輸入要檢查存取權的主體電子郵件地址。
輸入要檢查的資源完整資源名稱。
如果您不知道完整資源名稱,請執行下列任一操作:
- 如果正在排解專案、資料夾或機構的存取權問題,請開始輸入內容,系統會顯示自動完成選項。
如要排解其他資源類型的存取權問題,請按一下「瀏覽」開啟資源搜尋對話方塊,然後搜尋資源:
- 在「選取範圍」方塊中,選取要搜尋的專案、資料夾或機構。
- 在「資源類型」方塊中,選取要搜尋的資源類型。
- 在「搜尋資源」方塊中,輸入資源名稱的一部分。
- 在結果部分中,選取要檢查的資源。
- 按一下「選取」選擇資源並關閉對話方塊。
輸入要檢查的權限。
如果您不知道完整權限名稱,請開始輸入,系統會顯示自動完成選項。
選用:如要檢查多項資源和權限,請選取「新增其他組合」,然後重複上一個步驟。
按一下「檢查存取權」。
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 回應:
瞭解疑難排解工具結果
控制台
結果頁面包含下列資訊:
評估詳細資料
「評估詳細資料」部分會顯示您要排解存取權問題的摘要,包括指定的主體、資源和權限。如要排解多個資源權限組合的問題,可以使用「Access Evaluation」(存取評估) 清單切換組合。
政策詳細資料
「政策詳細資料」部分包含相關詳細資料,說明允許、拒絕和主體存取邊界政策如何影響主體的存取權。
相關主體存取邊界政策包括繫結至包含主體的主體組合的所有主體存取邊界政策。
相關的允許和拒絕政策包括:
- 資源的允許政策
- 資源的拒絕政策 (如有)
- 資源的父項專案、資料夾和機構的允許政策 (如有)
- 資源的父項專案、資料夾和機構的拒絕政策 (如有)
由於政策繼承,父項專案、資料夾和機構的允許與拒絕政策會影響這項專案。將允許或拒絕政策附加至專案、資料夾或機構時,該政策也會套用至專案、資料夾或機構內的所有資源。
舉例來說,如果機構的拒絕政策規定主體不得使用特定權限,則主體無法在機構內的任何資源使用該權限。即使該機構中的資料夾和專案有較寬鬆的拒絕政策,或是允許政策授予主體權限,這項規則仍適用。
同樣地,如果專案的允許政策授予主體特定權限,則主體在專案中的任何資源都具有該權限,前提是未遭拒絕該權限。
「政策詳細資料」部分包含下列章節:
存取狀態
「存取狀態」部分會彙整各政策類型 (主體存取邊界政策、拒絕政策和允許政策) 的結果,並說明整體結果。結果會根據相關政策,指出主體是否能使用權限存取資源。
使用者必須獲得所有政策類型的存取權,才能使用資源存取權。詳情請參閱「政策評估」。
主體存取邊界政策
在「主體存取權範圍政策」部分,您可以查看主體適用的所有主體存取權範圍政策,以及將這些政策繫結至主體的政策繫結。
「政策」窗格會列出繫結至主體組合的所有政策,包括主體。每項政策旁邊都有一個圖示,指出該政策對主體存取權的影響。
主體存取邊界政策可能會透過下列方式影響主體的存取權:
- 主體可存取資源:主體存取邊界政策適用於主體,且其中一項規則包含查詢的資源。
- 主體不可存取資源:主體存取邊界政策適用於主體,但查詢的資源不在該政策的規則中。
未強制執行:在下列情況下,系統不會強制執行主體存取邊界政策:
如果未強制執行主體存取邊界政策,該政策就不會影響主體是否能存取資源。
如要查看與主體存取邊界政策相關聯的規則和繫結,請按一下政策名稱。「Policies」(政策) 窗格旁的窗格會顯示政策詳細資料。
如要查看政策中的規則,請按一下「Boundary rules」(邊界規則) 分頁標籤。這個分頁會顯示相關主體存取邊界政策規則的表格。
如果主體存取邊界規則會影響政策疑難排解工具查詢的整體結果,該規則就是相關規則。因此,相關規則會因政策疑難排解工具結果而異。舉例來說,請參考下列情況:
- 政策疑難排解工具指出主體可以存取資源。因此,相關規則是指讓主體有權存取資源的規則。
- 政策疑難排解工具指出主體無法存取資源。不過,根據相關主體存取邊界政策,主體有權存取資源。因此,由於主體存取邊界政策並非主體無法存取資源的原因,因此沒有相關規則。
- 政策疑難排解工具指出主體無法存取資源。此外,根據相關主體存取邊界政策,主體不符合存取資源的資格。因此,相關規則是不會讓主體有權存取資源的規則。
如要查看政策中的所有主體存取邊界規則,請取消勾選「只顯示相關的規則和繫結」核取方塊。
邊界規則表格中的「發現項目」欄會指出主體存取邊界規則是否包含查詢的資源。如要查看規則的詳細資料,請按一下「查看規則詳細資料」。
如要查看政策的政策繫結,請按一下「繫結」分頁標籤。這個分頁會顯示所選主體存取權範圍政策的相關政策繫結表格。
如果政策繫結可有效將主體存取邊界政策套用至查詢的主體,該繫結就屬於相關繫結。如要透過政策繫結將主體存取邊界政策套用至主體,必須符合下列條件:
- 政策繫結中的主體組合必須包含查詢的主體
- 政策繫結中的任何條件都必須評估為所查詢主體的
true
。
如要查看包含查詢主體的所有政策繫結 (無論查詢主體是否符合繫結中的條件),請取消勾選「只顯示相關的規則和繫結」核取方塊。
繫結表格中的「發現」欄會指出查詢主體是否強制執行繫結。如要查看政策繫結的詳細資料,請按一下「查看繫結詳細資料」。
拒絕政策
在「拒絕政策」部分,您可以查看所有相關拒絕政策、找出拒絕主體存取權的拒絕規則,並瞭解拒絕規則拒絕或未拒絕主體權限的原因。
「設有拒絕政策的資源」窗格會列出所有相關的拒絕政策,並依附屬資源分類。每項拒絕政策旁都會顯示存取權評估結果。這項評估只適用於該拒絕政策,不會反映沿用政策的任何存取權。如果沒有權限查看資源的拒絕政策,資源清單就不會列出該資源或其拒絕政策。
如要查看這些拒絕政策中的相關拒絕規則,請按一下拒絕政策。如要查看資源拒絕政策中的所有拒絕規則,請按一下資源。拒絕規則會顯示在「拒絕規則」窗格中。這個窗格會顯示資料表,列出所選資源或拒絕政策中,與查詢主體或權限相關的所有拒絕規則。
「存取權」欄會指出拒絕規則是否拒絕主體的權限。如要查看拒絕規則的詳細資料,請按一下該規則資料列中的「查看拒絕規則」。
允許政策
在「允許政策」部分,您可以瀏覽所有相關的允許政策、找出授予主體存取權的角色繫結,並瞭解角色繫結授予或未授予主體權限的原因。
「資源」窗格會列出指定的資源及其祖先。每個資源旁都會顯示存取權評估結果。這項評估只適用於該資源的允許政策,不會反映任何繼承政策的存取權。如果沒有權限查看資源的允許政策,資源清單就不會包含該資源。
如要在資源的允許政策中查看相關角色繫結,並瞭解這些繫結如何授予或未授予主體權限,請按一下資源。允許政策的角色繫結會顯示在「角色繫結」窗格中。
「角色繫結」窗格包含所選資源允許政策中的角色繫結表。根據預設,表格只會包含具備指定權限的角色。如果主體沒有存取權,表格也會顯示可編輯自訂角色的角色繫結。如要查看所有角色繫結,請取消勾選「僅顯示相關繫結」核取方塊。
「存取權」欄會指出角色繫結是否授予主體權限。如要查看角色繫結的詳細資料,請按一下該角色繫結資料列中的「查看繫結詳細資料」。
gcloud
回應包含四個主要部分:要求中存取元組的說明、允許政策評估結果、拒絕政策評估結果,以及整體存取狀態。
-
accessTuple
:要求中存取元組的說明,包括您提供的任何條件情境。這個部分也包含適用於資源的標記摘要。 -
allowPolicyExplanation
:相關允許政策是否授予主體權限的摘要,接著列出允許政策及其角色繫結。針對每個允許政策,回應會列出政策中的所有角色繫結,並根據下列條件評估這些繫結:
- 角色繫結是否具備權限。
- 角色繫結是否包含主體。
- 是否符合角色繫結中的條件 (如有)。
接著,回應會列印允許政策的完整 JSON 文字。
-
denyPolicyExplanation
:相關拒絕政策是否拒絕主體的權限,以及具有拒絕政策的資源清單摘要。對於每個資源,回應會列出附加至資源的所有拒絕政策。對於每項拒絕政策,回應會列印政策的中繼資料、列出政策中的拒絕規則,然後根據下列條件評估每項規則:
- 拒絕規則是否涵蓋權限。
- 權限是否列為拒絕規則的例外狀況。
- 拒絕規則是否包含主體。
- 主體是否列為拒絕規則中的例外狀況。
- 是否符合拒絕規則中的條件 (如有)。
-
overallAccessState
:根據相關的允許政策、拒絕政策和主體存取邊界政策,主體是否能使用指定權限存取指定資源。相關主體存取邊界政策包括繫結至包含主體的主體組合的所有主體存取邊界政策。
相關的允許和拒絕政策包括:
- 資源的允許政策
- 資源的拒絕政策 (如有)
- 資源的父項專案、資料夾和機構的允許政策 (如有)
- 資源的父項專案、資料夾和機構的拒絕政策 (如有)
由於政策繼承,父項專案、資料夾和機構的允許與拒絕政策會影響這項專案。將允許或拒絕政策附加至專案、資料夾或機構時,該政策也會套用至專案、資料夾或機構內的所有資源。
舉例來說,如果機構的拒絕政策規定主體不得使用特定權限,則主體無法在機構內的任何資源使用該權限。即使該機構中的資料夾和專案有較寬鬆的拒絕政策,或是允許政策授予主體權限,這項規則仍適用。
同樣地,如果專案的允許政策授予主體特定權限,則主體在專案中的任何資源都具有該權限,前提是未遭拒絕該權限。
使用者必須獲得所有政策類型的存取權,才能使用權限存取資源。詳情請參閱「政策評估」。
pabPolicyExplanation
:相關主體存取邊界政策是否允許主體存取資源的摘要,接著是相關主體存取邊界政策繫結和主體存取邊界政策。
主體存取邊界政策可以允許存取、不允許存取或不強制執行。在下列情況中,系統不會強制執行主體存取邊界政策:
如果未強制執行主體存取邊界政策,該政策就不會影響主體是否能存取資源。
回應也會列出包含主體的所有政策繫結,以及每個政策繫結中主體存取權範圍政策的詳細資料:
-
針對每個主體存取權範圍政策繫結,回應會列印政策繫結是否對主體強制執行,然後列印政策繫結的文字。如果繫結中設定的主體集包含查詢的主體,且政策繫結中的條件對查詢的主體評估結果為
true
,系統就會強制執行政策繫結。如果政策繫結未強制執行,政策就無法影響主體是否能存取資源。 -
針對每個主體存取邊界政策,回應會列印下列內容:
- 政策是允許存取、不允許存取,還是未強制執行。
- 政策的強制執行版本。這個版本號碼會決定 IAM 是否對查詢的權限強制執行這項主體存取邊界政策。如果未強制執行權限,政策就無法影響主體是否能存取資源。
-
主體存取邊界政策中的規則,以及每項規則是否允許存取。對於每項規則,回應都會指出查詢的資源是否包含在規則中。
只要符合下列任一條件,資源就會納入規則:
- 規則中列出該資源。只有 Resource Manager 資源 (專案、資料夾和機構) 可以直接列在主體存取邊界規則中。
- 資源的其中一個上層資源 (也就是資源階層中位於資源上方的專案、資料夾或機構) 列於規則中。
回應中的許多物件也都有 relevance
欄位。這個欄位中的值表示該物件對整體存取狀態的影響程度。relevance
欄位可包含下列值:
HEURISTIC_RELEVANCE_HIGH
:表示物件對結果有重大影響。換句話說,移除物件可能會變更整體存取狀態。舉例來說,如果角色繫結授予主體指定權限,就會有這個關聯值。HEURISTIC_RELEVANCE_NORMAL
:表示物件對結果的影響有限。換句話說,移除物件不太可能改變整體存取狀態。舉例來說,如果拒絕規則未包含權限或主體,就會有這個關聯性值。
REST
回應包含四個主要部分:整體存取狀態、要求中存取元組的說明、允許政策評估結果,以及拒絕政策評估結果。
-
overallAccessState
:根據相關的允許政策、拒絕政策和主體存取邊界政策,主體是否能使用指定權限存取指定資源。相關主體存取邊界政策包括繫結至包含主體的主體組合的所有主體存取邊界政策。
相關的允許和拒絕政策包括:
- 資源的允許政策
- 資源的拒絕政策 (如有)
- 資源的父項專案、資料夾和機構的允許政策 (如有)
- 資源的父項專案、資料夾和機構的拒絕政策 (如有)
由於政策繼承,父項專案、資料夾和機構的允許與拒絕政策會影響這項專案。將允許或拒絕政策附加至專案、資料夾或機構時,該政策也會套用至專案、資料夾或機構內的所有資源。
舉例來說,如果機構的拒絕政策規定主體不得使用特定權限,則主體無法在機構內的任何資源使用該權限。即使該機構中的資料夾和專案有較寬鬆的拒絕政策,或是允許政策授予主體權限,這項規則仍適用。
同樣地,如果專案的允許政策授予主體特定權限,則主體在專案中的任何資源都具有該權限,前提是未遭拒絕該權限。
使用者必須獲得所有政策類型的存取權,才能使用權限存取資源。詳情請參閱「政策評估」。
-
accessTuple
:要求中存取元組的說明,包括您提供的任何條件情境。這個部分也包含適用於資源的標記摘要。 -
allowPolicyExplanation
:相關允許政策是否授予主體權限的摘要,接著列出允許政策及其角色繫結。針對每個允許政策,回應會列出政策中的所有角色繫結,並根據下列條件評估這些繫結:
- 角色繫結是否具備權限。
- 角色繫結是否包含主體。
- 是否符合角色繫結中的條件 (如有)。
接著,回應會列印允許政策的完整 JSON 文字。
-
denyPolicyExplanation
:相關拒絕政策是否拒絕主體的權限,以及具有拒絕政策的資源清單摘要。對於每個資源,回應會列出附加至資源的所有拒絕政策。對於每項拒絕政策,回應會列印政策的中繼資料、列出政策中的拒絕規則,然後根據下列條件評估每項規則:
- 拒絕規則是否涵蓋權限。
- 權限是否列為拒絕規則的例外狀況。
- 拒絕規則是否包含主體。
- 主體是否列為拒絕規則中的例外狀況。
- 是否符合拒絕規則中的條件 (如有)。
-
pabPolicyExplanation
:相關主體存取邊界政策是否允許主體存取資源的摘要,接著是相關主體存取邊界政策繫結和主體存取邊界政策。主體存取邊界政策可以允許存取、不允許存取或不強制執行。在下列情況中,系統不會強制執行主體存取邊界政策:
如果未強制執行主體存取邊界政策,該政策就不會影響主體是否能存取資源。
回應也會列出包含主體的所有政策繫結,以及每個政策繫結中主體存取權範圍政策的詳細資料:
-
針對每個主體存取權範圍政策繫結,回應會列印政策繫結是否對主體強制執行,然後列印政策繫結的文字。如果繫結中設定的主體集包含查詢的主體,且政策繫結中的條件對查詢的主體評估結果為
true
,系統就會強制執行政策繫結。如果政策繫結未強制執行,政策就無法影響主體是否能存取資源。 -
針對每個主體存取邊界政策,回應會列印下列內容:
- 政策是允許存取、不允許存取,還是未強制執行。
- 政策的強制執行版本。這個版本號碼會決定 IAM 是否對查詢的權限強制執行這項主體存取邊界政策。如果未強制執行權限,政策就無法影響主體是否能存取資源。
-
主體存取邊界政策中的規則,以及每項規則是否允許存取。對於每項規則,回應都會指出查詢的資源是否包含在規則中。
只要符合下列任一條件,資源就會納入規則:
- 規則中列出該資源。只有 Resource Manager 資源 (專案、資料夾和機構) 可以直接列在主體存取邊界規則中。
- 資源的其中一個上層資源 (也就是資源階層中位於資源上方的專案、資料夾或機構) 列於規則中。
-
針對每個主體存取權範圍政策繫結,回應會列印政策繫結是否對主體強制執行,然後列印政策繫結的文字。如果繫結中設定的主體集包含查詢的主體,且政策繫結中的條件對查詢的主體評估結果為
回應中的許多物件也都有 relevance
欄位。這個欄位中的值表示該物件對整體存取狀態的影響程度。relevance
欄位可包含下列值:
HEURISTIC_RELEVANCE_HIGH
:表示物件對結果有重大影響。換句話說,移除物件可能會變更整體存取狀態。舉例來說,如果角色繫結授予主體指定權限,就會有這個關聯值。HEURISTIC_RELEVANCE_NORMAL
:表示物件對結果的影響有限。換句話說,移除物件不太可能改變整體存取狀態。舉例來說,如果拒絕規則未包含權限或主體,就會有這個關聯性值。
排解條件式角色繫結問題
政策疑難排解工具會根據標記,自動排解有條件的角色繫結和拒絕規則。此外,系統也會根據主體,自動排解主體存取邊界政策繫結 (附帶條件) 的問題。
如要排解其他類型的條件角色繫結或條件拒絕規則問題,政策疑難排解工具需要更多要求相關背景資訊。舉例來說,如要排解以日期/時間屬性為依據的條件,政策疑難排解工具需要要求時間。
在 gcloud CLI 和 REST API 中,您需要手動提供這項額外內容。
在 Google Cloud 控制台中,您可以直接從任何管理員活動稽核記錄或資料存取稽核記錄進行疑難排解,提供這項額外背景資訊。每筆稽核記錄項目都對應至Google Cloud API 的要求,或代表您執行的動作。 Google Cloud 從稽核記錄進行疑難排解時,政策疑難排解工具會自動取得要求的其他資訊,例如日期和時間,以便分析條件式角色繫結和拒絕規則。
控制台
如要排解條件式角色繫結和拒絕規則的問題,請按照下列步驟操作:
前往 Google Cloud 控制台的「Logs Explorer」頁面。
如果頁面標題是「舊版記錄檢視器」,請點按「升級」下拉式選單,然後選取「升級至新的記錄檔探索工具」。
如要只查看管理員活動和資料存取稽核記錄,請在查詢建構工具中輸入下列查詢,然後按一下「執行查詢」:
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」,然後點選「排解存取權問題」。
政策疑難排解工具會使用記錄檔項目中的資訊排解存取權問題,然後顯示結果。其他背景資訊會列在「條件背景資訊」下方的評估詳細資料中。如要查看情境詳細資料,請按一下「查看條件情境」。如要進一步瞭解政策疑難排解工具結果頁面,請參閱本頁的「瞭解疑難排解工具結果」。
選用:如要排解涉及條件式角色繫結和拒絕規則的其他要求,請返回「記錄檔總管」頁面,然後重複上述步驟。
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 }] } } ...
後續步驟
- 使用權限參考資料或預先定義的角色參考資料,判斷要授予缺少權限的使用者哪個角色。
- 請參閱其他政策智慧工具,瞭解及管理政策,主動改善安全設定。