Identity and Access Management(IAM)の許可ポリシーと拒否ポリシーのトラブルシューティングには、いくつかの方法があります。
Policy Troubleshooter を使用する
特定のプリンシパルのアクセス権のトラブルシューティングが必要な場合は、IAM の Policy Troubleshooter を使用します。
IAM の Policy Troubleshooter を使用すると、ユーザーが特定のリソースにアクセスできる理由や、API を呼び出す権限がない理由を確認できます。メールアドレス、リソース、権限を指定すると、Policy Troubleshooter がリソースに適用されているすべての許可ポリシーと拒否ポリシーを調査します。これらのポリシーを使用して、プリンシパルに権限があるかどうかを示します。また、ポリシーのロール バインディングと拒否ルールを一覧表示し、プリンシパルのアクセス権への影響を示します。Policy Troubleshooter を使用して IAM の許可ポリシーと拒否ポリシーのトラブルシューティングを行う方法については、アクセスのトラブルシューティングをご覧ください。
リソースに適用される許可ポリシーと拒否ポリシーをすべて表示する
Google Cloud では、次の IAM ポリシーがリソースへのアクセスに影響します。
- リソースの許可ポリシー
- リソースの拒否ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
- リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)
親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、リソースへのアクセスに影響します。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。
たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。
同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。
これらのポリシーをすべて結合したものを、該当するポリシーまたは有効なポリシーといいます。
Google Cloud では、--include-deny
フラグを指定して gcloud beta projects
get-ancestors-iam-policy
コマンドを使用し、プロジェクトへのアクセスに影響するすべての IAM ポリシーのリストを取得できます。これらのポリシーからプロジェクトに有効なポリシーが構成されています。各ポリシーを調べて、プリンシパルのアクセス権にどのように影響するかを確認できます。
gcloud
後述のコマンドデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例:my-project
)。
gcloud beta projects get-ancestors-iam-policy
コマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json
Windows(PowerShell)
gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json
Windows(cmd.exe)
gcloud beta projects get-ancestors-iam-policy PROJECT_ID --include-deny --format=json
このレスポンスには、プロジェクトの許可ポリシーと拒否ポリシー、プロジェクトの祖先であるフォルダ、および組織が含まれています。次の例は、組織 1234567890123
とプロジェクト my-project
の許可ポリシーと、プロジェクト my-project
の拒否ポリシーを示しています。
[ { "id": "1234567890123", "policy": { "bindings": [ { "members": [ "group:cloud-admins@example.com" ], "role": "roles/iam.denyAdmin" }, { "members": [ "user:raha@example.com" ], "role": "roles/iam.serviceAccountAdmin" } ], "etag": "BwXW6Eab7TI=", "version": 1 }, "type": "organization" }, { "id": "my-project", "policy": { "bindings": [ { "members": [ "group:cloud-admins@example.com" ], "role": "roles/owner" } ], "etag": "BwXXjOM7L6M=", "type": "project" } }, { "id": "my-project", "policy": { "createTime": "2022-02-14T21:46:35.865279Z", "displayName": "My deny policy", "etag": "MTgyMzg2ODcwNTEyMjMxMTM3Mjg=", "kind": "DenyPolicy", "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/my-deny-policy", "rules": [ { "denyRule": { "deniedPermissions": [ "iam.googleapis.com/serviceAccounts.create" ], "deniedPrincipals": [ "principal://goog/subject/raha@example.com" ] }, "description": "Prevent service account creation" } ], "uid": "c83e3dc3-d8a6-6f51-4018-814e9f200b05", "updateTime": "2022-02-14T21:46:35.865279Z" }, "type": "project" } ]
この例で、ユーザー raha@example.com
には組織のサービス アカウント管理者ロール(roles/iam.serviceAccountAdmin
)が付与されていますが、raha@example.com
に iam.googleapis.com/serviceAccounts.create
権限の使用を許可しない拒否ポリシーがプロジェクトに設定されています。このため、raha@example.com
がプロジェクト my-project
でサービス アカウントを作成しようとすると、リクエストが拒否されます。
拒否ポリシーを使用しない組織の場合など、リソースで有効な許可ポリシーのみを表示する必要がある場合もあります。そのような場合は、次の方法で有効な許可ポリシーを表示できます。
Google Cloud コンソールでリソースの IAM 許可ポリシーを表示します。Google Cloud コンソールには、各リソースの有効なポリシーが自動的に表示されます。
Google Cloud コンソールでリソースの IAM 許可ポリシーを表示する方法については、現在のアクセス権を表示するをご覧ください。
Cloud Asset API を使用して、リソースの有効な許可ポリシーを取得します。詳細については、有効な IAM ポリシーの表示をご覧ください。
許可ポリシーを検索する
許可ポリシーで特定のロール バインディングを見つける必要がある場合は、許可ポリシーを検索できます。
Cloud Asset Inventory では、許可ポリシーを検索して、指定されたパラメータに一致するロール バインディングを確認できます。次のようなさまざまな検索パラメータを使用できます。
- リソースの種類
- プリンシパル タイプ
- ロール
- プロジェクト
- フォルダ
- 組織
詳細については、IAM 許可ポリシーの検索をご覧ください。