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

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

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

始める前に

  • Enable the Policy Troubleshooter API.

    Enable the API

必要な権限

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

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

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

許可ポリシーと拒否ポリシーのトラブルシューティングを行う権限

許可ポリシーと拒否ポリシーのトラブルシューティングを行うには、トラブルシューティングの対象のリソースを含む組織に対する権限が必要です。これらの権限を使用すると、リソースへのアクセスを制御する許可ポリシーと拒否ポリシーを表示できます。

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

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

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

リソースの許可ポリシーと拒否ポリシーを表示する権限がない場合は、それらの許可ポリシーと拒否ポリシーのアクセス結果は Unknown になります。

プリンシパル アクセス境界ポリシーのトラブルシューティングを行う権限

プリンシパル アクセス境界ポリシーのトラブルシューティングを行うには、プリンシパル セットにプリンシパルが含まれている組織に対する権限が必要です。この組織を特定する方法は、プリンシパルのタイプによって異なります。

  • Google アカウントと Google グループ: プリンシパルを含む Google Workspace ドメインに関連付けられている組織
  • フェデレーション ID(Workforce Identity プールまたは Workload Identity プール内の ID): プリンシパルを含む ID プールを含む組織
  • サービス アカウント: サービス アカウントが作成されたプロジェクトを含む組織

これらの権限を使用すると、プリンシパルのアクセス対象を制御するプリンシパル アクセス境界ポリシーを表示できます。

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

  • プリンシパル アクセス境界ポリシー閲覧者roles/iam.principalAccessBoundaryViewer
  • プロジェクト、フォルダ、組織のプリンシパル セットにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: 組織管理者roles/resourcemanager.organizationAdmin
  • Google Workspace ドメインにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: Workspace プール IAM 管理者 roles/iam.workspacePoolAdmin
  • Workforce Identity プールにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: IAM Workforce プール管理者 roles/iam.workforcePoolAdmin
  • Workload Identity プールにバインドされているプリンシパル アクセス境界ポリシーのトラブルシューティングを行う: IAM Workload Identity プール管理者 roles/iam.workloadIdentityPoolAdmin

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

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

プリンシパルに適用されるプリンシパル アクセス境界ポリシーを表示する権限がない場合は、プリンシパル アクセス境界ポリシーのアクセス結果は Unknown になります。

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

許可ポリシーと拒否ポリシーにグループが含まれている場合、個々のグループ メンバーに対するアクセス権のトラブルシューティングを行うには、Google Workspace Admin API の権限 groups.read が必要です。特権管理者とグループ管理者にはこの権限が自動的に付与されます。特権管理者またはグループ管理者ではないユーザーにこの権限を付与するには、groups.read 特権(Admin API 特権にあります)を含むカスタムの Google Workspace 管理者ロールを作成し、ユーザーに付与します。

これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。

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

許可ポリシーと拒否ポリシーに Google Workspace アカウントまたは Cloud Identity ドメインが含まれている場合、個々のドメイン メンバーのアクセス権のトラブルシューティングを行うには、ドメイン管理者である必要があります。

これらの権限を付与されていない場合、グループまたはドメインを含むロール バインディングまたは拒否ルールの結果は、不明になります。ただし、ロール バインディングまたは拒否ルールにプリンシパルが明示的に含まれている場合を除きます。

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

アクセス権のトラブルシューティングには、次の情報が必要です。

  • プリンシパル: 確認するメールアドレス。メールアドレスは、ユーザーまたはサービス アカウントを参照している必要があります。グループ、ドメイン、Workforce ID、Workload ID など、他のタイプのプリンシパルはサポートされていません。
  • リソース: アクセスのトラブルシューティングを行うリソースの完全な名前。たとえば、プロジェクト 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. 確認するリソースの完全なリソース名を入力します。

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

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

      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 レスポンスが返されます。

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

Console

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

評価の詳細

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

ポリシーの詳細

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

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

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

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

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

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

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

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

アクセス状態

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

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

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

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

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

プリンシパル アクセス境界ポリシーは、次の方法でプリンシパルのアクセスに影響する可能性があります。

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

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

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

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

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

プリンシパル アクセス境界ルールは、ルールが 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 つのアクションに対応します。監査ログからトラブルシューティングすると、ポリシーに関するトラブルシューティングはリクエストの追加情報(日時など)を自動的に取得します。これにより、ポリシーに関するトラブルシューティングによる条件付きロール バインディングの分析およびルールの拒否が可能になります。

Console

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

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

次のステップ