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

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

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

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

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

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

Console

まず、Cloud Console で [ポリシーに関するトラブルシューティング] ページに移動します。

[ポリシーに関するトラブルシューティング] ページに移動

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

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

最後に [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

iam.troubleshoot メソッドは、メンバーが IAM 権限を持っている(または持っていない)理由を示します。

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • email: 権限をトラブルシューティングする対象のメンバーのメールアドレス。
  • resource: 権限が付与されているリソース。
  • permission: トラブルシューティングする対象となる権限。

HTTP メソッドと URL:

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

JSON 本文のリクエスト:

{
  "accessTuple": {
    "principal": "email",
    "fullResourceName": "resource",
    "permission": "permission"
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "access": "GRANTED",
  "explainedPolicies": [
    {
      "access": "GRANTED",
      "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
      "policy": {
        "version": 1,
        "etag": "BwWBUZjK9YQ=",
        "bindings": [
          {
            "role": "roles/owner",
            "members": [
              "user:foo@example.com"
            ]
          }
        ]
      },
      "bindingExplanations": [
        {
          "access": "GRANTED",
          "role": "roles/owner",
          "rolePermission": "ROLE_PERMISSION_INCLUDED",
          "rolePermissionRelevance": "HIGH",
          "memberships": {
            "key": "user:foo@example.com",
            "value": {
              "membership": "MEMBERSHIP_INCLUDED",
              "relevance": "HIGH",
            }
          },
        "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)のロールが付与されている必要があります。このロールを持っていれば、適用可能なすべての IAM ポリシーを確実に参照できます。

次のステップ

権限のリファレンスまたは定義済みロールのリファレンスを使用して、権限のないユーザーにどのロールを付与するかを判断する。