ポリシーの変更のシミュレーション

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

始める前に

権限の取得

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

IAM ロールの詳細については、ロールについてをご覧ください。

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

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

ターゲット リソースのシミュレータ管理者のロール(roles/policysimulator.admin)とセキュリティ レビュー担当者のロール(roles/iam.securityReviewer)、または次の権限を含む別のロールが必要です。

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

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

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

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

Console

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

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

gcloud

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

REST

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

ホストリソースのシミュレータ管理者のロール(roles/policysimulator.admin)か、次の権限を含む別のロールが必要です。

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

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

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

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

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

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

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

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

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

元のポリシーとポリシー案で各 Google グループのグループ メンバー情報を取得する権限を持つことをおすすめします。

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

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

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

Console

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

メンバーの権限を編集してから、[保存] ではなく [シミュレーション] をクリックします。

  1. Cloud Console で [IAM] ページに移動します。

    [IAM] ページに移動

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

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

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

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

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. リソースの IAM ポリシーを読み取ります。

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

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

    • 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 ペアを含めます。

    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)。

    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: 省略可。以前のレスポンスでこのメソッドから返されたページ設定トークン。指定すると、前のリクエストが終了した時点から結果のリストが開始します。

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

gcloud

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

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

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

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

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

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

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

REST

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

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

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

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

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

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

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

エラー

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

Console

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

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

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

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

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

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

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

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

gcloud

gcloud ツールのシミュレーション結果では、エラーは次の 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 呼び出し元に IAM ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_ROLE 7 呼び出し元に IAM ロールの権限を取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 呼び出し元に祖先リソースの IAM ポリシーを取得する権限がないため、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 呼び出し元に IAM ポリシーを取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_IAM_ROLE 7 呼び出し元に IAM ロールの権限を取得する権限がないため、Policy Simulator はユーザーのアクセス権を評価できませんでした。このタイプのエラーは、UNKNOWN_INFO_DENIED のアクセス権の変更に関連しています。
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 呼び出し元に祖先リソースの IAM ポリシーを取得する権限がないため、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 ツールから返されるポリシーを保存する必要があります。

REST

ポリシー案をリソースの新しいポリシーとして設定します。

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

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

  • 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 ツールを使用している場合は、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 ツールでの形式設定の詳細については、形式をご覧ください。

次のステップ