Policy Simulator でロールの変更をテストする

このページでは、Policy Simulator を使用して IAM 許可ポリシーの変更をシミュレートする方法について説明します。また、シミュレーションの結果を解釈する方法と、シミュレートした許可ポリシーを適用する方法(そのように選択した場合)についても説明します。

この機能は、許可ポリシーに基づいてアクセスのみを評価します。

他のタイプのポリシーの変更をシミュレートする方法については、以下をご覧ください。

始める前に

必要な権限

許可ポリシーの変更をシミュレートする前に、適切な権限を付与されていることを確認する必要があります。シミュレーションを実行するには特定の権限が必要です。他の権限は必須ではありませんが、シミュレーションで最大限の結果を得るために役立ちます。

Identity and Access Management(IAM)ロールの詳細については、ロールについてをご覧ください。

必要なターゲット リソース権限

シミュレーションの「ターゲット リソース」は、許可ポリシーをシミュレートするリソースです。

シミュレーションを実行するために必要な権限を取得するには、ターゲット リソースに対して次の IAM ロールを付与するよう管理者に依頼してください。

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

これらの事前定義ロールには、シミュレーションの実行に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

シミュレーションを実行するには、次の権限が必要です。

  • cloudasset.assets.searchAllResources
  • policysimulator.replays.run
  • service.resource.getIamPolicy。ここで、resource はターゲット リソースのリソースタイプ、service はそのリソースを所有する Google Cloud サービスの名前です。

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

必要なホストリソース権限

シミュレーションの「ホストリソース」は、シミュレーションを作成して実行するプロジェクト、フォルダ、または組織です。ホストリソースをターゲット リソースに関連付ける必要はありません。

ホストリソースの設定方法は、お使いのプラットフォームによって異なります。

Console

ホストリソースは、リソース セレクタに表示されているプロジェクト、フォルダ、または組織です。

ホストリソースを変更するには、リソース セレクタで別のプロジェクト、フォルダ、または組織を選択します。

gcloud

ホストリソースは、現在の割り当てプロジェクトです。割り当てプロジェクトを設定するには、gcloud auth application-default set-quota-project コマンドを使用します。

REST

リクエストを送信するたびに、ホストリソースを手動で指定します。詳細については、このページのポリシーの変更をシミュレートするをご覧ください。

シミュレーションの実行に必要な権限を取得するには、ホストリソースに対してシミュレーション管理者roles/policysimulator.admin)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

この事前定義ロールには、シミュレーションの実行に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

シミュレーションを実行するには、次の権限が必要です。

  • policysimulator.replayResults.list
  • policysimulator.replays.create
  • policysimulator.replays.get

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

シミュレーションで最大限の結果を得るには、特定の IAM 権限と Google Workspace 権限を持つことをおすすめします。これらの権限の一部または全部がない場合でも、シミュレーションは実行できます。ただし、これらの権限なしでシミュレーションを実行すると、シミュレーションの結果に影響を与える可能性のある情報を取得できないため、不明なアクセス権変更の数が増える可能性があります。

シミュレーションを実行するときは、組織のセキュリティ レビュー担当者のロール(roles/iam.securityReviewer)を持つことをおすすめします。あるいは、すでにセキュリティ管理者のロール(roles/iam.securityAdmin)を持っている場合は、追加のロールを付与する必要はありません。

これらのロールによって、シミュレーションから最大限の結果を得るために役立つ次の権限が付与されます。

  • カスタムロールが定義されている関連プロジェクト、フォルダ、組織の iam.roles.getiam.roles.list。プロジェクト、フォルダ、または組織は、許可ポリシーをシミュレートするリソースの祖先または子孫である場合、関連します。
  • service.resource.getIamPolicyresource は許可ポリシーを持つことができるリソースタイプの名前、service はそのリソースを所有する Google Cloud サービスの名前です)

    シミュレーションを実行するときは、次の条件を満たす各リソースに対してこの権限を持つことをおすすめします。

    • Policy Simulator がリソースをサポートしている
    • リソースに、ユーザーのアクセスに影響を与える可能性のある許可ポリシーがある。これは、次のいずれかに該当する場合に当てはまります。

      • リソースが、許可ポリシーをシミュレートするリソースの子孫であり、関連するアクセスログに表示されている。
      • リソースが、許可ポリシーをシミュレートするリソースの祖先である。

    たとえば、プロジェクトの許可ポリシーをシミュレートするとします。アクセスログにプロジェクト内の Cloud Storage バケットに対するアクセス試行が含まれている場合は、そのバケットに対する storage.buckets.getIamPolicy 権限が必要です。プロジェクトに許可ポリシーを持つ親フォルダがある場合は、そのフォルダに対する resourcemanager.folders.getIamPolicy 権限も必要です。

元の許可ポリシーと提案された許可ポリシーで各 Google グループのグループ メンバー情報を取得するための権限が付与されている状態を推奨します。

Google Workspace 特権管理者とグループ管理者は通常、グループ メンバーを表示する権限を持っています。特権管理者またはグループ管理者でない場合は、groups.read 特権(Admin API 特権にあります)を含むカスタムの Google Workspace 管理者ロールを作成して付与するよう Google Workspace 管理者に依頼してください。これにより、ドメイン内のすべてのグループのメンバーシップを表示し、許可ポリシーの変更をより効果的にシミュレートできます。

ポリシーの変更をシミュレートする

許可ポリシーの変更をシミュレートする手順は次のとおりです。

Console

次の例は、プロジェクトの許可ポリシーの変更をシミュレートする方法を示しています。ただし、許可ポリシーを持つ任意のリソースについて、許可ポリシーの変更をシミュレートできます。

プリンシパルの権限を編集してから、[保存] ではなく [変更をテスト] をクリックします。

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] ページに移動

  2. 既存のプリンシパルの権限を編集して、許可ポリシーに提案された変更を作成します。

    1. アクセス権を編集するプリンシパルを見つけて、右側の [編集] ボタンをクリックします。
    2. 新しいロールを追加するか、既存のロールを取り消しまたは変更することで、プリンシパルのアクセス権を編集します。
  3. 提案された変更をシミュレートするには、[変更をテスト] をクリックします。

  4. 数分後、シミュレーション結果がアクセス権の変更のリストとして Google Cloud コンソールに表示されます。詳細については、このページの Policy Simulator の結果についてをご覧ください。

    既存の許可ポリシーとシミュレートされた許可ポリシーの間でアクセス権に変更がない場合、Google Cloud コンソールにはアクセス権の変更は表示されません。

gcloud

許可ポリシーの変更をシミュレートするには、read-modify-write のパターンに沿いますが、書き込む代わりに許可ポリシーをシミュレートします。

  1. 次のコマンドを実行して、現在の許可ポリシーを読み取ります。

    gcloud resource-type get-iam-policy resource-id --format=format > filepath

    次の値を置き換えます。

    • resource-type: 許可ポリシーをシミュレートするリソースのタイプ。例: projects
    • resource-id: 許可ポリシーをシミュレートするリソースの ID。例: my-project
    • format: レスポンスの形式。値 json または yaml を使用します。
    • filepath: 許可ポリシーの新しい出力ファイルのパス。

    たとえば、次のコマンドはプロジェクト my-project の許可ポリシーを JSON 形式で取得し、ユーザーのホーム ディレクトリに保存します。

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json
  2. get-iam-policy コマンドにより返された JSON または YAML の許可ポリシーを変更して、シミュレートする変更を反映します。

    許可ポリシーに加えることができる変更には、いくつかの種類があります。たとえば、ロール バインディングに対するプリンシパルの追加や削除や、ポリシーからのロール バインディングの削除ができます。

  3. 次のコマンドを実行して、許可ポリシーの変更をシミュレートします。

    gcloud iam simulator replay-recent-access \
        full-resource-name \
        filepath \
        --format=format

    次の値を置き換えます。

    • full-resource-name: 許可ポリシーをシミュレートするリソースの完全なリソース名。

      完全なリソース名は、サービス名とリソースのパスで構成される URI です。たとえば、プロジェクトの許可ポリシーをシミュレートする場合は、//cloudresourcemanager.googleapis.com/projects/project- id を使用します。ここで、project-id は許可ポリシーをシミュレーションするプロジェクトの ID です。

      完全なリソース名の形式の一覧については、完全なリソース名をご覧ください。

    • filepath: シミュレートする変更された許可ポリシーを含むファイルのパス。例: ~/proposed_policy.json

    • format: レスポンスの形式。たとえば、jsonyaml です。

    数分後、提案された許可ポリシーが適用された場合にプリンシパルのアクセス権がどのように変更されるかを示すリプレイ結果のリストが出力されます。この結果には、サポートされていないリソースタイプに起因するエラーなど、シミュレーション中に発生したエラーも表示されます。

    結果の読み方については、このページの Policy Simulator の結果についてをご覧ください。シミュレーション結果を表示するのではなく保存する方法については、シミュレーション結果の保存をご覧ください。

    ユーザー my-user@example.com を含む許可ポリシー シミュレーションのサンプル レスポンスを以下に示します。この場合、変更案が適用されると、my-user@example.com にはプロジェクト my-projectresourcemanager.projects.list 権限と resourcemanager.projects.get 権限がなくなる可能性があり、プロジェクト my-projectresourcemanager.projects.update 権限は確実になくなります。

    [
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.list",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 12,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.get",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to view group membership.",
                      "resourceName": "group:everyone@example.com",
                      "resourceType": "Google group"
                    }
                  ],
                  "message": "Missing permission to view group membership."
                },
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "bindingExplanations": [
                    {
                      "access": "UNKNOWN_INFO_DENIED",
                      "memberships": {
                        "group:everyone@example.com": {
                          "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                        }
                      },
                      "role": "roles/owner"
                    }
                  ],
                  "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                  "policy": {
                    "bindings": [
                      {
                        "members": [
                          "group:everyone@example.com"
                        ],
                        "role": "roles/owner"
                      }
                    ],
                    "etag": "BwWgJSIInYA=",
                    "version": 3
                  }
                },
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 10,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.update",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "NOT_GRANTED"
            }
          }
        },
        "lastSeenDate": {
          "day": 15,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {},
        "error": {
          "code": 12,
          "details": [
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.create"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.setIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.delete"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.update"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "pubsub.topics.publish"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.list"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.getIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.get"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            }
          ],
          "message": "Simulator does not yet support all resource types for 8 removed permissions."
        }
      }
    ]

    既存の許可ポリシーとシミュレートされた許可ポリシーの間でアクセス権に変更がない場合、このコマンドは「No access changes found in the replay」と出力します。

REST

許可ポリシーの変更をシミュレートするには、read-modify-write のパターンに沿いますが、許可ポリシーを書き込む代わりに、シミュレーションを作成して実施します。

  1. リソースの許可ポリシーを読み取ります。

    プロジェクトの許可ポリシーを取得するには、Resource Manager API の projects.getIamPolicy メソッドを使用します。

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

    • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

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

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

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "user:project-owner@example.com"
          ]
        },
        {
          "role": "roles/iam.securityReviewer",
          "members": [
            "user:fatima@example.com"
          ]
        }
      ]
    }
    

  2. 返された許可ポリシーを変更して、シミュレートする変更を反映します。

    許可ポリシーに加えることができる変更には、いくつかの種類があります。たとえば、ロール バインディングに対するプリンシパルの追加や削除や、ポリシーからのロール バインディングの削除ができます。

  3. 変更した許可ポリシーを使用してシミュレーション(リプレイ)を作成します。

    プロジェクト、フォルダ、または組織のリプレイを作成するには、Policy Simulator API の replays.create メソッドを使用します。

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

    • HOST_RESOURCE_TYPE: リプレイをホストするリソースのタイプ。この値は projectsfolders、または organizations にする必要があります。
    • HOST_RESOURCE_ID: ホストリソースの ID(例: my-project)。
    • TARGET_FULL_RESOURCE_NAME: ポリシーをシミュレートするリソースの完全なリソース名。このリソースは、IAM ポリシーを受け入れる任意のリソースにできます。ホストリソースに関連付ける必要はありません。

      完全なリソース名は、サービス名とリソースのパスで構成される URI です。たとえばプロジェクトのポリシーをシミュレートする場合は、//cloudresourcemanager.googleapis.com/projects/PROJECT_ID を使用します。ここで、PROJECT_ID は、ポリシーをシミュレートするプロジェクトの ID です。

      リソース名の形式の一覧については、完全なリソース名をご覧ください。

    • POLICY: シミュレートするポリシー。ポリシーの例については、ポリシー リファレンスをご覧ください。

      複数のポリシーをシミュレートするには、リクエスト本文に複数の "OBJECT_FULL_RESOURCE_NAME" : POLICY ペアを含めます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

    HTTP メソッドと URL:

    POST https://policysimulator.googleapis.com/v1/HOST_RESOURCE_TYPE/HOST_RESOURCE_ID/locations/global/replays

    リクエストの本文(JSON):

    {
      "config": {
        "policyOverlay": {
          "TARGET_FULL_RESOURCE_NAME" : POLICY
        }
      }
    }
    

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

    レスポンスには、リプレイを表すオペレーションの名前が含まれます。

    {
      "name": "operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8",
      "metadata": {
        "type_url": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata"
      }
    }
    

  4. リプレイが完了するまで operations.get メソッドをポーリングします。

    オペレーションをポーリングするには、レスポンスに "done": true フィールドと完了したリプレイの名前を持つ name フィールドが含まれるまで、operations.get メソッドを繰り返し呼び出すことをおすすめします。2 つのリクエストの間には、切り捨て型指数バックオフを使用して遅延時間を設けてください。

    リプレイの状態を取得するには、Policy Simulator API の operations.get メソッドを使用します。

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

    • OPERATION_NAME: operations プレフィックスを含むリプレイ オペレーションの名前。この値は、replays.create レスポンスの name フィールドからコピーします(例: operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8)。
    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

    HTTP メソッドと URL:

    GET https://policysimulator.googleapis.com/v1/OPERATION_NAME

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

    進行中のオペレーションは、次のようなレスポンスを返します。

    {
      "name": "operations/42083b6b-3788-41b9-ae39-e97d7615a22d",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:34:14.732Z"
      }
    }
    

    完了したオペレーションは、次のようなレスポンスを返します。

    {
      "name": "operations/89ab4892-9605-4c84-aedb-4fce4fc5195b",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:40:15.922Z"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.Replay",
        "replay": {
          "name": "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b",
          "state": SUCCEEDED,
          "config": {},
          "resultsSummary": {
            "logCount": 1319,
            "unchangedCount": 1169,
            "differenceCount": 149,
            "errorCount": 1,
            "oldestDate": {
              "year": 2020,
              "month": 10,
              "day": 15
            },
            "newestDate": {
              "year": 2021,
              "month": 1,
              "day": 12
            }
          }
        }
      }
    }
    

  5. リプレイの結果を取得します。

    リプレイの結果を取得するには、Policy Simulator API の replays.results.list メソッドを使用します。

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

    • REPLAY_NAME: 結果を取得するリプレイの名前。この値は、operations.get レスポンスの response.replay.name フィールドからコピーします。任意のリソースタイプとロケーション プレフィックスを含めます(例: "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b")。
    • PAGE_SIZE: 省略可。このリクエストから返される結果の最大数。指定しなかった場合、サーバーが結果数を決定します。結果の数がページサイズより大きい場合、レスポンスには、結果の次のページを取得するために使用するページ設定トークンが含まれます。
    • PAGE_TOKEN: 省略可。以前のレスポンスでこのメソッドから返されたページ設定トークン。指定すると、前のリクエストが終了した時点から結果のリストが開始します。
    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

    HTTP メソッドと URL:

    GET https://policysimulator.googleapis.com/v1/REPLAY_NAME/results?pageSize=page-size&pageToken=PAGE_TOKEN

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

    レスポンスには、ポリシー案が適用された場合にプリンシパルのアクセス権がどのように変更されるかを示す結果のリストが含まれます。この結果には、シミュレーション中に発生したエラー(特にサポートされていないリソースタイプに起因するエラー)も表示されます。

    結果の読み方については、このページの Policy Simulator の結果についてをご覧ください。

    ユーザー my-user@example.com が関与するポリシー シミュレーションのレスポンスの例を次に示します。この場合、変更案が適用されると、my-user@example.com にはプロジェクト my-projectresourcemanager.projects.list 権限と resourcemanager.projects.get 権限がなくなる可能性があり、プロジェクト my-projectresourcemanager.projects.update 権限は確実になくなります。

    {
      "replayResults": [
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.list",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.get",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to view group membership.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to view group membership.",
                        "resourceName": "group:everyone@example.com",
                        "resourceType": "Google group"
                      }
                    ]
                  },
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "bindingExplanations": [
                      {
                        "access": "UNKNOWN_INFO_DENIED",
                        "memberships": {
                          "group:everyone@example.com": {
                            "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                          }
                        },
                        "role": "roles/owner"
                      }
                    ],
                    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                    "policy": {
                      "bindings": [
                        {
                          "members": [
                            "group:everyone@example.com"
                          ],
                          "role": "roles/owner"
                        }
                      ],
                      "etag": "BwWgJSIInYA=",
                      "version": 3
                    }
                  },
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.update",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "NOT_GRANTED"
              }
            }
          }
        },
        {
          "accessTuple": {},
          "error": {
            "code": 12,
            "message": "Simulator does not yet support all resource types for 8 removed permissions.",
            "details": [
              {
                "@type": "type.googleapis.com/google.rpc.Status",
                "code": 12,
                "message": "Simulator does not yet support all resource types for 8 removed permissions.",
                "details": [
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.create"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.setIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.delete"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.update"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "pubsub.topics.publish"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.list"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.getIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.get"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  }
                ]
              }
            ]
          }
        }
      ],
      "nextPageToken": "AWukk3zjv80La+chWx6WNt7X8czGPLtP792gRpkNVEV/URZ/VdWzxmuJKr"
    }
    

    既存の許可ポリシーとシミュレートされた許可ポリシーの間でアクセス権に変更がない場合、リクエストは空のリスト({})を返します。

Policy Simulator の結果を理解する

Policy Simulator は、許可ポリシーに対して提案された変更の影響について、アクセス権変更のリストとしてレポートします。それぞれのアクセス権の変更は、現在の許可ポリシーと提案された許可ポリシーで異なる結果となる、過去 90 日間のアクセス試行を表しています。

Policy Simulator は、シミュレーション中に発生したエラーも一覧表示します。これにより、シミュレーションにおいて可能性のあるギャップを特定できます。

これらの変更とエラーの表示は、お使いのプラットフォームによって異なります。

Console

Policy Simulator の結果ページには、シミュレーションの結果が複数のセクションに表示されます。

  • ポリシーの変更: このセクションには、変更を提案する許可ポリシーのリソース、削除を提案するロール、追加を提案するロールが一覧表示されています。

    このセクションには、[ポリシーの差分を表示] ボタンも表示されます。このボタンをクリックすると、提案された変更の前後など、リソースの許可ポリシーの内容を確認できます。

  • 権限の変更: このセクションには、削除された権限と追加された権限の数が表示されます。これは、提案された変更を適用した場合にプリンシパルの権限がどのように変化するかを示します。この権限の数は、継承されたロールを無視して、プリンシパルの現在のロールの権限とプリンシパルに提案されたロールの権限を比較して計算されます。

    このセクションには、[権限の差分を表示] ボタンも表示されます。このボタンをクリックすると、プリンシパルの現在のロールの権限と、提案されたロールの権限を並べて比較できます。

  • 過去 90 日間のアクセス変更: このセクションには、過去 90 日間に行われたアクセスで、提案された許可ポリシーと現在の許可ポリシーで結果が異なるアクセス試行が示されます。このセクションには、アクセス権変更の概要と、詳細な結果を示すテーブルの両方が含まれます。

    アクセス権の変更の概要には、アクセス権の変更の種類別の数、エラーと不明な結果の数、提案された許可ポリシーと現在の許可ポリシーで同じ結果となったアクセス試行の数が示されます。シミュレートできなかった権限の数も表示されます。詳細については、このページのエラーをご覧ください。

    このセクションには、アクセス権の変更のテーブルも含まれています。このテーブルには、過去 90 日間に提案された許可ポリシーと現在の許可ポリシーで異なる結果が生じたアクセス試行の一覧が表示されています。各エントリには、プリンシパルがアクセスしようとしていたリソース、リクエストの日付、リクエストを行ったプリンシパル、リクエスト内の権限、現在の許可ポリシーと提案された許可ポリシーでのアクセス ステータスの比較結果が含まれます。

    アクセス権の変更には、次に挙げる複数の方法があります。

    アクセス権の変更 詳細
    アクセス権が取り消されました プリンシパルは現在の許可ポリシーでアクセス可能ですが、提案された変更の後にアクセスできなくなりました。
    アクセス権が取り消された可能性があります

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーでアクセスできましたが、提案された許可ポリシーでのアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更の後はアクセスできなくなります。
    アクセス権が付与されました プリンシパルは現在の許可ポリシーではアクセスできず、提案された変更の後にアクセス可能になります。
    アクセス権が付与された可能性があります

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーではアクセスが許可されていませんが、提案された変更後のアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更後にアクセスが許可されます。
    アクセス権が不明 現在の許可ポリシーと提案された許可ポリシーの両方におけるプリンシパルのアクセス権は不明であり、提案された変更がプリンシパルのアクセス権に影響を及ぼす可能性があります。
    エラー シミュレーション中にエラーが発生しました。

    アクセス権の変更について詳細を表示するには、アクセス権の変更をクリックします。これにより、[アクセス権の変更の詳細] パネルが開き、プリンシパルの既存のアクセス権、プリンシパルのアクセス権案、アクセス権の変更結果に関する詳細など、アクセス権の変更に関する詳細が表示されます。

gcloud

replay-recent-access コマンドを使用すると、gcloud CLI のレスポンスに replayResults のリストが含まれます。

各リプレイ結果には、提案された許可ポリシーが試行時に適用された場合に結果が異なることになるアクセス試行が記述されます。たとえば次のリプレイ結果は、my-user@example.com が過去にプロジェクト my-project でアクションを行うために resourcemanager.projects.update 権限を使用していたことを示しています。しかし提案された許可ポリシーが適用されていた場合は、アクセス権は拒否されていました。

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

各リプレイ結果には次のフィールドがあります。

  • accessTuple: 結果が関連するアクセス試行。このフィールドには、アクセス試行に関係するリソース、権限、プリンシパルが含まれます。

  • lastSeenDate: アクセス試行が最後に行われた日。

  • diff.accessDiff または error: アクセス試行のリプレイが成功すると、結果には diff.accessDiff フィールドが含まれ、現在の許可ポリシーと提案された許可ポリシーでのアクセス試行の結果の差異がレポートされます。リプレイ試行が成功しなかった場合、リプレイ結果にはエラーの説明とともに error フィールドが含まれます。シミュレーション エラーの詳細については、このページのエラーをご覧ください。

各アクセス差分には、次のコンポーネントがあります。

  • baseline: 現在の許可ポリシーを使用した場合のアクセス結果。GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED のいずれかの値としてレポートされます。結果が UNKNOWN_CONDITIONAL または UNKNOWN_INFO_DENIED の場合、レスポンスには、不明な情報に関連するエラーと、そのエラーに関連する許可ポリシーも表示されます。UNKNOWN 値の詳細については、このページの不明な結果をご覧ください。
  • simulated: 提案された許可ポリシーを使用した場合のアクセス結果。GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED のいずれかの値としてレポートされます。結果が UNKNOWN_CONDITIONAL または UNKNOWN_INFO_DENIED の場合、レスポンスには、不明な情報に関連するエラーと、そのエラーに関連する許可ポリシーも表示されます。UNKNOWN 値の詳細については、このページの不明な結果をご覧ください。
  • accessChange: ベースライン アクセス状態とシミュレートされたアクセス状態の間の変更。可能性のある値のリストについては、次の表をご覧ください。

    アクセス権の変更 詳細
    ACCESS_REVOKED プリンシパルは現在の許可ポリシーでアクセス可能ですが、提案された変更の後にアクセスできなくなりました。
    ACCESS_MAYBE_REVOKED

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーでアクセスできましたが、提案された許可ポリシーでのアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更の後はアクセスできなくなります。
    ACCESS_GAINED プリンシパルは現在の許可ポリシーではアクセスできず、提案された変更の後にアクセス可能になります。
    ACCESS_MAYBE_GAINED

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーではアクセスが許可されていませんが、提案された変更後のアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更後にアクセスが許可されます。
    UNKNOWN_CHANGE 現在の許可ポリシーと提案された許可ポリシーの両方におけるプリンシパルのアクセス権は不明であり、提案された変更がプリンシパルのアクセス権に影響を及ぼす可能性があります。

REST

replays.results.list メソッドを呼び出すと、レスポンスに replayResults のリストが含まれます。

各リプレイ結果には、提案された許可ポリシーが試行時に適用された場合に結果が異なることになるアクセス試行が記述されます。たとえば次のリプレイ結果は、my-user@example.com が過去にプロジェクト my-project でアクションを行うために resourcemanager.projects.update 権限を使用していたことを示しています。しかし提案された許可ポリシーが適用されていた場合は、アクセス権は拒否されていました。

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

各リプレイ結果には次のフィールドがあります。

  • accessTuple: 結果が関連するアクセス試行。このフィールドには、アクセス試行に関係するリソース、権限、プリンシパルが含まれます。

  • lastSeenDate: アクセス試行が最後に行われた日。

  • diff.accessDiff または error: アクセス試行のリプレイが成功すると、結果には diff.accessDiff フィールドが含まれ、現在の許可ポリシーと提案された許可ポリシーでのアクセス試行の結果の差異がレポートされます。リプレイ試行が成功しなかった場合、リプレイ結果にはエラーの説明とともに error フィールドが含まれます。シミュレーション エラーの詳細については、このページのエラーをご覧ください。

各アクセス差分には、次のコンポーネントがあります。

  • baseline: 現在の許可ポリシーを使用した場合のアクセス結果。GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED のいずれかの値としてレポートされます。結果が UNKNOWN_CONDITIONAL または UNKNOWN_INFO_DENIED の場合、レスポンスには、不明な情報に関連するエラーと、そのエラーに関連する許可ポリシーも表示されます。UNKNOWN 値の詳細については、このページの不明な結果をご覧ください。
  • simulated: 提案された許可ポリシーを使用した場合のアクセス結果。GRANTEDNOT_GRANTEDUNKNOWN_CONDITIONALUNKNOWN_INFO_DENIED のいずれかの値としてレポートされます。結果が UNKNOWN_CONDITIONAL または UNKNOWN_INFO_DENIED の場合、レスポンスには、不明な情報に関連するエラーと、そのエラーに関連する許可ポリシーも表示されます。UNKNOWN 値の詳細については、このページの不明な結果をご覧ください。
  • accessChange: ベースライン アクセス状態とシミュレートされたアクセス状態の間の変更。可能性のある値のリストについては、次の表をご覧ください。

    アクセス権の変更 詳細
    ACCESS_REVOKED プリンシパルは現在の許可ポリシーでアクセス可能ですが、提案された変更の後にアクセスできなくなりました。
    ACCESS_MAYBE_REVOKED

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーでアクセスできましたが、提案された許可ポリシーでのアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更の後はアクセスできなくなります。
    ACCESS_GAINED プリンシパルは現在の許可ポリシーではアクセスできず、提案された変更の後にアクセス可能になります。
    ACCESS_MAYBE_GAINED

    この結果が発生する理由として以下のことが考えられます。

    • プリンシパルは現在の許可ポリシーではアクセスが許可されていませんが、提案された変更後のアクセス権は不明です。
    • 現在の許可ポリシーでのプリンシパルのアクセス権は不明ですが、提案された変更後にアクセスが許可されます。
    UNKNOWN_CHANGE 現在の許可ポリシーと提案された許可ポリシーの両方におけるプリンシパルのアクセス権は不明であり、提案された変更がプリンシパルのアクセス権に影響を及ぼす可能性があります。

不明な結果

アクセス結果が不明の場合、Policy Simulator では、アクセス試行を完全に評価するための情報が不足していたことを意味します。

Console

アクセス結果が不明な場合、不明であった理由に加えて、アクセスまたは評価できなかった具体的なロール、許可ポリシー、グループ メンバー、条件が [アクセス権の変更の詳細] パネルに報告されます。

結果が不明な場合は、次のような理由が考えられます。

  • ロール情報が拒否されました: シミュレーションを実行しているプリンシパルに、シミュレートされている 1 つ以上のロールの詳細を表示する権限がありませんでした。
  • ポリシーにアクセスできません: シミュレーションを実行しているプリンシパルに、シミュレーションに関係する 1 つ以上のリソースの許可ポリシーを取得する権限がありませんでした。
  • メンバー情報が拒否されました: シミュレーションを実行しているプリンシパルに、提案された許可ポリシーに含まれる 1 つ以上のグループのメンバーを表示する権限がありませんでした。
  • サポートされていない条件: テスト対象の許可ポリシーに条件付きロール バインディングがあります。Policy Simulator は条件をサポートしていないため、バインディングを評価できませんでした。

gcloud

gcloud CLI では、シミュレーションの結果のアクセス差分において、結果が不明である理由が報告されます。

アクセス結果が不明な理由は、次のいずれかです。

  • UNKNOWN_INFO_DENIED: アクセス状態の評価に必要な情報にアクセスする権限がユーザーにありません。これは、次のいずれかの理由で発生する可能性があります。

    • ユーザーに、シミュレートされている許可ポリシーを取得する権限がないか、アクセスログ内のリソースの許可ポリシーを取得する権限がない。
    • ユーザーに、グループ メンバーを表示する権限がない。
    • ユーザーが必要なロール情報を取得できない。

    欠落した情報を確認するには、レポートされたアクセス状態に続くエラー情報をご覧ください。

  • UNKNOWN_CONDITIONAL: テスト対象の許可ポリシーに、条件付きロール バインディングがあります。Policy Simulator は条件をサポートしていないため、バインディングを評価できませんでした。

結果が不明な場合、許可ポリシーのフィールド(baseline または simulated)には、情報が不明であった理由を示す errors フィールドと、エラーに関連する許可ポリシーを示す policies フィールドが含まれます。エラーの詳細については、このページのエラーをご覧ください。

REST

REST API で、シミュレーションの結果には、結果が不明である理由がアクセス差分でレポートされます。

アクセス結果が不明な理由は、次のいずれかです。

  • UNKNOWN_INFO_DENIED: アクセス状態の評価に必要な情報にアクセスする権限がユーザーにありません。これは、次のいずれかの理由で発生する可能性があります。

    • ユーザーに、シミュレートされている許可ポリシーを取得する権限がないか、アクセスログ内のリソースの許可ポリシーを取得する権限がない。
    • ユーザーに、グループ メンバーを表示する権限がない。
    • ユーザーが必要なロール情報を取得できない。

    欠落した情報を確認するには、レポートされたアクセス状態に続くエラー情報をご覧ください。

  • UNKNOWN_CONDITIONAL: テスト対象の許可ポリシーに、条件付きロール バインディングがあります。Policy Simulator は条件をサポートしていないため、バインディングを評価できませんでした。

結果が不明な場合、許可ポリシーのフィールド(baseline または simulated)には、情報が不明であった理由を示す errors フィールドと、エラーに関連する許可ポリシーを示す policies フィールドが含まれます。エラーの詳細については、このページのエラーをご覧ください。

エラー

Policy Simulator では、シミュレーション中に発生したエラーもレポートされます。シミュレーションで発生する可能性のあるギャップを理解するために、これらのエラーを確認することが重要です。

Console

Policy Simulator のレポートでは、以下のようなさまざまなタイプのエラーが報告される可能性があります。

  • オペレーション エラー: シミュレーションを実行できなかった場合に発生します。 Policy Simulator は、結果ページの上部でオペレーション エラーをレポートします。

    プロジェクトまたは組織でログが多すぎるため、シミュレーションを実行できなかったことを示すエラー メッセージが表示された場合は、そのリソースでシミュレーションを実行できません。

    他の理由でこのエラーが発生した場合は、もう一度シミュレーションを実行してみてください。それでもシミュレーションを実行できない場合は、policy-simulator-feedback@google.com までお問い合わせください。

  • リプレイエラー: 1 回のアクセス試行のリプレイが失敗したため、Policy Simulator は、アクセス試行の結果が提案された許可ポリシーに基づいて変更されるかどうかを判定できませんでした。

    Google Cloud コンソールでは、[Access changes over the last 90 days] テーブルにリプレイエラーが表示されます。各エラーの [アクセス権の変更の詳細] パネルには、問題の理解に役立つエラー メッセージに加えて、エラー発生時にシミュレートされていたリソースと権限が表示されます。

  • サポートされていないリソースタイプのエラー: 提案された許可ポリシーは、Policy Simulator がシミュレーションできないサポートされていないリソースタイプに関連する権限に影響します。

    Policy Simulator では、シミュレーション結果にこれらの権限が一覧表示されるため、シミュレーションができなかった権限がわかります。

gcloud

gcloud CLI のシミュレーション結果では、エラーは次の 2 つの場所で報告されることがあります。

  • replayResult.error フィールド。リプレイ試行が成功しなかった場合、Policy Simulator は replayResult.error フィールドにエラーをレポートします。リプレイ結果にこのフィールドが含まれている場合、diff フィールドは含まれません。
  • replayResult.diff.accessDiff.policy-type.errors フィールド(policy-typebaseline または simulated)。リプレイ試行は成功したが、結果が UNKNOWN_INFO_DENIED または UNKNOWN_CONDITIONAL であった場合、Policy Simulator はこのフィールドに結果が不明であった理由をレポートします。

Policy Simulator は、次の種類のエラーを生成します。

エラー エラーコード 詳細
GENERIC_INTERNAL_ERROR 13 内部エラーのためシミュレーションが失敗しました。この問題を解決するには、もう一度シミュレーションを実行します。それでもシミュレーションが失敗する場合は、policy-simulator-feedback@google.com までお問い合わせください。
INVALID_ACCESS_TUPLE 3 無効な権限、リソース名、またはプリンシパルが含まれているため、Policy Simulator はアクセス試行をリプレイできませんでした。
OUT_OF_RANGE_GROUP_TOO_LARGE 11 グループ内のサブグループが多すぎるため、Policy Simulator はグループ内のプリンシパルのメンバーを評価できませんでした。このエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 呼び出し元にグループ メンバーを表示する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_POLICY 7 呼び出し元に許可ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_ROLE 7 呼び出し元に IAM ロールの権限を取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 呼び出し元に祖先リソースの許可ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
UNIMPLEMENTED_MEMBER_TYPE 12 アクセスタプルに、Policy Simulator でサポートされていないプリンシパル タイプが含まれています。
UNIMPLEMENTED_MEMBER 12 アクセスタプルに、Policy Simulator でサポートされていないプリンシパルが含まれています。
UNIMPLEMENTED_CONDITION 12 アクセスタプルに、Policy Simulator でサポートされていない条件が含まれています。このタイプのエラーは、UNKNOWN_CONDITIONAL のアクセス権の変更に関連しています。
LOG_SIZE_TOO_LARGE 8 リソースに関連付けられているアクセスログが多すぎるため、Policy Simulator はシミュレーションを実行できませんでした。詳細については、Policy Simulator のコンセプト ページの最大ログリプレイ サイズをご覧ください。
UNSUPPORTED_RESOURCE 12

提案された許可ポリシーは、サポートされていないリソースタイプに関連付けられた権限を変更します。このエラーは replayResult.error フィールドに表示され、サポートされていないリソースタイプに関連付けられた権限のリストが含まれます。次に例を示します。

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

サポートされていないリソースタイプの詳細については、Policy Simulator のコンセプト ページのリソースタイプのサポートレベルをご覧ください。

REST

REST API のシミュレーション結果では、エラーは次の 2 つの場所に表示されます。

  • replayResult.error フィールド。リプレイ試行が成功しなかった場合、Policy Simulator は replayResult.error フィールドにエラーをレポートします。リプレイ結果にこのフィールドが含まれている場合、diff フィールドは含まれません。
  • replayResult.diff.accessDiff.policy-type.errors フィールド(policy-typebaseline または simulated)。リプレイ試行は成功したが、結果が UNKNOWN_INFO_DENIED または UNKNOWN_CONDITIONAL であった場合、Policy Simulator はこのフィールドに結果が不明であった理由をレポートします。

Policy Simulator は、次の種類のエラーを生成します。

エラー エラーコード 詳細
GENERIC_INTERNAL_ERROR 13 内部エラーのためシミュレーションが失敗しました。この問題を解決するには、もう一度シミュレーションを実行します。それでもシミュレーションが失敗する場合は、policy-simulator-feedback@google.com までお問い合わせください。
INVALID_ACCESS_TUPLE 3 無効な権限、リソース名、またはプリンシパルが含まれているため、Policy Simulator はアクセス試行をリプレイできませんでした。
OUT_OF_RANGE_GROUP_TOO_LARGE 11 グループ内のサブグループが多すぎるため、Policy Simulator はグループ内のプリンシパルのメンバーを評価できませんでした。このエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 呼び出し元にグループ メンバーを表示する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_POLICY 7 呼び出し元に許可ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_ROLE 7 呼び出し元に IAM ロールの権限を取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 呼び出し元に祖先リソースの許可ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
UNIMPLEMENTED_MEMBER_TYPE 12 アクセスタプルに、Policy Simulator でサポートされていないプリンシパル タイプが含まれています。
UNIMPLEMENTED_MEMBER 12 アクセスタプルに、Policy Simulator でサポートされていないプリンシパルが含まれています。
UNIMPLEMENTED_CONDITION 12 アクセスタプルに、Policy Simulator でサポートされていない条件が含まれています。このタイプのエラーは、UNKNOWN_CONDITIONAL のアクセス権の変更に関連しています。
LOG_SIZE_TOO_LARGE 8 リソースに関連付けられているアクセスログが多すぎるため、Policy Simulator はシミュレーションを実行できませんでした。詳細については、Policy Simulator のコンセプト ページの最大ログリプレイ サイズをご覧ください。
UNSUPPORTED_RESOURCE 12

提案された許可ポリシーは、サポートされていないリソースタイプに関連付けられた権限を変更します。このエラーは replayResult.error フィールドに表示され、サポートされていないリソースタイプに関連付けられた権限のリストが含まれます。次に例を示します。

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

サポートされていないリソースタイプの詳細については、Policy Simulator のコンセプト ページのリソースタイプのサポートレベルをご覧ください。

シミュレートされたポリシーの変更を適用する

シミュレートされた変更を許可ポリシーに適用するには、次の手順に沿って操作します。

Console

  1. [提案された変更の適用] をクリックします。

  2. 確認ダイアログで [適用] をクリックして、変更を確定します。

gcloud

set-iam-policy コマンドを使用して、適用するシミュレートされた許可ポリシーを含む JSON ファイルのパスを指定します。

gcloud resource-type set-iam-policy resource-id filepath

次の値を指定します。

  • resource-type: 許可ポリシーを更新するリソースタイプ。例: projects
  • resource-id: 許可ポリシーを更新するリソースの ID。例: my-project
  • filepath: 更新された許可ポリシーを含むファイルのパス。

レスポンスには、更新された許可ポリシーが含まれます。IAM 許可ポリシーをコードとして扱い、バージョン管理システムに保存する場合は、シミュレートされた許可ポリシーを含む JSON ファイルではなく、gcloud CLI から返される許可ポリシーを保存する必要があります。

REST

提案された許可ポリシーをリソースの新しい許可ポリシーとして設定します。

リクエストの許可ポリシーをプロジェクトの新しい許可ポリシーとして設定するには、Resource Manager API の projects.setIamPolicy メソッドを使用します。

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

  • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。
  • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

リクエストの本文(JSON):

{
  "policy": {
    POLICY
  }
}

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

レスポンスには、更新された許可ポリシーが含まれます。


シミュレーション結果を保存する

gcloud CLI を使用している場合は、Policy Simulator の結果を JSON、YAML、または CSV ファイルとして保存できます。

JSON または YAML として保存する

シミュレーションの結果を JSON または YAML ファイルとして保存するには、シミュレーションを実行するときに次のフラグを replay-recent-access コマンドに追加します。

--output=output-format > filename

次の値を置き換えます。

  • output-format: エクスポートされたファイル(json または yaml)の言語。
  • filename: エクスポートされたファイルの名前。

CSV として保存する

CSV ファイルを保存するには、シミュレーションを実行するときに次のフラグを replay-recent-access コマンドに追加します。

--flatten="diffs[]" --format=csv(output-fields) > filename

次の値を置き換えます。

  • output-fields: エクスポートされた結果に含めるフィールドのカンマ区切りのリスト。例: diffs.accessTuple.principal, diffs.accessTuple.permission
  • filename: エクスポートされたファイルの名前。

必要に応じて、errors[] などのフィールドを --flatten フラグに追加できます。--flatten フラグにフィールドを追加すると、フィールドの要素を CSV ファイルの別々の行に記載できます。

シミュレーション結果の最も重要なフィールドを CSV ファイル simulation-results.csv として保存する replay-recent-access コマンドの例を次に示します。

gcloud iam simulator replay-recent-access --flatten="diffs[]" \
    --format="csv(diffs.accessTuple.principal, diffs.accessTuple.permission, \
    diffs.accessTuple.fullResourceName, diffs.diff.accessDiff.accessChange, \
    diffs.diff.accessDiff.baseline.accessState, \
    diffs.diff.accessDiff.simulated.accessState)" \
    //cloudresourcemanager.googleapis.com/projects/my-project \
    proposed-policy.json > simulation-results.csv

この例では、プロジェクト my-projectproposed-policy.json をシミュレートし、結果を simulation-results.csv として保存します。この CSV ファイルには、プリンシパル、権限、リソース、アクセス権の変更、ベースライン アクセス状態、シミュレートされたアクセス状態の各フィールドが含まれます。

gcloud CLI での形式設定の詳細については、形式をご覧ください。

次のステップ