アクセス権のトラブルシューティング

Policy Troubleshooter を使用すると、ユーザーが特定のリソースにアクセスできる理由や、API を呼び出す権限がない理由を簡単に調べることができます。メールアドレス、リソース、権限を指定すると、リソースに適用されているすべての Cloud IAM ポリシーの調査が行われます。さらに、メンバーのロールにそのリソースに対する権限が含まれているかどうかが確認されます。含まれている場合は、メンバーとロールをバインドしているポリシーが確認されます。

Policy Troubleshooter にアクセスするには、Cloud Console、gcloud コマンドライン ツールまたは REST API を使用します。単純なクエリであれば、視覚補助機能も利用できる Cloud Console が便利です。複雑なシナリオの場合は、gcloud または REST API の使用を検討してください。

アクセス権のトラブルシューティング

アクセス権の問題を解決するには、次の情報が必要です。

  • プリンシパル: 確認するメールアドレス。メールアドレスは、ユーザーの場合もあれば、サービス アカウントや他のタイプのメンバーの場合もあります。
  • リソース: リソースの完全な名前。たとえば、プロジェクト my-project を確認するには //cloudresourcemanager.googleapis.com/projects/my-project と入力します。他のリソースタイプについては、完全なリソース名の例をご覧ください。
  • 権限: 確認する権限。Cloud Console の場合は、入力時に候補のリストが表示されます。権限の完全なリストについては、権限のリファレンスをご覧ください。

Console

Cloud Console で Policy Troubleshooter のページを開きます。

Policy Troubleshooter のページを開く

次に、確認するメールアドレス、リソース名、権限を入力します。

複数のリソースと権限を確認する場合は、[別のペアを追加] を選択して前の手順を繰り返します。

最後に [API 呼び出しを確認] を選択します。

結果ページの中央上部を見れば、リソースに対する権限がユーザーに付与されているかどうかがすぐにわかります。

トラブルシューティングの結果

デフォルトでは、結果がコンパクト表示で表示されます。これには特定のユーザーのアクセスについてのトラブルシューティングに直接関連する情報だけが含まれます。特に、アクセス権が付与されている場合、アクセス権を付与するバインディングだけが表示されます。アクセス権が拒否されている場合、目的の権限が含まれるロール(またはそれを含めるように変更できるカスタムロール)だけが表示されます。

切り替えスイッチを使用して、コンパクト表示を無効にできます。これによって、すべてのバインディングとメンバーが表示されます。

左側のペインには、指定したリソースに適用されるポリシーのリストと、メンバーに権限を付与するバインディングが各ポリシーに含まれているかどうかを示すアイコンが表示されます。以下の例では、「オーナー」バインディングがアクセスを許可しています。

トラブルシューティングのバインディング リスト

右側のペインには各バインディングの未加工テキストが表示され、権限を付与していない行は赤でハイライト表示されます。ユーザーにアクセス権を付与している行 39~46 はハイライト表示されていません。

トラブルシューティングのバインディング リスト

左側のペインで特定のバインディングを選択すると、詳細を表示できます。複数のリソースと権限のペアを入力した場合、[表示] プルダウンを使用して切り替えます。

gcloud

まず、トラブルシューティングを使用できるように環境を設定します。

Cloud Console を使用するか、次のコマンドを実行して、API を有効にします。

gcloud services enable policytroubleshooter.googleapis.com --project=[PROJECT-ID]
    

次に、プロジェクトを設定します。

gcloud config set project [PROJECT-ID]
    

設定が完了したら、次のコマンドを使用して、リソースに対する権限がユーザーに付与されているかどうかを調べられます。

gcloud policy-troubleshoot iam [RESOURCE] --principal-email [EMAIL] \
        --permission [PERMISSION]
    

次の例では、foo@example.com に、プロジェクト my-project に対する resourcemanager.projects.getIamPolicy 権限が付与されているかどうかを確認します。

gcloud policy-troubleshoot iam //cloudresourcemanager.googleapis.com/projects/my-project \
        --permission resourcemanager.projects.getIamPolicy --principal-email foo@example.com
    

コマンドを実行すると、ユーザーに権限が付与されているかどうかとその理由が YAML 形式で出力されます。次のようになります。

access: GRANTED
    explainedPolicies:
    - access: GRANTED
      bindingExplanations:
      - access: NOT_GRANTED
        memberships:
          serviceAccount:service-123@compute-system.iam.gserviceaccount.com: MEMBERSHIP_NOT_INCLUDED
        role: roles/compute.serviceAgent
        rolePermission: ROLE_PERMISSION_NOT_INCLUDED
      - access: GRANTED
        memberships:
          serviceAccount:service@my-project.iam.gserviceaccount.com: MEMBERSHIP_NOT_INCLUDED
          user:foo@example.com: MEMBERSHIP_INCLUDED
        role: roles/owner
        rolePermission: ROLE_PERMISSION_INCLUDED
      fullResourceName: //cloudresourcemanager.googleapis.com/projects/my-project
      policy:
        bindings:
        - members:
          - serviceAccount:service-123@compute-system.iam.gserviceaccount.com
          role: roles/compute.serviceAgent
        - members:
          - serviceAccount:foo@my-project.iam.gserviceaccount.com
          - user:foo@example.com
          role: roles/owner
        etag: BwWAOWEaIEg=
        version: 1
    - access: UNKNOWN_INFO_DENIED
    policy: {}
    

REST API

API Explorer を使用して REST API を試すことができます。

リクエスト:

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

本文:

{
      "principal": "[EMAIL]",
      "fullResourceName": "[RESOURCE]",
      "permission": "[PERMISSION]"
    }
    

すべてのパラメータが必須です。

次の本文の例では、foo@example.com に、プロジェクト my-project に対する resourcemanager.projects.getIamPolicy 権限が付与されているかどうかを確認します。

{
      "principal": "foo@example.com",
      "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
      "permission": "resourcemanager.projects.getIamPolicy"
    }
    

コマンドを実行すると、ユーザーに権限が付与されているかどうかとその理由が JSON 形式で出力されます。次のようになります。

{
      "access": "GRANTED",
      "explained_policies": [
          {
              "access": "GRANTED",
              "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
              "policy": {
                  "version": 1,
                  "etag": "BwWBUZjK9YQ=",
                  "bindings": [
                      {
                          "role": "roles/owner",
                          "members": [
                              "user:foo@example.com"
                          ]
                      }
                  ]
              },
              "binding_explanations": [
                  {
                      "access": "GRANTED",
                      "relevance: HIGH",
                      "role": "roles/owner",
                      "role_permission": "ROLE_PERMISSION_INCLUDED",
                      "role_permission_relevance": "HIGH",
                      "memberships": {
                          "key":  "user:foo@example.com",
                          "value": {
                              "membership": "MEMBERSHIP_INCLUDED",
                              "relevance":  "HIGH",
                          }
                      }
                  }
              ]
          },
          {
              "access": "UNKNOWN_INFO_DENIED",
              "policy": {}
          }
      ]
    }
    

グループ メンバーシップのトラブルシューティング

Google グループによって付与されたリソースに対する権限のトラブルシューティングを行うには、そのメンバーに対する表示権限が必要です。

権限がない場合、Cloud Console でグループがオレンジ色でハイライト表示され、プリンシパルにアクセス権が付与されているかどうか不明なことを通知する警告が表示されます。gcloud または REST API を使用している場合、レスポンスに UNKNOWN_INFO_DENIED または ACCESS_TO_INFO_DENIED が含まれます。

グループ メンバーシップのトラブルシューティング

G Suite 特権管理者とグループ管理者は通常、グループのメンバーシップを表示する権限を持っています。特権管理者またはグループ管理者ではないユーザーに権限のトラブルシューティングを許可するには、groups.read 特権(Admin API 特権にあります)を含むカスタムの G Suite 管理者のロールを作成し、このロールをユーザーに付与します。これにより、ドメイン内のすべてのグループのメンバーシップを表示し、アクセス権のトラブルシューティングを行うことができます。

制限事項

ポリシーのトラブルシューティングでは、リソースのアクセス権について詳細な情報が提供されるとは限りません。リソースに適用されるポリシーにアクセスできない場合、ポリシーのトラブルシューティングでは分析できません。たとえば、プロジェクト オーナーであっても、組織レベルの権限を持っていない場合、ポリシーのトラブルシューティングでは、プロジェクトにアクセス権を付与している組織レベルのポリシーを特定できません。

ポリシーのトラブルシューティングで最大の効果を得るには、セキュリティ審査担当者(roles/iam.securityReviewer)のロールが付与されている必要があります。このロールを持っていれば、適用可能なすべての Cloud IAM ポリシーを確実に参照できます。