IAM 権限のトラブルシューティング

Policy Troubleshooter では、プリンシパルがリソースにアクセスできるかどうかを判断できます。プリンシパル、リソース、権限を指定すると、Policy Troubleshooter により、プリンシパルのアクセス権に影響する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界(PAB)ポリシーの調査が行われます。次に、それらのポリシーに基づいて、プリンシパルが指定された権限を使用してリソースにアクセスできるかどうかを示します。また、関連するポリシーを一覧表示し、プリンシパルのアクセス権に与える影響についても説明します。

ポリシーに関するトラブルシューティングには、Google Cloud コンソール、Google Cloud CLI、または REST API を使用してアクセスできます。単純なクエリについては、通常は、Google Cloud コンソールを使用するのが最も迅速に処理できる方法です。より複雑なシナリオでは、gcloud CLI または REST API の使用を検討してください。

始める前に

  • Policy Troubleshooter API を有効にします。

    API を有効にする

必要な権限

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

個別のプリンシパルのアクセス権に関するトラブルシューティングを行う権限

Policy Troubleshooter では、許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシー、閲覧権限を持つロールに基づいて、リソースに対するプリンシパルのアクセス権を分析します。リソースに適用されるポリシーに対する閲覧権限、カスタムロールに対する閲覧権限がない場合は、プリンシパルにアクセス権があるかどうかを判断できないことがあります。

プリンシパルのアクセス権のトラブルシューティングに必要な権限を取得するには、組織に対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

グループ メンバーのアクセス権に関するトラブルシューティングを行う権限

許可ポリシーと拒否ポリシーにグループが含まれている場合、個々のグループ メンバーのアクセス権のトラブルシューティングを行うには、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 Kubernetes Engine クラスタの compute.instances.get 権限のトラブルシューティングを試みると、compute.instance.get 権限を使用してGoogle Kubernetes Engine クラスタにアクセスできないため、リクエストは失敗します。

    権限の完全なリストについては、権限のリファレンスをご覧ください。

Console

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

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

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

  2. アクセス権を確認するプリンシパルのメールアドレスを入力します。

  3. 確認するリソースの完全なリソース名を入力します。

    完全なリソース名がわからない場合は、次のいずれかを行います。

    • プロジェクト、フォルダ、組織のアクセス権のトラブルシューティングを行う場合は、入力を開始すると、予測入力オプションが表示されます。
    • 別のリソースタイプのアクセスをトラブルシューティングする場合は、[Browse] をクリックしてリソース検索ダイアログを開き、リソースを検索します。

      1. [スコープを選択] ボックスで、検索するプロジェクト、フォルダ、組織を選択します。
      2. [リソースタイプ] ボックスで、検索するリソースタイプを選択します。
      3. [リソースを検索] ボックスに、リソース名の一部を入力します。
      4. 結果セクションで、確認するリソースを選択します。
      5. [選択] をクリックしてリソースを選択し、ダイアログを閉じます。
  4. 確認する権限を入力します。

    完全な権限名がわからない場合は、入力を開始すると予測入力オプションが表示されます。

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

  6. [アクセスを確認] をクリックします。

gcloud

プリンシパルに IAM 権限が付与されている(または付与されていない)理由を確認するには、gcloud beta policy-troubleshoot iam コマンドを使用します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • VERSION: 省略可。使用するコマンドのバージョン。許可ポリシーと拒否ポリシーのみに基づいてアクセスのトラブルシューティングを行う場合は、バージョンを指定しないでください。許可、拒否、プリンシパル アクセス境界のポリシーに基づいてアクセスをトラブルシューティングするには、バージョン beta を使用します。
  • EMAIL: 権限をトラブルシューティングする対象のプリンシパルのメールアドレス。
  • RESOURCE: 権限が付与されているリソース。
  • PERMISSION: トラブルシューティングする対象となる権限。

gcloud policy-troubleshoot iam コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION

Windows(PowerShell)

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION

Windows(cmd.exe)

gcloud VERSION policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION

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

レスポンス

{
  "accessTuple": {
    "conditionContext": {
      "destination": {},
      "effectiveTags": [
        {
          "namespacedTagKey": "project-1/tag-key-1",
          "namespacedTagValue": "project-1/tag-key-1/tag-value-1",
          "tagKey": "tagKeys/123456789012",
          "tagKeyParentName": "projects/123456789012",
          "tagValue": "tagValues/123456789012"
        },
      ],
      "request": {},
      "resource": {}
    },
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/project-1",
    "permission": "bigtable.instances.create",
    "permissionFqdn": "bigtable.googleapis.com/instances.create",
    "principal": "service-account-3@project-1.iam.gserviceaccount.com"
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "condition": {
              "expression": "resource.type == \"cloudresourcemanager.googleapis.com/Project\"",
              "title": "Resource-based condition"
            },
            "conditionExplanation": {
              "evaluationStates": [
                {
                  "end": 62,
                  "value": false
                }
              ],
              "value": false
            },
            "memberships": {
              "serviceAccount:service-account-1@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/bigquery.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "condition": {
              "expression": "resource.matchTag(\"project-1/tag-key-1\", \"tag-value-1\")",
              "title": "Tag-based condition"
            },
            "conditionExplanation": {
              "evaluationStates": [
                {
                  "end": 73,
                  "value": true
                }
              ],
              "value": true
            },
            "memberships": {
              "serviceAccount:service-account-2@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/bigquery.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/compute.admin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-1@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "user:user-3@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/iam.serviceAccountTokenCreator",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user-2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "user:user-1@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "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": {
              "serviceAccount:service-account-3@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              },
              "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.projectIamAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.tagViewer",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/project-1",
        "policy": {
          "bindings": [
            {
              "condition": {
                "expression": "resource.type == \"cloudresourcemanager.googleapis.com/Project\"",
                "title": "Resource-based condition"
              },
              "members": [
                "serviceAccount:service-account-1@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/bigquery.admin"
            },
            {
              "condition": {
                "expression": "resource.matchTag(\"project-1/tag-key-1\", \"tag-value-1\")",
                "title": "Tag-based condition"
              },
              "members": [
                "serviceAccount:service-account-2@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/bigquery.admin"
            },
            {
              "members": [
                "user:user-2@example.com"
              ],
              "role": "roles/compute.admin"
            },
            {
              "members": [
                "user:user-1@example.com",
                "user:user-3@example.com"
              ],
              "role": "roles/iam.serviceAccountTokenCreator"
            },
            {
              "members": [
                "user:user-2@example.com",
                "user:user-1@example.com"
              ],
              "role": "roles/owner"
            },
            {
              "members": [
                "serviceAccount:service-account-3@project-1.iam.gserviceaccount.com",
                "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/resourcemanager.projectIamAdmin"
            },
            {
              "members": [
                "serviceAccount:service-account-4@project-1.iam.gserviceaccount.com"
              ],
              "role": "roles/resourcemanager.tagViewer"
            }
          ],
          "etag": "BwYY6ttEMEY=",
          "version": 3
        },
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      },
    ],
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
            "policy": {
              "createTime": "2024-04-09T23:28:24.103203Z",
              "displayName": "Troubleshooter v3 prober non-tag deny policy",
              "etag": "MTgyMzk3MDY4OTY4MDE0ODg4OTY=",
              "kind": "DenyPolicy",
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F546942305807/denypolicies/deny-policy-1",
              "rules": [
                {
                  "denyRule": {
                    "deniedPermissions": [
                      "bigquery.googleapis.com/datasets.create"
                    ],
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/service-account-1@project-1.iam.gserviceaccount.com"
                    ]
                  }
                }
              ],
              "uid": "fab63b4d-ecfb-5f06-8a6d-602bf1be5062",
              "updateTime": "2024-05-20T23:29:38.428095Z"
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "ruleExplanations": [
              {
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_HIGH"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_HIGH"
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "bigquery.googleapis.com/datasets.create": {
                    "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_HIGH"
                  }
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/service-account-1@project-1.iam.gserviceaccount.com": {
                    "membership": "MEMBERSHIP_NOT_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_HIGH"
                  }
                },
                "denyAccessState": "DENY_ACCESS_STATE_NOT_DENIED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ]
          },
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "permissionDeniable": true,
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "overallAccessState": "CANNOT_ACCESS",
  "pabPolicyExplanation": {
    "explainedBindingsAndPolicies": [
      {
        "bindingAndPolicyAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
        "explainedPolicy": {
          "explainedRules": [
            {
              "combinedResourceInclusionState": "RESOURCE_INCLUSION_STATE_NOT_INCLUDED",
              "effect": "ALLOW",
              "explainedResources": [
                {
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL",
                  "resource": "//cloudresourcemanager.googleapis.com/projects/project-2",
                  "resourceInclusionState": "RESOURCE_INCLUSION_STATE_NOT_INCLUDED"
                }
              ],
              "relevance": "HEURISTIC_RELEVANCE_NORMAL",
              "ruleAccessState": "PAB_ACCESS_STATE_NOT_ALLOWED"
            }
          ],
          "policy": {
            "createTime": "2024-04-09T17:40:51.627668Z",
            "details": {
              "enforcementVersion": "1",
              "rules": [
                {
                  "effect": "ALLOW",
                  "resources": [
                    "//cloudresourcemanager.googleapis.com/projects/project-2"
                  ]
                }
              ]
            },
            "displayName": "Troubleshooter v3 PAB Policy",
            "etag": "m64s4IgR80eDJDywuVA2DA==",
            "name": "organizations/123456789012/locations/global/principalAccessBoundaryPolicies/example-pab-policy",
            "uid": "puid_11875429267422576641",
            "updateTime": "2024-04-09T17:40:51.627668Z"
          },
          "policyAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
          "policyVersion": {
            "enforcementState": "PAB_POLICY_ENFORCEMENT_STATE_NOT_ENFORCED",
            "version": 1
          },
          "relevance": "HEURISTIC_RELEVANCE_NORMAL"
        },
        "explainedPolicyBinding": {
          "conditionExplanation": {
            "evaluationStates": [
              {
                "end": 53,
                "value": true
              },
              {
                "end": 153,
                "start": 58,
                "value": false
              },
              {
                "end": 248,
                "start": 157,
                "value": false
              }
            ],
            "value": false
          },
          "policyBinding": {
            "condition": {
              "expression": "principal.type == 'iam.googleapis.com/ServiceAccount' && (principal.subject=='service-account-1@project-1.iam.gserviceaccount.com' || principal.subject=='service-account-2@project-1.iam.gserviceaccount.com')"
            },
            "createTime": "2024-04-09T17:51:13.504418Z",
            "displayName": "PAB Policy Binding on project-1 project",
            "etag": "W/\"hz9IKzHsIqvopqDRcVYDxQ==\"",
            "name": "projects/123456789012/locations/global/policyBindings/example-policy-binding",
            "policy": "organizations/123456789012/locations/global/principalAccessBoundaryPolicies/example-pab-policy",
            "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
            "policyUid": "puid_11875429267422576641",
            "target": {
              "principalSet": "//cloudresourcemanager.googleapis.com/projects/project-1"
            },
            "uid": "buid_1012746966204940289", 
            "updateTime": "2024-05-09T23:08:56.846355Z"
          },
          "policyBindingState": "POLICY_BINDING_STATE_NOT_ENFORCED",
          "relevance": "HEURISTIC_RELEVANCE_NORMAL"
        },
        "relevance": "HEURISTIC_RELEVANCE_NORMAL"
      }
    ],
    "principalAccessBoundaryAccessState": "PAB_ACCESS_STATE_NOT_ENFORCED",
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  }
}

REST

プリンシパルに IAM 権限が付与されている(または付与されていない)理由を確認するには、Policy Troubleshooter API の iam.troubleshoot メソッドを使用します。

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

  • VERSION: このリクエストに使用する API バージョン。許可ポリシーと拒否ポリシーのみに基づいてアクセスのトラブルシューティングを行う場合は、v3 を使用します。許可、拒否、プリンシパル アクセス境界のポリシーに基づいてアクセスをトラブルシューティングするには、v3beta を使用します。
  • EMAIL: 権限をトラブルシューティングする対象のプリンシパルのメールアドレス。
  • RESOURCE: 権限が付与されているリソース。
  • PERMISSION: トラブルシューティングする対象となる権限。
  • PROJECT_ID: リクエストに使用するプロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

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

JSON 本文のリクエスト:

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION"
  }
}

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

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

トラブルシューティングの結果を理解する

コンソール

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

評価の詳細

[評価の詳細] セクションには、トラブルシューティングしているアクセス権の概要(指定したプリンシパル、リソース、権限など)が記載されています。複数のリソースと権限のペアのトラブルシューティングを行う場合は、[アクセス権の評価] リストを使用して対象のペアを切り替えることができます。

ポリシーの詳細

[ポリシーの詳細] セクションには、関連する許可、拒否、プリンシパル アクセス境界のポリシーがプリンシパルのアクセス権にどのように影響するかの詳細が表示されます。

関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされるすべてのプリンシパル アクセス境界ポリシーが含まれます。

関連する許可ポリシーと拒否ポリシーは次のとおりです。

  • リソースの許可ポリシー
  • リソースの拒否ポリシー(ある場合)
  • リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
  • リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)

親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。

たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。

同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。

[ポリシーの詳細] セクションには次のセクションがあります。

アクセス状態

[アクセス状態] セクションには、各ポリシータイプ(プリンシパル アクセス境界ポリシー、拒否ポリシー、許可ポリシー)の結果を要約し、全体的な結果を示します。結果は、関連するポリシーに従って、プリンシパルがリソースにアクセスする権限を使用できるかどうかを示します。

ユーザーがリソースにアクセスするための権限を使用できるようにするには、すべてのポリシータイプでアクセスを許可する必要があります。詳細については、ポリシーの評価をご覧ください。

プリンシパル アクセス境界ポリシー

[プリンシパル アクセス境界ポリシー] セクションでは、プリンシパルが対象とするすべてのプリンシパル アクセス境界ポリシーと、これらのポリシーをプリンシパルにバインドするポリシー バインディングを表示できます。

[ポリシー] ペインには、そのプリンシパルを含むプリンシパル セットにバインドされているすべてのポリシーが一覧表示されます。各ポリシーの横に、ポリシーがプリンシパルのアクセス権にどのように影響するかを示すアイコンが表示されます。

プリンシパル アクセス境界ポリシーは、次のようにプリンシパルのアクセス権に影響を与える可能性があります。

  • プリンシパルがリソースにアクセスできる: プリンシパル アクセス境界ポリシーが適用され、そのルールの 1 つにクエリ対象のリソースが含まれます。
  • プリンシパルがリソースにアクセスできない: プリンシパル アクセス境界ポリシーが適用されますが、クエリ対象のリソースがそのポリシーのルールにありません。
  • 未適用: 次の状況では、プリンシパル アクセス境界ポリシーは適用されません。

    • IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで、指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
    • ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
    • プリンシパル アクセス境界ポリシーにルールはありません。

    プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかには影響しません。

プリンシパル アクセス境界ポリシーに関連付けられているルールとバインディングを表示するには、ポリシー名をクリックします。[Policies] ペインの横にあるペインに、ポリシーの詳細が表示されます。

ポリシーのルールを表示するには、[境界ルール] タブをクリックします。このタブには、関連するプリンシパル アクセス境界ポリシーのルールのテーブルが表示されます。

プリンシパル アクセス境界ルールは、ルールが Policy Troubleshooter クエリの全体的な結果に影響を与える場合に関連するものです。そのため、関連するルールは、Policy Troubleshooter の結果によって異なります。たとえば、次のような状況について考えてみます。

  • Policy Troubleshooter では、プリンシパルがリソースにアクセスできることが示されます。そのため、関連するルールは、プリンシパルがリソースにアクセスできるようにするルールです。
  • Policy Troubleshooter では、プリンシパルがリソースにアクセスできないことが示されます。ただし、関連するプリンシパル アクセス境界ポリシーに従って、プリンシパルはリソースにアクセスできます。その結果、プリンシパルのアクセス境界ポリシーは、プリンシパルがリソースにアクセスできない理由ではないため、ルールは適用されません。
  • Policy Troubleshooter では、プリンシパルがリソースにアクセスできないことが示されます。さらに、関連するプリンシパル アクセス境界ポリシーにより、プリンシパルはリソースにアクセスできません。そのため、適用されるルールは、プリンシパルがリソースにアクセスできないルールです。

ポリシーのプリンシパル アクセス境界ルールをすべて表示するには、[関連するルールとバインディングのみを表示] チェックボックスをオフにします。

境界ルールテーブルの [検出結果] 列には、プリンシパル アクセス境界ルールにクエリ対象のリソースが含まれているかどうかを示します。ルールの詳細を表示するには、[ルールの詳細を表示] をクリックします。

ポリシーのポリシー バインディングを表示するには、[バインディング] タブをクリックします。このタブには、選択したプリンシパル アクセス境界ポリシーに関連するポリシー バインディングの表が表示されます。

ポリシー バインディングは、クエリ対象のプリンシパルにプリンシパル アクセス境界ポリシーを効果的に適用した場合に関連します。プリンシパル アクセス境界ポリシーをプリンシパルに適用するポリシー バインディングの場合、次の条件を満たしている必要があります。

  • ポリシー バインディングのプリンシパル セットに、クエリされたプリンシパルが含まれている
  • ポリシー バインディングの条件は、クエリされたプリンシパルに対して true と評価される必要があります。

クエリされたプリンシパルがバインディングの条件を満たしているかどうかにかかわらず、クエリされたプリンシパルを含むプリンシパル セットを持つすべてのポリシー バインディングを表示するには、[関連するルールとバインディングのみを表示する] チェックボックスをオフにします。

バインディング テーブルの [検出結果] 列は、クエリ対象のプリンシパルにバインディングが適用されているかどうかを示します。ロール バインディングの詳細を表示するには、[バインディングの詳細を表示] をクリックします。

拒否ポリシー

[拒否ポリシー] セクションでは、プリンシパルへのアクセスを拒否するすべての拒否ポリシーを表示し、プリンシパルへのアクセスを拒否する拒否ルールを特定できます。また、拒否ルールがプリンシプルの権限を拒否する、または拒否しない理由を理解できます。

[拒否ポリシーを含むリソース] ペインには、関連するすべての拒否ポリシーが、接続先のリソース別に整理されて一覧表示されます。各拒否ポリシーの横にアクセス評価が表示されます。この評価はその拒否ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの拒否ポリシーを表示する権限がない場合は、リソースリストにそのリソースまたは拒否ポリシーは含まれません。

これらの拒否ポリシーに関連する拒否ルールを表示するには、拒否ポリシーをクリックします。リソースの拒否ポリシーのすべての拒否ルールを表示するには、リソースをクリックします。拒否ルールが [拒否ルール] ペインに表示されます。このペインには、クエリされたプリンシパルまたはリソースの権限、または選択した拒否ポリシーを含むすべての拒否ルールの表が表示されます。

[アクセス] 列には、拒否ルールによってプリンシパルが権限を拒否するかどうかが示されます。拒否ルールの詳細を表示するには、そのルールの行で [拒否ルールを表示] をクリックします。

許可ポリシー

[許可ポリシー] セクションでは、関連するすべての許可ポリシーをナビゲートし、プリンシパルへのアクセス権を付与するロール バインディングを特定できます。そして、ロール バインディングがプリンシパルに権限を付与する、または付与しない理由を理解できます。

[リソース] ペインには、指定したリソースとその祖先が一覧表示されます。各リソースの横にはアクセスの評価が表示されます。この評価はそのリソースの許可ポリシーにのみ適用されます。継承されたポリシーからのアクセスは反映されません。リソースの許可ポリシーを表示する権限がない場合、リソースリストにそのリソースは含まれません。

リソースの許可ポリシーで関連するロール バインディングを表示し、プリンシパルに権限が付与されるかまたは付与されないかを確認するには、そのリソースをクリックします。許可ポリシーのロール バインディングが [ロール バインディング] ペインに表示されます。

[ロール バインディング] ペインには、選択したリソースの許可ポリシーのロール バインディングの表が表示されます。デフォルトでは、この表には、指定された権限を持つロールを含むロール バインディングのみが含まれます。プリンシパルがアクセス権を付与されていない場合は、編集可能なカスタムロールを付与されているロール バインディングも表に表示されます。すべてのロール バインディングを表示するには、[関連するバインディングのみを表示する] チェックボックスをオフにします。

[アクセス権] 列は、ロール バインディングによってプリンシパルに権限が付与されているかどうかを示します。ロール バインディングの詳細を表示するには、そのロール バインディングの行にある [バインディングの詳細を表示] をクリックします。

gcloud

レスポンスには、4 つの主要なセクション(リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果、全体的なアクセス状態)があります。

  • accessTuple: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。
  • allowPolicyExplanation: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。

    レスポンスは、許可ポリシーごとにポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。

    • ロール バインディングに権限が含まれているかどうか。
    • ロール バインディングにプリンシパルが含まれるかどうか。
    • ロール バインディング内の条件(ある場合)が満たされているかどうか。

    次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。

  • denyPolicyExplanation: 関連する拒否ポリシーによってプリンシパルが権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。

    拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。

    • 拒否ルールに権限が含まれているかどうか。
    • 権限が拒否ルールに例外として登録されているかどうか。
    • 拒否ルールにプリンシパルが含まれているかどうか。
    • プリンシパルが拒否ルールで例外として登録されているかどうか。
    • 拒否ルール内の条件(ある場合)が満たされているかどうか。
  • overallAccessState: プリンシパルが、関連する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシーに基づいて、指定されたリソースにアクセスするために、指定された権限を使用できるかどうか。

    関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされるすべてのプリンシパル アクセス境界ポリシーが含まれます。

    関連する許可ポリシーと拒否ポリシーは次のとおりです。

    • リソースの許可ポリシー
    • リソースの拒否ポリシー(ある場合)
    • リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
    • リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)

    親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。

    たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。

    同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。

    ユーザーがリソースにアクセスするための権限を使用できるようにするには、すべてのポリシータイプでアクセスを許可する必要があります。詳細については、ポリシー評価をご覧ください。

  • pabPolicyExplanation: 関連するプリンシパル アクセス境界ポリシーでプリンシパルにリソースへのアクセスを許可するかどうかの概要。続いて、関連するプリンシパル アクセス境界ポリシー バインディングとプリンシパル アクセス境界ポリシー。

    プリンシパル アクセス境界ポリシーでは、アクセスを許可するか、アクセスを許可しないか、適用しないかのいずれかを選択できます。次の状況では、プリンシパル アクセス境界ポリシーは適用されません。

    • IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで、指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
    • ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
    • プリンシパル アクセス境界ポリシーにルールはありません。

    プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかには影響しません。

    レスポンスには、プリンシパルを含むすべてのポリシー バインディングと、各ポリシー バインディングのプリンシパル アクセス境界ポリシーの詳細も表示されます。

    • プリンシパル アクセス境界ポリシー バインディングごとに、レスポンスでプリンシパルにポリシー バインディングが適用されているかどうかと、ポリシー バインディングのテキストが出力されます。バインディング内のプリンシパル セットにクエリされたプリンシパルが含まれ、クエリされたプリンシパルに対してポリシー バインディングの条件が true と評価された場合、ポリシー バインディングが適用されます。ポリシー バインディングが適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかに影響しません。
    • プリンシパル アクセス境界ポリシーごとに、レスポンスには次の内容が出力されます。

      • ポリシーがアクセスを許可するか、アクセスを許可しないか、または適用されないか。
      • ポリシーの適用バージョン。このバージョン番号によって、IAM がクエリされた権限に対してこのプリンシパル アクセス境界ポリシーを適用するかどうかが決まります。権限が適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかには影響しません。
      • プリンシパル アクセス境界ポリシーのルールと、各ルールがアクセスを許可するかどうか。ルールごとに、クエリされたリソースがルールに含まれているかどうかがレスポンスで示されます。

        次のいずれかに該当する場合は、リソースがルールに含まれます。

        • リソースがルールに一覧表示されます。プリンシパル アクセス境界ルールで直接一覧表示できるのは、Resource Manager リソース(プロジェクト、フォルダ、組織)のみです。
        • リソースの祖先のいずれか(つまり、リソース階層のリソースより上位のプロジェクト、フォルダ、または組織)がルールにリストされます。

レスポンス内の多くのオブジェクトには、relevance フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance フィールドには次の値を指定できます。

  • HEURISTIC_RELEVANCE_HIGH: オブジェクトが結果に大きな影響を与えることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。

  • HEURISTIC_RELEVANCE_NORMAL: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。

REST

レスポンスには、4 つの主要なセクション(全体的なアクセス状態、リクエスト内のアクセスタプルの説明、許可ポリシーの評価の結果、拒否ポリシーの評価の結果)が含まれます。

  • overallAccessState: プリンシパルが、関連する許可ポリシー、拒否ポリシー、プリンシパル アクセス境界ポリシーに基づいて、指定されたリソースにアクセスするために、指定された権限を使用できるかどうか。

    関連するプリンシパル アクセス境界ポリシーには、プリンシパルを含むプリンシパル セットにバインドされるすべてのプリンシパル アクセス境界ポリシーが含まれます。

    関連する許可ポリシーと拒否ポリシーは次のとおりです。

    • リソースの許可ポリシー
    • リソースの拒否ポリシー(ある場合)
    • リソースの親プロジェクト、フォルダ、組織の許可ポリシー(ある場合)
    • リソースの親プロジェクト、フォルダ、組織の拒否ポリシー(ある場合)

    親プロジェクト、フォルダ、組織の許可ポリシーと拒否ポリシーは、ポリシーの継承のため、関連性があります。プロジェクト、フォルダ、組織に許可ポリシーまたは拒否ポリシーを適用すると、そのプロジェクト、フォルダ、組織内のすべてのリソースにポリシーが適用されます。

    たとえば、組織の拒否ポリシーで、プリンシパルが特定の権限を使用できない場合、プリンシパルは組織内のどのリソースに対しても、その権限を使用できません。このルールは、その組織内のフォルダとプロジェクトのほうが制限の緩い拒否ポリシーを使用している場合や、プリンシパルに権限を付与する許可ポリシーを使用している場合でも適用されます。

    同様に、プロジェクトの許可ポリシーでプリンシパルに特定の権限が付与されている場合、この権限が拒否されない限り、プリンシパルはプロジェクト内の任意のリソースに対する権限を持ちます。

    ユーザーがリソースにアクセスするための権限を使用できるようにするには、すべてのポリシータイプでアクセスを許可する必要があります。詳細については、ポリシー評価をご覧ください。

  • accessTuple: リクエスト内のアクセスタプルの説明(指定した条件コンテキストを含む)。このセクションには、リソースに適用されるタグの概要も記載されています。
  • allowPolicyExplanation: 関連する許可ポリシーがプリンシパルに権限を付与するかどうかの概要と、許可ポリシーとそのロール バインディングのリスト。

    レスポンスは、許可ポリシーごとにポリシー内のすべてのロール バインディングを一覧表示し、次の基準に基づいて評価します。

    • ロール バインディングに権限が含まれているかどうか。
    • ロール バインディングにプリンシパルが含まれるかどうか。
    • ロール バインディング内の条件(ある場合)が満たされているかどうか。

    次に、レスポンスには、許可ポリシーの完全な JSON テキストが出力されます。

  • denyPolicyExplanation: 関連する拒否ポリシーによってプリンシパルが権限を拒否するかどうかの概要と、拒否ポリシーを含むリソースのリスト。リソースごとに、レスポンスにはリソースに接続されているすべての拒否ポリシーが一覧表示されます。

    拒否ポリシーごとに、レスポンスはポリシーのメタデータを出力し、ポリシー内の拒否ルールを一覧表示してから、次の基準に基づいて各ルールを評価します。

    • 拒否ルールに権限が含まれているかどうか。
    • 権限が拒否ルールに例外として登録されているかどうか。
    • 拒否ルールにプリンシパルが含まれているかどうか。
    • プリンシパルが拒否ルールで例外として登録されているかどうか。
    • 拒否ルール内の条件(ある場合)が満たされているかどうか。
  • pabPolicyExplanation: 関連するプリンシパル アクセス境界ポリシーでプリンシパルにリソースへのアクセスを許可するかどうかの概要。続いて、関連するプリンシパル アクセス境界ポリシー バインディングとプリンシパル アクセス境界ポリシー。

    プリンシパル アクセス境界ポリシーでは、アクセスを許可するか、アクセスを許可しないか、適用しないかのいずれかを選択できます。次の状況では、プリンシパル アクセス境界ポリシーは適用されません。

    • IAM は、プリンシパル アクセス境界ポリシーの適用バージョンで、指定された権限を適用しません。そのため、プリンシパル アクセス境界ポリシーでアクセスをブロックすることはできません。
    • ポリシー バインディングの条件により、プリンシパル アクセス境界ポリシーまたはバインディングがプリンシパルに適用されません。
    • プリンシパル アクセス境界ポリシーにルールはありません。

    プリンシパル アクセス境界ポリシーが適用されていない場合、プリンシパルがリソースにアクセスできるかどうかには影響しません。

    レスポンスには、プリンシパルを含むすべてのポリシー バインディングと、各ポリシー バインディングのプリンシパル アクセス境界ポリシーの詳細も表示されます。

    • プリンシパル アクセス境界ポリシー バインディングごとに、レスポンスでプリンシパルにポリシー バインディングが適用されているかどうかと、ポリシー バインディングのテキストが出力されます。バインディング内のプリンシパル セットにクエリされたプリンシパルが含まれ、クエリされたプリンシパルに対してポリシー バインディングの条件が true と評価された場合、ポリシー バインディングが適用されます。ポリシー バインディングが適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかに影響しません。
    • プリンシパル アクセス境界ポリシーごとに、レスポンスには次の内容が出力されます。

      • ポリシーがアクセスを許可するか、アクセスを許可しないか、または適用されないか。
      • ポリシーの適用バージョン。このバージョン番号によって、IAM がクエリされた権限に対してこのプリンシパル アクセス境界ポリシーを適用するかどうかが決まります。権限が適用されていない場合、ポリシーはプリンシパルがリソースにアクセスできるかどうかには影響しません。
      • プリンシパル アクセス境界ポリシーのルールと、各ルールがアクセスを許可するかどうか。ルールごとに、クエリされたリソースがルールに含まれているかどうかがレスポンスで示されます。

        次のいずれかに該当する場合は、リソースがルールに含まれます。

        • リソースがルールに一覧表示されます。プリンシパル アクセス境界ルールで直接一覧表示できるのは、Resource Manager リソース(プロジェクト、フォルダ、組織)のみです。
        • リソースの祖先のいずれか(つまり、リソース階層のリソースより上位のプロジェクト、フォルダ、または組織)がルールにリストされます。

レスポンス内の多くのオブジェクトには、relevance フィールドもあります。このフィールドの値は、オブジェクトが全体的なアクセス状態にどの程度寄与するかを示します。relevance フィールドには次の値を指定できます。

  • HEURISTIC_RELEVANCE_HIGH: オブジェクトが結果に大きな影響を与えることを示します。言い換えると、オブジェクトを削除すると、全体的なアクセス状態が変更される可能性があります。たとえば、指定された権限をプリンシパルに付与するロール バインディングは、この関連性の値を持ちます。

  • HEURISTIC_RELEVANCE_NORMAL: オブジェクトによる結果への影響が限られていることを示します。言い換えると、オブジェクトを削除しても、全体的なアクセス状態は変わらない可能性があります。たとえば、権限またはプリンシパルを含まない拒否ルールには、この関連性値が設定されtています。

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

Policy Troubleshooter では、タグに基づいて条件付きロール バインディングと拒否ルールを自動的にトラブルシューティングします。また、プリンシパルに基づく条件で、プリンシパル アクセス境界ポリシー バインディングを自動的にトラブルシューティングします。

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

gcloud CLI と REST API では、この追加のコンテキストを手動で指定します。

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

コンソール

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

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

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

  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] をクリックしてから、[アクセスに関する問題のトラブルシューティング] をクリックします。

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

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

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
    }]
  }
}
...

次のステップ