Policy Troubleshooter では、プリンシパルがリソースにアクセスできるかどうかを判断できます。プリンシパル、リソース、権限を指定すると、Policy Troubleshooter により、プリンシパルのアクセス権に影響する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界(PAB)ポリシーの調査が行われます。次に、これらのポリシーに基づいて、プリンシパルが指定された権限を使用してリソースにアクセスできるかどうかを示します。また、関連するポリシーを一覧表示し、それらがプリンシパルのアクセスにどのように影響するかを説明します。
Policy Troubleshooter には、Google Cloud コンソール、Google Cloud CLI、または REST API を使用してアクセスできます。単純なクエリについては、通常は、 Google Cloud コンソールを使用するのが最も迅速に処理できる方法です。より複雑なシナリオでは、gcloud CLI または REST API の使用を検討してください。
始める前に
-
Enable the Policy Troubleshooter API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
必要な権限
プリンシパルのアクセス権を完全にトラブルシューティングするには、次の権限が必要です。
個別のプリンシパルのアクセス権に関するトラブルシューティングを行う権限
Policy Troubleshooter では、許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシー、閲覧権限を持つロールに基づいて、リソースに対するプリンシパルのアクセス権を分析します。リソースに適用されるポリシーに対する閲覧権限、カスタムロールに対する閲覧権限がない場合は、プリンシパルにアクセス権があるかどうかを判断できないことがあります。
許可ポリシーと拒否ポリシーのトラブルシューティングを行う権限
許可ポリシーと拒否ポリシーのトラブルシューティングを行うには、トラブルシューティングの対象のリソースを含む組織に対する権限が必要です。これらの権限を使用すると、リソースへのアクセスを制御する許可ポリシーと拒否ポリシーを表示できます。
プリンシパルのアクセス権のトラブルシューティングに必要な権限を取得するには、アクセス権のトラブルシューティングを行うリソースを含む組織に対して次の IAM ロールを付与するよう管理者に依頼してください。
-
セキュリティ審査担当者 (
roles/iam.securityReviewer) -
拒否ポリシーのトラブルシューティング:
拒否審査担当者 (
roles/iam.denyReviewer) -
Google Cloud CLI を使用して、次のトラブルシューティングを行います。
Service Usage 消費者 (
roles/serviceusage.serviceUsageConsumer)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
リソースの許可ポリシーと拒否ポリシーを表示する権限がない場合、これらの許可ポリシーと拒否ポリシーのアクセス結果は Unknown になります。
プリンシパル アクセス境界ポリシーのトラブルシューティングを行う権限
プリンシパル アクセス境界ポリシーのトラブルシューティングを行うには、プリンシパル セットにプリンシパルが含まれている組織に対する権限が必要です。この組織を特定する方法は、プリンシパル タイプによって異なります。
- Google アカウントと Google グループ: プリンシパルを含む Google Workspace ドメインに関連付けられている組織
- フェデレーション ID(Workforce Identity プールまたは Workload Identity プール内の ID): プリンシパルを含む ID プールを含む組織
- サービス アカウント: サービス アカウントが作成されたプロジェクトを含む組織
これらの権限を使用すると、プリンシパルのアクセス対象を制御するプリンシパル アクセス境界ポリシーを表示できます。
プリンシパルのアクセス権のトラブルシューティングに必要な権限を取得するには、該当の組織に対して次の IAM ロールを付与するよう管理者に依頼してください。
-
プリンシパル アクセス境界ポリシー閲覧者 (
roles/iam.principalAccessBoundaryViewer) -
プロジェクト、フォルダ、組織のプリンシパル セットにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: 組織管理者 (
roles/resourcemanager.organizationAdmin) -
Google Workspace ドメインにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: Workspace プール IAM 管理者 (
roles/iam.workspacePoolAdmin) -
Workforce Identity プールにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: IAM Workforce プール管理者 (
roles/iam.workforcePoolAdmin) -
Workload Identity プールにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: IAM Workload Identity プール管理者 (
roles/iam.workloadIdentityPoolAdmin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
プリンシパルに適用されるプリンシパル アクセス境界ポリシーを表示する権限がない場合、プリンシパル アクセス境界ポリシーのアクセス結果は Unknown になります。
グループ メンバーのアクセス権に関するトラブルシューティングを行う権限
許可ポリシーと拒否ポリシーにグループが含まれている場合、個々のグループ メンバーに対するアクセス権のトラブルシューティングを行うには、Google Workspace Admin API の権限 groups.read が必要です。特権管理者とグループ管理者にはこの権限が自動的に付与されます。特権管理者またはグループ管理者ではないユーザーにこの権限を付与するには、groups.read 特権(Admin API 特権にあります)を含むカスタムの Google Workspace 管理者ロールを作成し、ユーザーに付与します。
これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。
ドメイン メンバーのアクセス権に関するトラブルシューティングを行う権限
許可ポリシーと拒否ポリシーに Google Workspace アカウントまたは Cloud Identity ドメインが含まれている場合、個々のドメイン メンバーのアクセス権のトラブルシューティングを行うには、ドメイン管理者である必要があります。
これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。
アクセス権のトラブルシューティング
アクセス権のトラブルシューティングには、次の情報が必要です。
- プリンシパル: 確認するメールアドレス。メールアドレスは、ユーザーまたはサービス アカウントを参照している必要があります。グループ、ドメイン、Workforce ID、Workload ID などの他のタイプのプリンシパルはサポートされていません。
リソース: アクセスのトラブルシューティングを行うリソースの完全な名前。たとえば、プロジェクト
my-projectへのアクセスのトラブルシューティングを行うには、「//cloudresourcemanager.googleapis.com/projects/my-project」と入力します。他のリソースタイプについては、完全なリソース名の例をご覧ください。権限: 確認する権限。Google Cloud コンソールを使用している場合は、入力時に候補のリストが表示されます。
権限のトラブルシューティングを行うには、リクエスト内のリソースに権限が適用可能である必要があります。つまり、その権限を使用してリソースにアクセスできる必要があります。権限がリソースに適用できない場合、リクエストは失敗します。たとえば、Google Kubernetes Engine クラスタの
compute.instances.get権限のトラブルシューティングを試みると、compute.instance.get権限を使用してGoogle Kubernetes Engine クラスタにアクセスできないため、リクエストは失敗します。権限の完全なリストについては、権限のリファレンスをご覧ください。
Console
アクセス権のトラブルシューティングを行うには、次のようにします。
Google Cloud コンソールで、[ポリシーに関するトラブルシューティング] ページに移動します。
アクセス権を確認するプリンシパルのメールアドレスを入力します。
確認するリソースの完全なリソース名を入力します。
完全なリソース名がわからない場合は、次のいずれかを行います。
- プロジェクト、フォルダ、組織のアクセスに関する問題をトラブルシューティングする場合は、入力を開始すると予測入力オプションが表示されます。
別のリソースタイプのアクセスに関するトラブルシューティングを行う場合は、[参照] をクリックしてリソース検索ダイアログを開き、リソースを検索します。
- [スコープを選択] ボックスで、検索するプロジェクト、フォルダ、組織を選択します。
- [リソースタイプ] ボックスで、検索するリソースタイプを選択します。
- [リソースを検索] ボックスに、リソース名の一部を入力します。
- 結果セクションで、確認するリソースを選択します。
- [選択] をクリックしてリソースを選択し、ダイアログを閉じます。
確認する権限を入力します。
完全な権限名が不明な場合は、入力を開始すると予測入力オプションが表示されます。
省略可: 複数のリソースと権限を確認するには、[別のペアを追加] を選択して前の手順を繰り返します。
[アクセスを確認] をクリックします。
gcloud
プリンシパルに IAM 権限が付与されている(または付与されていない)理由を確認するには、gcloud beta policy-troubleshoot iam コマンドを使用します。
後述のコマンドデータを使用する前に、次のように置き換えます。
-
VERSION: 省略可。使用するコマンドのバージョン。許可ポリシーと拒否ポリシーのみに基づいてアクセスをトラブルシューティングするには、バージョンを指定しないでください。許可、拒否、プリンシパル アクセス境界のポリシーに基づいてアクセスをトラブルシューティングするには、バージョンbetaを使用します。 EMAIL: 権限をトラブルシューティングする対象のプリンシパルのメールアドレス。RESOURCE: 権限が付与されているリソース。PERMISSION: トラブルシューティングする対象となる権限。
gcloud 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 メソッドと URL:
POST https://policytroubleshooter.googleapis.com/VERSION/iam:troubleshoot
リクエストの本文(JSON):
{
"accessTuple": {
"principal": "EMAIL",
"fullResourceName": "RESOURCE",
"permission": "PERMISSION"
}
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
トラブルシューティングの結果を理解する
Console
結果ページに含まれる情報は、次のとおりです。
評価の詳細
[評価の詳細] セクションには、トラブルシューティングしているアクセス権の概要(指定したプリンシパル、リソース、権限など)が記載されています。複数のリソースと権限のペアのトラブルシューティングを行う場合は、[アクセス権の評価] リストを使用して対象のペアを切り替えることができます。

ポリシーの詳細
[ポリシーの詳細] セクションには、関連する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシーがプリンシパルのアクセス権にどのように影響するかについての詳細が記載されています。
関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされているすべてのプリンシパル アクセス境界ポリシーが含まれます。
関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
[ポリシーの詳細] セクションには、次のセクションが含まれています。
アクセス状態
[アクセス状態] セクションには、ポリシー タイプ(プリンシパル アクセス境界ポリシー、拒否ポリシー、許可ポリシー)ごとの結果の概要と、全体的な結果が示されます。結果は、関連するポリシーに従って、プリンシパルが権限を使用してリソースにアクセスできるかどうかを示します。

ユーザーが権限を使用してリソースにアクセスできるようにするには、すべてのポリシータイプでアクセスが許可されている必要があります。詳細については、ポリシー評価をご覧ください。
プリンシパル アクセス境界ポリシー
[プリンシパル アクセス境界ポリシー] セクションでは、プリンシパルが適用されるすべてのプリンシパル アクセス境界ポリシーと、これらのポリシーをプリンシパルにバインドするポリシー バインディングを表示できます。
[ポリシー] ペインには、プリンシパルを含むプリンシパル セットにバインドされているすべてのポリシーが表示されます。各ポリシーの横には、そのポリシーがプリンシパルのアクセス権にどのように影響するかを示すアイコンが表示されます。

プリンシパル アクセス境界ポリシーは、次の方法でプリンシパルのアクセスに影響します。
- プリンシパルはリソースにアクセスできます: プリンシパル アクセス境界ポリシーがプリンシパルに適用され、そのルールの 1 つにクエリ対象のリソースが含まれています。
- プリンシパルはリソースにアクセスできません: プリンシパル アクセス境界ポリシーがプリンシパルに適用されていますが、クエリ対象のリソースはそのポリシーのルールに含まれていません。
適用されない: 次の状況では、プリンシパル アクセス境界ポリシーは適用されません。
- IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
- ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
- プリンシパル アクセス境界ポリシーにルールはありません。
プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかに影響しません。
プリンシパル アクセス境界ポリシーに関連付けられているルールとバインディングを表示するには、ポリシー名をクリックします。[ポリシー] ペインの隣のペインに、ポリシーの詳細が表示されます。
ポリシーのルールを表示するには、[境界ルール] タブをクリックします。このタブには、関連するプリンシパル アクセス境界ポリシールールの表が表示されます。

プリンシパル アクセス境界ルールは、Policy Troubleshooter クエリの全体的な結果に影響する場合に機能します。そのため、関連するルールは、Policy Troubleshooter の結果によって異なります。たとえば、次のような状況について考えてみましょう。
- Policy Troubleshooter では、プリンシパルがリソースにアクセスできることが示されます。その結果、関連するルールは、プリンシパルがリソースにアクセスできるようにするルールになります。
- Policy Troubleshooter では、プリンシパルがリソースにアクセスできないことが示されます。ただし、関連するプリンシパル アクセス境界ポリシーによると、プリンシパルはリソースにアクセスできます。その結果、プリンシパル アクセス境界ポリシーがプリンシパルがリソースにアクセスできない理由ではないため、関連するルールはありません。
- Policy Troubleshooter では、プリンシパルがリソースにアクセスできないことが示されます。また、関連するプリンシパル アクセス境界ポリシーによると、プリンシパルはリソースにアクセスできません。そのため、関連するルールは、プリンシパルがリソースにアクセスできないようにするルールです。
ポリシー内のすべてのプリンシパル アクセス境界ルールを表示するには、[関連するルールとバインディングのみを表示する] チェックボックスをオフにします。
境界ルール テーブルの [検出結果] 列は、プリンシパル アクセス境界ルールにクエリ対象のリソースが含まれているかどうかを示します。ルールの詳細を表示するには、[ルールの詳細を表示] をクリックします。
ポリシーのポリシー バインディングを表示するには、[バインディング] タブをクリックします。このタブには、選択したプリンシパル アクセス境界ポリシーに関連するポリシー バインディングの表が表示されます。

ポリシー バインディングは、プリンシパル アクセス境界ポリシーがクエリされたプリンシパルに効果的に適用される場合に機能します。ポリシー バインディングでプリンシパル アクセス境界ポリシーをプリンシパルに適用するには、次の条件を満たしている必要があります。
- ポリシー バインディングのプリンシパル セットに、クエリされたプリンシパルが含まれている必要があります。
- ポリシー バインディングの条件は、クエリされたプリンシパルに対して
trueと評価される必要があります。
クエリされたプリンシパルがバインディングの条件を満たしているかどうかに関係なく、クエリされたプリンシパルを含むプリンシパル セットを持つすべてのポリシー バインディングを表示するには、[関連するルールとバインディングのみを表示] チェックボックスをオフにします。
バインディング テーブルの [検出結果] 列は、クエリされたプリンシパルにバインディングが適用されているかどうかを示します。ロール バインディングの詳細を表示するには、[バインディングの詳細を表示] をクリックします。
拒否ポリシー
[拒否ポリシー] セクションでは、プリンシパルへのアクセスを拒否するすべての拒否ポリシーを表示し、プリンシパルへのアクセスを拒否する拒否ルールを特定できます。また、拒否ルールがプリンシプルの権限を拒否する、または拒否しない理由を理解できます。
[拒否ポリシーを含むリソース] ペインには、関連するすべての拒否ポリシーが、接続先のリソース別に整理されて一覧表示されます。各拒否ポリシーの横にアクセス評価が表示されます。この評価はその拒否ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの拒否ポリシーを表示する権限がない場合、リソースリストにそのリソースまたはその拒否ポリシーは含まれません。

これらの拒否ポリシーに関連する拒否ルールを表示するには、拒否ポリシーをクリックします。リソースの拒否ポリシーのすべての拒否ルールを表示するには、リソースをクリックします。拒否ルールが [拒否ルール] ペインに表示されます。このペインには、選択したリソースまたは拒否ポリシーのクエリ対象のプリンシパルまたは権限を持つすべての拒否ルールの表が表示されます。

[アクセス] 列には、拒否ルールがプリンシパルの権限を拒否するかどうかが示されます。拒否ルールの詳細を表示するには、そのルールの行で [拒否ルールを表示] をクリックします。
許可ポリシー
[許可ポリシー] セクションでは、関連するすべての許可ポリシーをナビゲートし、プリンシパルへのアクセス権を付与するロール バインディングを特定できます。そして、ロール バインディングがプリンシパルに権限を付与する、または付与しない理由を理解できます。
[リソース] ペインには、指定したリソースとその祖先が一覧表示されます。各リソースの横にアクセス評価が表示されます。この評価はそのリソースの許可ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの許可ポリシーを表示する権限がない場合、リソースリストにそのリソースは含まれません。
リソースの許可ポリシーで関連するロール バインディングを表示し、プリンシパルに権限が付与されるかまたは付与されないかを確認するには、そのリソースをクリックします。許可ポリシーのロール バインディングが [ロール バインディング] ペインに表示されます。
[ロール バインディング] ペインには、選択したリソースの許可ポリシーのロール バインディングの表が表示されます。デフォルトでは、この表には、指定された権限を持つロールを含むロール バインディングのみが表示されます。プリンシパルがアクセス権を付与されていない場合は、編集可能なカスタムロールを付与されているロール バインディングも表に表示されます。すべてのロール バインディングを表示するには、[関連するバインディングのみを表示] チェックボックスをオフにします。

[アクセス] 列は、ロール バインディングによってプリンシパルに権限が付与されるかどうかを示します。ロール バインディングの詳細を表示するには、そのロール バインディングの行で [バインディングの詳細を表示] をクリックします。
gcloud
レスポンスには、4 つの主要なセクション(リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果、全体的なアクセス状態)が含まれます。
-
accessTuple: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。 -
allowPolicyExplanation: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。レスポンスは、許可ポリシーごとにポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。
- ロール バインディングに権限が含まれているかどうか。
- ロール バインディングにプリンシパルが含まれているかどうか。
- ロール バインディング内の条件(ある場合)が満たされているかどうか。
次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。
-
denyPolicyExplanation: 関連する拒否ポリシーがプリンシパルに権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。
- 拒否ルールに権限が含まれているかどうか。
- 権限が拒否ルールに例外として登録されているかどうか。
- 拒否ルールにプリンシパルが含まれているかどうか。
- プリンシパルが拒否ルールで例外として登録されているかどうか。
- 拒否ルール内の条件(ある場合)が満たされているかどうか。
-
overallAccessState: プリンシパルが、関連する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシーに基づいて、指定されたリソースにアクセスするために、指定された権限を使用できるかどうか。関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされているすべてのプリンシパル アクセス境界ポリシーが含まれます。
関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
ユーザーがリソースにアクセスする権限を使用できるようにするには、すべてのポリシー タイプでアクセスが許可されている必要があります。詳細については、ポリシー評価をご覧ください。
pabPolicyExplanation: 関連するプリンシパル アクセス境界ポリシーでプリンシパルにリソースへのアクセスを許可するかどうかの概要。続いて、関連するプリンシパル アクセス境界ポリシー バインディングとプリンシパル アクセス境界ポリシー。
プリンシパル アクセス境界ポリシーでは、アクセスを許可するか、アクセスを許可しないか、または適用しないかを設定できます。次の状況では、プリンシパル アクセス境界ポリシーは適用されません。
- IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
- ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
- プリンシパル アクセス境界ポリシーにルールはありません。
プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかに影響しません。
レスポンスには、プリンシパルを含むすべてのポリシー バインディングと、各ポリシー バインディングのプリンシパル アクセス境界ポリシーの詳細も表示されます。
-
プリンシパル アクセス境界ポリシー バインディングごとに、レスポンスには、ポリシー バインディングがプリンシパルに適用されているかどうかが表示され、ポリシー バインディングのテキストが出力されます。バインディング内のプリンシパル セットにクエリされたプリンシパルが含まれ、クエリされたプリンシパルに対してポリシー バインディングの条件が
trueと評価された場合、ポリシー バインディングが適用されます。ポリシー バインディングが適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかに影響しません。 -
プリンシパル アクセス境界ポリシーごとに、レスポンスには次の内容が出力されます。
- ポリシーがアクセスを許可するか、アクセスを許可しないか、または適用されないか。
- ポリシーの適用バージョン。このバージョン番号により、IAM がクエリ対象の権限に対してこのプリンシパル アクセス境界ポリシーを適用するかどうかが決まります。権限が適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかには影響しません。
-
プリンシパル アクセス境界ポリシーのルールと、各ルールでアクセスが許可されているかどうか。ルールごとに、クエリされたリソースがルールに含まれているかどうかがレスポンスで示されます。
次のいずれかに該当する場合は、リソースがルールに含まれます。
- リソースがルールにリストされている。プリンシパル アクセス境界ルールで直接一覧表示できるのは、Resource Manager リソース(プロジェクト、フォルダ、組織)のみです。
- リソースの祖先のいずれか(つまり、リソース階層のリソースより上位のプロジェクト、フォルダ、または組織)がルールにリストされます。
レスポンス内の多くのオブジェクトには、relevance フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance フィールドには次の値を指定できます。
HEURISTIC_RELEVANCE_HIGH: オブジェクトが結果に大きな影響を与えていることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。HEURISTIC_RELEVANCE_NORMAL: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。
REST
レスポンスには、4 つの主要なセクション(全体的なアクセス状態、リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果)が含まれます。
-
overallAccessState: プリンシパルが、関連する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシーに基づいて、指定されたリソースにアクセスするために、指定された権限を使用できるかどうか。関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされているすべてのプリンシパル アクセス境界ポリシーが含まれます。
関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
ユーザーがリソースにアクセスする権限を使用できるようにするには、すべてのポリシー タイプでアクセスが許可されている必要があります。詳細については、ポリシー評価をご覧ください。
-
accessTuple: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。 -
allowPolicyExplanation: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。レスポンスは、許可ポリシーごとにポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。
- ロール バインディングに権限が含まれているかどうか。
- ロール バインディングにプリンシパルが含まれているかどうか。
- ロール バインディング内の条件(ある場合)が満たされているかどうか。
次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。
-
denyPolicyExplanation: 関連する拒否ポリシーがプリンシパルに権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。
- 拒否ルールに権限が含まれているかどうか。
- 権限が拒否ルールに例外として登録されているかどうか。
- 拒否ルールにプリンシパルが含まれているかどうか。
- プリンシパルが拒否ルールで例外として登録されているかどうか。
- 拒否ルール内の条件(ある場合)が満たされているかどうか。
-
pabPolicyExplanation: 関連するプリンシパル アクセス境界ポリシーでプリンシパルにリソースへのアクセスを許可するかどうかの概要。続いて、関連するプリンシパル アクセス境界ポリシー バインディングとプリンシパル アクセス境界ポリシー。プリンシパル アクセス境界ポリシーでは、アクセスを許可するか、アクセスを許可しないか、または適用しないかを設定できます。次の状況では、プリンシパル アクセス境界ポリシーは適用されません。
- IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
- ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
- プリンシパル アクセス境界ポリシーにルールはありません。
プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかに影響しません。
レスポンスには、プリンシパルを含むすべてのポリシー バインディングと、各ポリシー バインディングのプリンシパル アクセス境界ポリシーの詳細も表示されます。
-
プリンシパル アクセス境界ポリシー バインディングごとに、レスポンスには、ポリシー バインディングがプリンシパルに適用されているかどうかが表示され、ポリシー バインディングのテキストが出力されます。バインディング内のプリンシパル セットにクエリされたプリンシパルが含まれ、クエリされたプリンシパルに対してポリシー バインディングの条件が
trueと評価された場合、ポリシー バインディングが適用されます。ポリシー バインディングが適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかに影響しません。 -
プリンシパル アクセス境界ポリシーごとに、レスポンスには次の内容が出力されます。
- ポリシーがアクセスを許可するか、アクセスを許可しないか、または適用されないか。
- ポリシーの適用バージョン。このバージョン番号により、IAM がクエリ対象の権限に対してこのプリンシパル アクセス境界ポリシーを適用するかどうかが決まります。権限が適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかには影響しません。
-
プリンシパル アクセス境界ポリシーのルールと、各ルールでアクセスが許可されているかどうか。ルールごとに、クエリされたリソースがルールに含まれているかどうかがレスポンスで示されます。
次のいずれかに該当する場合は、リソースがルールに含まれます。
- リソースがルールにリストされている。プリンシパル アクセス境界ルールで直接一覧表示できるのは、Resource Manager リソース(プロジェクト、フォルダ、組織)のみです。
- リソースの祖先のいずれか(つまり、リソース階層のリソースより上位のプロジェクト、フォルダ、または組織)がルールにリストされます。
レスポンス内の多くのオブジェクトには、relevance フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance フィールドには次の値を指定できます。
HEURISTIC_RELEVANCE_HIGH: オブジェクトが結果に大きな影響を与えていることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。HEURISTIC_RELEVANCE_NORMAL: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。
条件付きロール バインディングのトラブルシューティング
Policy Troubleshooter では、タグに基づいて条件付きロール バインディングと拒否ルールを自動的にトラブルシューティングします。また、プリンシパルに基づいて条件付きのプリンシパル アクセス境界ポリシー バインディングを自動的にトラブルシューティングします。
ただし、他の種類の条件付きロール バインディングまたは条件付き拒否ルールのトラブルシューティングを行うには、Policy Troubleshooter でリクエストの追加のコンテキストが必要です。たとえば、日時属性に基づく条件をトラブルシューティングするには、ポリシーに関するトラブルシューティングにリクエストの時間が必要です。
gcloud CLI と REST API では、この追加のコンテキストを手動で指定します。
Google Cloud コンソールでは、管理アクティビティ監査ログまたはデータアクセス監査ログから直接トラブルシューティングを行うことで、この追加のコンテキストを指定できます。各監査ログエントリは、Google Cloud API に対する 1 つのリクエスト、または Google Cloud が自動的に行う 1 つのアクションに対応します。監査ログからトラブルシューティングすると、ポリシーに関するトラブルシューティングはリクエストの追加情報(日時など)を自動的に取得します。これにより、ポリシーに関するトラブルシューティングによる条件付きロール バインディングの分析およびルールの拒否が可能になります。
Console
条件付きロール バインディングと拒否ルールのトラブルシューティングを行うには、次の操作を行います。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
ページタイトルが [以前のログビューア] の場合は、[アップグレード] のプルダウン リストをクリックし、[新しいログ エクスプローラにアップグレード] を選択します。
管理アクティビティ監査ログとデータアクセス監査ログのみを表示するには、クエリビルダーで次のクエリを入力して、[クエリを実行] をクリックします。
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] をクリックしてから、[アクセスに関する問題のトラブルシューティング] をクリックします。
ポリシーに関するトラブルシューティングは、ログエントリの情報を使用してアクセス権のトラブルシューティングを行い、その結果を表示します。追加のコンテキストは、[条件コンテキスト] の下の評価の詳細に表示されます。コンテキストの詳細を表示するには、[条件コンテキストを表示] をクリックします。Policy Troubleshooter の結果ページの詳細については、このページのトラブルシューティングの結果についてをご覧ください。
省略可: 条件付きロール バインディングと拒否ルールを含む別のリクエストのトラブルシューティングを行う場合は、[ログ エクスプローラ] ページに戻って前の手順を繰り返します。
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
レスポンスには、プリンシパルのアクセス権の説明が含まれます。条件付きロール バインディングと拒否ルールごとに、レスポンスには、指定した条件のコンテキストに基づいて条件が true と評価されるか false と評価されるかを示す conditionExplanation フィールドが含まれます。
たとえば、リソースタイプとリソース サービスを指定する条件を持つロール バインディングの評価は次のようになります。
レスポンス
...
{
"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 メソッドと URL:
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
}
}
}
}
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、プリンシパルのアクセス権の説明が含まれます。条件付きロール バインディングと拒否ルールごとに、レスポンスには、指定した条件のコンテキストに基づいて条件が true と評価されるか false と評価されるかを示す conditionExplanation フィールドが含まれます。
たとえば、リソースタイプとリソース サービスを指定する条件を持つロール バインディングの評価は次のようになります。
...
{
"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
}]
}
}
...
次のステップ
- 権限のリファレンスまたは事前定義ロールのリファレンスを使用して、権限のないユーザーにどのロールを付与するかを判断する。
- その他のポリシー インテリジェンス ツールについて確認する。これらのツールを使用して、ポリシーを理解し管理することで、セキュリティ構成を事前に改善できます。