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

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

ポリシーに関するトラブルシューティングにアクセスするには、Cloud Console、gcloud コマンドライン ツールまたは REST API を使用します。単純なクエリであれば、通常は、Cloud Console を使用するのが最も速い方法です。より複雑なシナリオでは、gcloud ツールまたは REST API の使用を検討してください。

必要な権限

ポリシーのトラブルシューティングでは、閲覧権限を持つ IAM ポリシーとロールに基づいて、リソースに対するプリンシパルのアクセス権を分析します。リソースに適用されるポリシーに対する閲覧権限、カスタムロールに対する閲覧権限がない場合は、プリンシパルにアクセス権があるかどうかを判断できないことがあります。

プリンシパルのアクセス権を完全にトラブルシューティングするには、次の権限を含むロールが必要です。

  • resourcemanager.projects.getIamPolicy
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.organizations.getIamPolicy
  • iam.roles.get
  • iam.roles.list

最小権限の原則に従いながらこれらの権限を取得するには、管理者に組織レベルでセキュリティ審査担当者のロール(roles/iam.securityReviewer)を付与するよう依頼してください。

あるいは、必要な権限を含む別のロールを管理者に付与してもらうこともできます。たとえば、カスタムロールや、許容範囲がより広い事前定義ロールなどです。

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

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

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

Console

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

アクセス権のトラブルシューティングを行うには、次のようにします。

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

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

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

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

  4. [API 呼び出しを確認] をクリックします。

ポリシーに関するトラブルシューティングの結果について

ポリシーに関するトラブルシューティングの結果からは、所定のリソースに対する指定された権限がプリンシパルに付与されているかどうかがわかります。また、リソースに適用される IAM ポリシーと、それらのポリシーのロール バインディングも一覧表示されます。

デフォルトでは、結果がコンパクト表示で表示されます。これには、指定された権限を含むロールのロール バインディングのみが含まれます。複数の権限のトラブルシューティングを行う場合は、[表示] プルダウン リストを使用して権限を切り替えます。

[コンパクト表示] は、[コンパクト表示] 切り替えをクリックすることで無効にできます。[コンパクト表示] を無効にすると、リソースに適用されているポリシーのロール バインディングがすべて表示されます。

結果ページに含まれる情報は、次のとおりです。

  • アクセスの概要: プリンシパルのアクセス権の概要。この情報により、プリンシパルがリソースに対する権限を持っているかどうかを判断できます。次の例の場合、my-user@example.com には my-project に対する logging.logs.view 権限が付与されています。

  • 関連するポリシーとロール バインディング: 特定のリソースに適用される IAM ポリシーと、各ポリシーのロール バインディングの一覧。各ロール バインディングの横には、指定した権限がそのロール バインディングでプリンシパルに付与されているかどうかを表すアイコンが表示されます。ロール バインディングをクリックすると、元のテキストが表示されます。

    次の例では、ログビューアのロール バインディングで権限が付与されています。

  • 関連するロール バインディングの未加工テキスト: 関連するロール バインディング リスト内の各ロール バインディングの未加工テキスト。ロール バインディングの構造の詳細については、ポリシーについてをご覧ください。

    各ロール バインディングでは、行が次のようにハイライト表示されます。

    • : 指定された権限を含むロールがある場合、指定されたプリンシパルを参照している場合、または指定されたプリンシパルを含むグループを参照している場合に、行は緑でハイライト表示されます。
    • : 他のロールを含む場合、別のプリンシパルを参照している場合、または指定したプリンシパルを含まないグループを参照している場合に、行は赤でハイライト表示されます。
    • : ロールの詳細を表示する権限がない場合、グループのメンバーを表示する権限がない場合に、行は黄色でハイライト表示されます。

gcloud

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

Policy Troubleshooter 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_DENIEDACCESS_TO_INFO_DENIED が返されます。

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

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

条件付きロール バインディングのトラブルシューティング

条件付きロール バインディングのトラブルシューティングを行う場合、ポリシーに関するトラブルシューティングには、リクエストの追加のコンテキストが必要です。たとえば、日時属性に基づく条件をトラブルシューティングするには、ポリシーに関するトラブルシューティングにリクエストの時間が必要です。

この追加のコンテキストを指定するには、管理アクティビティ監査ログまたはデータアクセス監査ログから直接トラブルシューティングを行います。各監査ログエントリは、Google Cloud APIs に対する 1 つのリクエスト、または Google Cloud が自動的に行う 1 つのアクションに対応します。監査ログからトラブルシューティングすると、ポリシーに関するトラブルシューティングはリクエストの追加情報(日時など)を自動的に取得します。これにより、ポリシーに関するトラブルシューティングによる条件付きロール バインディングの分析が可能になります。

この機能は Cloud Console でのみ使用できます。

条件付きロール バインディングのトラブルシューティングを行うには、次の手順を行います。

  1. Cloud Console で、[ログ エクスプローラ] ページに移動します。

    ログ エクスプローラに移動

  2. ページタイトルが [以前のログビューア] の場合は、[アップグレード] のプルダウン リストをクリックし、[新しいログ エクスプローラにアップグレード] を選択します。

  3. 管理アクティビティ監査ログとデータアクセス監査ログのみを表示するには、クエリビルダーで次のクエリを入力して、[クエリを実行] をクリックします。

    logName=("RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity" OR "RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Fdata_access")
    

    次の値を置き換えます。

    • RESOURCE_TYPE: 監査ログを一覧表示するリソースタイプ。projectsfolders または organizations を使用します。
    • RESOURCE_ID: リソースの ID。
  4. トラブルシューティングするリクエストに対応する監査ログエントリを探します。ログ エクスプローラを使用して特定のログエントリを検索する方法については、ログ エクスプローラの使用をご覧ください。

  5. ログエントリの [概要] 列で [IAM] をクリックしてから、[アクセスに関する問題のトラブルシューティング] をクリックします。

    ポリシーに関するトラブルシューティングは、ログエントリの情報を使用してアクセス権のトラブルシューティングを行い、その結果を表示します。追加のコンテキストは、アクセスの概要のすぐ下に表示されます。ポリシーに関するトラブルシューティングの結果ページの詳細については、このページのアクセス権のトラブルシューティングをご覧ください。

  6. 省略可: 条件付きロール バインディングを含む別のリクエストのトラブルシューティングを行う場合は、[ログ エクスプローラ] ページに戻って前の手順を繰り返します。

次のステップ