ポリシーに関するトラブルシューティングには、Google Cloud コンソール、Google Cloud CLI、または REST API を使用してアクセスできます。単純なクエリについては、通常は、Google Cloud コンソールを使用するのが最も迅速に処理できる方法です。より複雑なシナリオでは、gcloud CLI または REST API の使用を検討してください。
始める前に
-
Policy Troubleshooter API を有効にします。
必要な権限
プリンシパルのアクセス権を完全にトラブルシューティングするには、次の権限が必要です。
個別のプリンシパルのアクセス権に関するトラブルシューティングを行う権限
Policy Troubleshooter では、閲覧権限を持つ許可ポリシー、拒否ポリシー、ロールに基づいて、リソースに対するプリンシパルのアクセス権を分析します。リソースに適用されるポリシーに対する閲覧権限、カスタムロールに対する閲覧権限がない場合は、プリンシパルにアクセス権があるかどうかを判断できないことがあります。
プリンシパルのアクセス権のトラブルシューティングに必要な権限を取得するには、組織に対して次の IAM ロールを付与するよう管理者に依頼してください。
-
セキュリティ審査担当者 (
roles/iam.securityReviewer
) -
拒否ポリシーのトラブルシューティング:
拒否審査担当者(
roles/iam.denyReviewer
) -
Google Cloud CLI を使用して、次のトラブルシューティングを行います。
Service Usage 消費者(
roles/serviceusage.serviceUsageConsumer
)
ロールの付与の詳細については、アクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
グループ メンバーのアクセス権に関するトラブルシューティングを行う権限
許可ポリシーと拒否ポリシーにグループが含まれている場合、個々のグループ メンバーのアクセス権のトラブルシューティングを行うには、Google Workspace Admin API の権限 groups.read
が必要です。特権管理者とグループ管理者にはこの権限が自動的に付与されます。特権管理者またはグループ管理者ではないユーザーにこの権限を付与するには、groups.read
特権(Admin API 特権にあります)を含むカスタムの Google Workspace 管理者ロールを作成し、ユーザーに付与します。
これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。
ドメイン メンバーのアクセス権に関するトラブルシューティングを行う権限
許可ポリシーと拒否ポリシーに Google Workspace アカウントまたは Cloud Identity ドメインが含まれている場合、個々のドメイン メンバーのアクセス権のトラブルシューティングを行うには、ドメイン管理者である必要があります。
これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。
アクセス権のトラブルシューティング
アクセス権のトラブルシューティングには、次の情報が必要です。
- プリンシパル: 確認するメールアドレス。メールアドレスは、ユーザーまたはサービス アカウントを参照している必要があります。グループ、ドメイン、Workforce Identity、Workload Identity など、他のタイプのプリンシパルはサポートされていません。
- リソース: リソースの完全な名前。たとえば、プロジェクト
my-project
を確認するには、//cloudresourcemanager.googleapis.com/projects/my-project
と入力します。他のリソースタイプについては、完全なリソース名の例をご覧ください。 - 権限: 確認する権限。Google Cloud コンソールを使用している場合は、入力時に候補のリストが表示されます。権限の完全なリストについては、権限のリファレンスをご覧ください。
コンソール
アクセス権のトラブルシューティングを行うには、次のようにします。
Google Cloud コンソールで、[ポリシーに関するトラブルシューティング] ページに移動します。
アクセス権を確認するプリンシパルのメールアドレスを入力します。
確認するリソースの完全なリソース名を入力します。
完全なリソース名がわからない場合は、次のいずれかを行います。
- プロジェクト、フォルダ、組織のアクセス権のトラブルシューティングを行う場合は、入力を開始すると、予測入力オプションが表示されます。
別のリソースタイプのアクセスをトラブルシューティングする場合は、[Browse] をクリックしてリソース検索ダイアログを開き、リソースを検索します。
- [スコープを選択] ボックスで、検索するプロジェクト、フォルダ、組織を選択します。
- [リソースタイプ] ボックスで、検索するリソースタイプを選択します。
- [リソースを検索] ボックスに、リソース名の一部を入力します。
- 結果セクションで、確認するリソースを選択します。
- [選択] をクリックしてリソースを選択し、ダイアログを閉じます。
確認する権限を入力します。
完全な権限名がわからない場合は、入力を開始すると予測入力オプションが表示されます。
省略可: 複数のリソースと権限を確認するには、[別のペアを追加] を選択して前の手順を繰り返します。
[アクセスを確認] をクリックします。
gcloud
プリンシパルに IAM 権限が付与されている(または付与されていない)理由を確認するには、gcloud policy-troubleshoot iam
コマンドを使用します。
後述のコマンドデータを使用する前に、次のように置き換えます。
EMAIL
: 権限をトラブルシューティングする対象のプリンシパルのメールアドレス。RESOURCE
: 権限が付与されているリソース。PERMISSION
: トラブルシューティングする対象となる権限。
gcloud policy-troubleshoot iam コマンドを実行します。
Linux、macOS、Cloud Shell
gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \ --permission=PERMISSION
Windows(PowerShell)
gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ` --permission=PERMISSION
Windows(cmd.exe)
gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^ --permission=PERMISSION
次のようなレスポンスが返されます。
{ "accessTuple": { "conditionContext": { "destination": {}, "effectiveTags": [ { "tagValue": "tagValues/281481941428044", "namespacedTagValue": "803434038361/env/dev", "tagKey": "tagKeys/281475994198094", "namespacedTagKey": "803434038361/env", "tagKeyParentName": "organizations/803434038361" } ], "request": {}, "resource": {} }, "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "permission": "compute.instances.get", "permissionFqdn": "compute.googleapis.com/instances.get", "principal": "user1@example.com" }, "allowPolicyExplanation": { "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED", "explainedPolicies": [ { "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED", "bindingExplanations": [ { "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED", "combinedMembership": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_HIGH" }, "memberships": { "user:user1@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" }, { "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED", "combinedMembership": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "memberships": { "user:user2@example.com": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "relevance": "HEURISTIC_RELEVANCE_NORMAL", "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": { "user:user1@example.com": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "relevance": "HEURISTIC_RELEVANCE_NORMAL", "role": "roles/resourcemanager.organizationAdmin", "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED", "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL" } ], "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "policy": { "bindings": [ { "members": [ "user:user1@example.com" ], "role": "roles/compute.viewer" }, { "members": [ "user:user2@example.com" ], "role": "roles/owner" }, { "members": [ "user:user1@example.com" ], "role": "roles/resourcemanager.organizationAdmin" }, ], "etag": "BwX5/L9Vbg4=", "version": 3 }, "relevance": "HEURISTIC_RELEVANCE_HIGH" } ], "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "denyPolicyExplanation": { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "explainedResources": [ { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "explainedPolicies": [ { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "policy": { "createTime": "2023-04-18T07:15:47.702191Z", "displayName": "Deny compute instance get", "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=", "kind": "DenyPolicy", "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get", "rules": [ { "denyRule": { "deniedPrincipals": [ "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com" ], "deniedPermissions": [ "compute.googleapis.com/instances.get" ] } } ], "uid": "77e93c80-b383-0027-268e-a52a608aa13d", "updateTime": "2023-04-18T07:15:47.702191Z", }, "relevance": "HEURISTIC_RELEVANCE_HIGH", "ruleExplanations": [ { "combinedDeniedPermission": { "permissionMatchingState": "PERMISSION_PATTERN_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "combinedDeniedPrincipal": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "combinedExceptionPermission": { "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "combinedExceptionPrincipal": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "deniedPermissions": { "compute.googleapis.com/instances.get": { "permissionMatchingState": "PERMISSION_PATTERN_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "deniedPrincipals": { "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "denyAccessState": "DENY_ACCESS_STATE_DENIED", "relevance": "HEURISTIC_RELEVANCE_HIGH" } ] } ], "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012", "relevance": "HEURISTIC_RELEVANCE_HIGH" } ], "permissionDeniable": true, "relevance": "HEURISTIC_RELEVANCE_HIGH" }, "overallAccessState": "CANNOT_ACCESS" }
REST
プリンシパルに IAM 権限が付与されている(または付与されていない)理由を確認するには、Policy Troubleshooter API の iam.troubleshoot
メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
EMAIL
: 権限をトラブルシューティングする対象のプリンシパルのメールアドレス。RESOURCE
: 権限が付与されているリソース。PERMISSION
: トラブルシューティングする対象となる権限。PROJECT_ID
: リクエストに使用するプロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。
HTTP メソッドと URL:
POST https://policytroubleshooter.googleapis.com/v3/iam:troubleshoot
リクエストの本文(JSON):
{ "accessTuple": { "principal": "EMAIL", "fullResourceName": "RESOURCE", "permission": "PERMISSION" } }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "overallAccessState": "CANNOT_ACCESS", "accessTuple": { "principal": "user1@example.com", "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "permission": "compute.instances.get", "permissionFqdn": "compute.googleapis.com/instances.get", "conditionContext": { "effectiveTags": [ { "tagValue": "tagValues/281481941428044", "namespacedTagValue": "803434038361/env/dev", "tagKey": "tagKeys/281475994198094", "namespacedTagKey": "803434038361/env", "tagKeyParentName": "organizations/803434038361" } ] } }, "allowPolicyExplanation": { "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED", "explainedPolicies": [ { "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED", "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "bindingExplanations": [ { "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:user1@example.com": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_HIGH" } }, "relevance": "HEURISTIC_RELEVANCE_HIGH" }, { "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED", "role": "roles/owner", "rolePermission": "ROLE_PERMISSION_INCLUDED", "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH", "combinedMembership": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "memberships": { "user:user2@example.com": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, { "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED", "role": "roles/resourcemanager.organizationAdmin", "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED", "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL", "combinedMembership": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "memberships": { "user:user1@example.com": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "relevance": "HEURISTIC_RELEVANCE_NORMAL" } ], "relevance": "HEURISTIC_RELEVANCE_HIGH", "policy": { "version": 3, "etag": "BwX5/L9Vbg4=", "bindings": [ { "role": "roles/compute.viewer", "members": [ "user:user1@example.com" ] }, { "role": "roles/owner", "members": [ "user:user2@example.com" ] }, { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:user1@example.com" ] }, ] } } ], "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "denyPolicyExplanation": { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "explainedResources": [ { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012", "explainedPolicies": [ { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "policy": { "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get", "uid": "77e93c80-b383-0027-268e-a52a608aa13d", "kind": "DenyPolicy", "displayName": "Deny compute instance get", "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=", "createTime": "2023-04-18T07:15:47.702191Z", "updateTime": "2023-04-18T07:15:47.702191Z", "rules": [ { "denyRule": { "deniedPrincipals": [ "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com" ], "deniedPermissions": [ "compute.googleapis.com/instances.get" ] } } ] }, "ruleExplanations": [ { "denyAccessState": "DENY_ACCESS_STATE_DENIED", "combinedDeniedPermission": { "permissionMatchingState": "PERMISSION_PATTERN_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "deniedPermissions": { "compute.googleapis.com/instances.get": { "permissionMatchingState": "PERMISSION_PATTERN_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "combinedExceptionPermission": { "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "combinedDeniedPrincipal": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "deniedPrincipals": { "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": { "membership": "MEMBERSHIP_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" } }, "combinedExceptionPrincipal": { "membership": "MEMBERSHIP_NOT_MATCHED", "relevance": "HEURISTIC_RELEVANCE_NORMAL" }, "relevance": "HEURISTIC_RELEVANCE_HIGH" } ], "relevance": "HEURISTIC_RELEVANCE_HIGH" } ], "relevance": "HEURISTIC_RELEVANCE_HIGH" } ], "relevance": "HEURISTIC_RELEVANCE_HIGH", "permissionDeniable": true } }
トラブルシューティングの結果を理解する
コンソール
結果ページに含まれる情報は、次のとおりです。
評価の詳細
[評価の詳細] セクションには、トラブルシューティングしているアクセス権の概要(指定したプリンシパル、リソース、権限など)が記載されています。複数のリソースと権限のペアのトラブルシューティングを行う場合は、[アクセス権の評価] リストを使用して対象のペアを切り替えることができます。
ポリシーの詳細
[ポリシーの詳細] セクションには、関連する許可ポリシーと拒否ポリシーがプリンシパルのアクセスにどのように影響するかについての詳細が記載されています。
関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
[ポリシーの詳細] セクションには次のセクションがあります。
アクセス状態
[アクセス状態] セクションには、関連する IAM の許可ポリシーと拒否ポリシーに基づくプリンシパルのアクセス権の概要が記載されています。この概要には、拒否ポリシーの影響、許可ポリシーの影響、関連する拒否ポリシーと許可ポリシーに基づく最終的なアクセス結果が記載されています。
拒否ポリシー
[拒否ポリシー] セクションでは、プリンシパルへのアクセスを拒否するすべての拒否ポリシーを表示し、プリンシパルへのアクセスを拒否する拒否ルールを特定できます。また、拒否ルールがプリンシプルの権限を拒否する、または拒否しない理由を理解できます。
[拒否ポリシーを含むリソース] ペインには、関連するすべての拒否ポリシーが、接続先のリソース別に整理されて一覧表示されます。各拒否ポリシーの横にアクセス評価が表示されます。この評価はその拒否ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの拒否ポリシーを表示する権限がない場合は、リソースリストにそのリソースまたは拒否ポリシーは含まれません。
これらの拒否ポリシーに関連する拒否ルールを表示するには、拒否ポリシーをクリックします。リソースの拒否ポリシーのすべての拒否ルールを表示するには、リソースをクリックします。拒否ルールが [拒否ルール] ペインに表示されます。このペインには、クエリされたプリンシパルまたはリソースの権限、または選択した拒否ポリシーを含むすべての拒否ルールの表が表示されます。
[アクセス] 列には、拒否ルールによってプリンシパルが権限を拒否するかどうかが示されます。拒否ルールの詳細を表示するには、そのルールの行で [拒否ルールを表示] をクリックします。
許可ポリシー
[許可ポリシー] セクションでは、関連するすべての許可ポリシーをナビゲートし、プリンシパルへのアクセス権を付与するロール バインディングを特定できます。そして、ロール バインディングがプリンシパルに権限を付与する、または付与しない理由を理解できます。
[リソース] ペインには、指定したリソースとその祖先が一覧表示されます。各リソースの横にはアクセスの評価が表示されます。この評価はそのリソースの許可ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの許可ポリシーを表示する権限がない場合、リソースリストにそのリソースは含まれません。
リソースの許可ポリシーで関連するロール バインディングを表示し、プリンシパルに権限が付与されるかまたは付与されないかを確認するには、そのリソースをクリックします。許可ポリシーのバインディングが [ロール バインディング] ペインに表示されます。
[ロール バインディング] ペインには、選択したリソースの許可ポリシーのロール バインディングの表が表示されます。デフォルトでは、この表には、指定された権限を持つロールを含むロール バインディングのみが含まれます。プリンシパルがアクセス権を付与されていない場合は、編集可能なカスタムロールを付与されているロール バインディングも表に表示されます。すべてのロール バインディングを表示するには、[関連するバインディングのみを表示する] チェックボックスをオフにします。
[アクセス] 列には、ロール バインディングによってプリンシパルに権限が付与されているかどうかが表示されます。ロール バインディングの詳細を表示するには、そのバインディングの行にある [バインディングの詳細を表示] をクリックします。
gcloud
レスポンスには、4 つの主要なセクション(リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果、全体的なアクセス状態)があります。
-
accessTuple
: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。 -
allowPolicyExplanation
: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。許可ポリシーごとに、レスポンスはポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。
- バインディングに権限が含まれているかどうか。
- バインディングにプリンシパルが含まれているかどうか。
- バインディング内の条件(ある場合)が満たされているかどうか。
次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。
-
denyPolicyExplanation
: 関連する拒否ポリシーによってプリンシパルが権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。
- 拒否ルールに権限が含まれているかどうか。
- 権限が拒否ルールに例外として登録されているかどうか。
- 拒否ルールにプリンシパルが含まれているかどうか。
- プリンシパルが拒否ルールで例外として登録されているかどうか。
- 拒否ルール内の条件(ある場合)が満たされているかどうか。
-
overallAccessState
: プリンシパルが、関連する許可ポリシーと拒否ポリシーに基づいて、指定された権限を使用して指定されたリソースにアクセスできるかどうか。関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
HEURISTIC_RELEVANCE_HIGH
: オブジェクトが結果に大きな影響を与えることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。HEURISTIC_RELEVANCE_NORMAL
: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。
レスポンス内の多くのオブジェクトには、relevance
フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance
フィールドには次の値を指定できます。
REST
レスポンスには、4 つの主要なセクション(全体的なアクセス状態、リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果)が含まれます。
-
overallAccessState
: プリンシパルが、関連する許可ポリシーと拒否ポリシーに基づいて、指定された権限を使用して指定されたリソースにアクセスできるかどうか。関連する許可ポリシーと拒否ポリシーは次のとおりです。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
-
accessTuple
: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。 -
allowPolicyExplanation
: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。許可ポリシーごとに、レスポンスはポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。
- バインディングに権限が含まれているかどうか。
- バインディングにプリンシパルが含まれているかどうか。
- バインディング内の条件(ある場合)が満たされているかどうか。
次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。
-
denyPolicyExplanation
: 関連する拒否ポリシーによってプリンシパルが権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。
- 拒否ルールに権限が含まれているかどうか。
- 権限が拒否ルールに例外として登録されているかどうか。
- 拒否ルールにプリンシパルが含まれているかどうか。
- プリンシパルが拒否ルールで例外として登録されているかどうか。
- 拒否ルール内の条件(ある場合)が満たされているかどうか。
HEURISTIC_RELEVANCE_HIGH
: オブジェクトが結果に大きな影響を与えることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。HEURISTIC_RELEVANCE_NORMAL
: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。
レスポンス内の多くのオブジェクトには、relevance
フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance
フィールドには次の値を指定できます。
条件付きロール バインディングのトラブルシューティング
Policy Troubleshooter では、タグに基づいて条件付きロール バインディングと拒否ルールを自動的にトラブルシューティングします。ただし、他の種類の条件付きロール バインディングまたは条件付き拒否ルールのトラブルシューティングを行うには、Policy Troubleshooter でリクエストの追加のコンテキストが必要です。たとえば、日時属性に基づく条件をトラブルシューティングするには、ポリシーに関するトラブルシューティングにリクエストの時間が必要です。
gcloud CLI と REST API では、この追加のコンテキストを手動で指定します。
Google Cloud コンソールでは、管理アクティビティ監査ログまたはデータアクセス監査ログから直接トラブルシューティングを行うことで、この追加のコンテキストを提供できます。各監査ログエントリは、Google Cloud API に対する 1 つのリクエスト、または Google Cloud が自動的に行う 1 つのアクションに対応します。監査ログからトラブルシューティングすると、ポリシーに関するトラブルシューティングはリクエストの追加情報(日時など)を自動的に取得します。これにより、ポリシーに関するトラブルシューティングによる条件付きロール バインディングの分析およびルールの拒否が可能になります。
コンソール
条件付きロール バインディングと拒否ルールのトラブルシューティングを行うには、次の手順を行います。
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] をクリックしてから、[アクセスに関する問題のトラブルシューティング] をクリックします。
ポリシーに関するトラブルシューティングは、ログエントリの情報を使用してアクセス権のトラブルシューティングを行い、その結果を表示します。追加のコンテキストは、[条件コンテキスト] の下の評価の詳細に表示されます。コンテキストの詳細を表示するには、[条件コンテキストを表示] をクリックします。ポリシーに関するトラブルシューティングの結果ページの詳細については、このページのアクセス権のトラブルシューティングをご覧ください。
省略可: 条件付きロール バインディングと拒否ルールを含む別のリクエストのトラブルシューティングを行う場合は、[ログ エクスプローラ] ページに戻って前の手順を繰り返します。
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 }] } } ...
次のステップ
- 権限のリファレンスまたは事前定義ロールのリファレンスを使用して、権限のないユーザーにどのロールを付与するかを判断する。
- その他のポリシー インテリジェンス ツールについて確認する。これらのツールを使用して、ポリシーを理解し管理することで、セキュリティ構成を事前に改善できます。