Menguji perubahan peran dengan Policy Simulator

Halaman ini menjelaskan cara menyimulasikan perubahan pada kebijakan izinkan menggunakan kebijakan izin Simulator Kebijakan untuk Pengelolaan Akses dan Identitas. Panduan ini juga menjelaskan cara menafsirkan hasil simulasi, dan cara menerapkan kebijakan izin yang disimulasikan jika Anda menginginkannya.

Sebelum memulai

Izin yang diperlukan

Sebelum menyimulasikan perubahan pada kebijakan izinkan, Anda harus memastikan bahwa Anda memiliki izin yang sesuai. Izin tertentu diperlukan untuk menjalankan simulasi; izin yang lain tidak diperlukan, tetapi membantu Anda mendapatkan hasil yang paling lengkap dari simulasi.

Untuk mempelajari peran Identity and Access Management (IAM) lebih lanjut, lihat Memahami peran.

Izin resource target yang diperlukan

Resource target simulasi adalah resource yang kebijakan izinnya Anda simulasi.

Untuk mendapatkan izin yang Anda perlukan guna menjalankan simulasi, minta administrator Anda untuk memberi Anda peran IAM berikut pada resource target:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.

Peran bawaan ini berisi izin yang diperlukan untuk menjalankan simulasi. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menjalankan simulasi:

  • cloudasset.assets.searchAllResources
  • policysimulator.replays.run
  • service.resource.getIamPolicy, dengan resource adalah jenis resource dari resource target dan service adalah nama layanan Google Cloud yang memiliki resource tersebut.

Anda mung juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaanlainnya.

Izin resource host yang diperlukan

Resource host simulasi adalah project, folder, atau organisasi yang membuat dan menjalankan simulasi. Dengan cara apa pun, resource host tidak perlu berkaitan dengan resource target.

Cara Anda menetapkan resource host bergantung pada platform yang Anda gunakan.

Konsol

Resource host adalah project, folder, atau organisasi yang muncul di pemilih resource.

Untuk mengubah resource host, pilih project, folder, atau organisasi lain di pemilih resource.

gcloud

Resource host adalah project kuota saat ini. Untuk menetapkan project kuota, gunakan perintah gcloud auth application-default set-quota-project.

REST

Anda menentukan resource host secara manual setiap kali mengirim permintaan. Lihat Menyimulasikan perubahan kebijakan di halaman ini untuk mengetahui detailnya.

Untuk mendapatkan izin yang Anda perlukan untuk menjalankan simulasi, minta administrator untuk memberi Anda peran IAM Simulator Admin (roles/policysimulator.admin) di resource host. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk menjalankan simulasi. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menjalankan simulasi:

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

Anda mung juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaanlainnya.

Untuk mendapatkan hasil yang paling lengkap dari simulasi, sebaiknya Anda memiliki izin IAM dan Google Workspace tertentu. Jika Anda tidak memiliki sebagian atau semua izin ini, Anda masih dapat menjalankan simulasi. Namun, menjalankan simulasi tanpa izin ini dapat mengakibatkan peningkatan jumlah perubahan akses yang tidak diketahui, karena Anda mungkin tidak dapat mengambil informasi yang dapat memengaruhi hasil simulasi.

Sebaiknya Anda memiliki peran Peninjau Keamanan (roles/iam.securityReviewer) untuk organisasi Anda saat menjalankan simulasi. Atau, jika sudah memiliki peran Security Admin (roles/iam.securityAdmin), Anda tidak perlu diberi peran tambahan.

Peran ini memberi Anda izin berikut, yang membantu Anda mendapatkan hasil paling lengkap dari simulasi:

  • iam.roles.get dan iam.roles.list di project, folder, atau organisasi yang relevan tempat peran khusus ditentukan. Project, folder, atau organisasi relevan jika merupakan ancestor atau turunan dari resource yang mengizinkan kebijakan yang Anda simulasikan.
  • service.resource.getIamPolicy, dengan resource adalah nama jenis resource yang dapat memiliki kebijakan izin dan service adalah nama layanan Google Cloud yang memiliki resource tersebut.

    Saat menjalankan simulasi, sebaiknya Anda memiliki izin ini pada setiap resource yang sesuai dengan kriteria berikut:

    • Policy Simulator mendukung resource.
    • Resource memiliki kebijakan izinkan yang mungkin memengaruhi akses pengguna. Hal ini berlaku jika salah satu hal berikut terjadi:

      • Resource ini adalah turunan dari resource yang kebijakan izinkannya Anda simulasikan, dan muncul dalam log akses yang relevan.
      • Resource ini adalah ancestor resource yang kebijakan izinkannya Anda simulasikan.

    Misalnya, Anda ingin menyimulasikan kebijakan izinkan untuk sebuah project. Jika log akses menyertakan upaya akses untuk bucket Cloud Storage dalam project, Anda memerlukan izin storage.buckets.getIamPolicy di bucket tersebut. Jika project memiliki folder induk dengan kebijakan izinkan, Anda juga memerlukan izin resourcemanager.folders.getIamPolicy di folder tersebut.

Sebaiknya Anda memiliki izin untuk mengambil informasi keanggotaan grup untuk setiap grup Google dalam kebijakan izin awal dan kebijakan izin yang diusulkan.

Admin Super dan Admin Grup Google Workspace biasanya memiliki akses untuk melihat keanggotaan grup. Jika Anda bukan Admin Super atau Admin Grup, minta administrator Google Workspace untuk membuat peran administrator Google Workspace khusus yang berisi hak istimewa groups.read (berada di bagian Hak Istimewa Admin API) dan memberikannya kepada Anda. Hal ini memungkinkan Anda melihat keanggotaan semua grup dalam domain Anda, dan menyimulasikan perubahan kebijakan izin secara lebih efektif.

Menyimulasikan perubahan kebijakan

Simulasikan perubahan pada kebijakan izinkan dengan mengikuti langkah-langkah berikut.

Konsol

Contoh berikut menunjukkan cara menyimulasikan perubahan pada kebijakan izinkan untuk suatu project. Namun, Anda dapat menyimulasikan perubahan pada kebijakan izinkan untuk resource apa pun yang memiliki kebijakan izinkan.

Edit izin akun utama, lalu klik Uji perubahan, bukan mengklik Save:

  1. Di konsol Google Cloud, buka halaman IAM.

    Buka halaman IAM

  2. Buat perubahan yang diusulkan pada kebijakan izinkan dengan mengedit izin akun utama yang ada:

    1. Temukan akun utama yang aksesnya ingin Anda edit, lalu klik tombol Edit di sebelah kanan.
    2. Edit akses akun utama dengan menambahkan peran baru, atau dengan mencabut atau mengubah peran yang ada.
  3. Untuk menyimulasikan perubahan yang diusulkan, klik Uji perubahan.

  4. Setelah beberapa menit, Google Cloud Console akan menampilkan hasil simulasi sebagai daftar perubahan akses. Lihat Memahami hasil Simulator Kebijakan di halaman ini untuk informasi selengkapnya.

    Jika tidak ada perubahan akses antara kebijakan izinkan yang sudah ada dan kebijakan izin simulasi, Google Cloud Console tidak akan menampilkan perubahan akses apa pun.

gcloud

Untuk menyimulasikan perubahan pada kebijakan izinkan, ikuti pola read-modify-write, tetapi simulasikan kebijakan izin, bukan menulisnya.

  1. Baca kebijakan izinkan saat ini dengan menjalankan perintah berikut:

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

    Ganti nilai berikut:

    • resource-type: Jenis resource yang ingin Anda simulasikan kebijakannya. Contoh, projects.
    • resource-id: ID resource yang kebijakan izinnya ingin Anda simulasikan. Contoh, my-project.
    • format: Format respons. Gunakan nilai json atau yaml.
    • filepath: Jalur ke file output baru untuk kebijakan izinkan.

    Misalnya, perintah berikut mendapatkan kebijakan izinkan untuk project my-project dalam format JSON dan menyimpannya ke direktori utama pengguna:

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json
    
  2. Ubah kebijakan izinkan JSON atau YAML yang ditampilkan oleh perintah get-iam-policy untuk mencerminkan perubahan yang ingin Anda simulasikan.

    Ada beberapa jenis perubahan yang dapat Anda buat pada kebijakan izinkan. Misalnya, Anda dapat menambahkan atau menghapus akun utama dari binding peran, atau menghapus binding peran dari kebijakan izinkan.

  3. Jalankan perintah berikut untuk menyimulasikan perubahan pada kebijakan izinkan:

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

    Ganti nilai berikut:

    • full-resource-name: Nama lengkap resource resource yang kebijakan izinkannya ingin Anda simulasikan.

      Nama lengkap resource adalah URI yang terdiri dari nama layanan dan jalur ke resource. Misalnya, jika Anda menyimulasikan kebijakan izinkan untuk sebuah project, Anda akan menggunakan //cloudresourcemanager.googleapis.com/projects/project- id, dengan project-id adalah ID project yang kebijakan izinnya Anda simulasikan.

      Untuk daftar format nama resource lengkap, lihat Nama resource lengkap.

    • filepath: Jalur ke file yang berisi kebijakan izin yang telah diubah yang ingin Anda simulasikan. Misalnya, ~/proposed_policy.json.

    • format: Format respons. Misalnya, json atau yaml.

    Setelah beberapa menit, perintah tersebut mencetak daftar hasil replay yang menjelaskan perubahan akses akun utama jika kebijakan izinkan yang diusulkan diterapkan. Hasil ini juga mencantumkan error apa pun yang terjadi selama simulasi, termasuk error apa pun karena jenis resource yang tidak didukung.

    Lihat Memahami hasil Simulator Kebijakan di halaman ini untuk mempelajari cara membaca hasilnya. Untuk mempelajari cara menyimpan hasil simulasi, bukan mencetaknya, lihat Menyimpan hasil simulasi.

    Berikut adalah contoh respons untuk simulasi kebijakan izinkan yang melibatkan pengguna my-user@example.com. Dalam hal ini, jika perubahan yang diusulkan diterapkan, my-user@example.com kemungkinan tidak akan lagi memiliki izin resourcemanager.projects.list dan resourcemanager.projects.get untuk project my-project, dan tentu saja tidak lagi memiliki izin resourcemanager.projects.update untuk project my-project:

    [
      {
        "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."
        }
      }
    ]
    

    Jika tidak ada perubahan akses antara kebijakan izinkan yang sudah ada dan kebijakan izin simulasi, perintah akan mencetak No access changes found in the replay.

REST

Untuk menyimulasikan perubahan pada kebijakan izinkan, ikuti pola read-modify-write. Namun, buat dan jalankan simulasi, bukan menulis kebijakan izinkan.

  1. Baca kebijakan izin untuk resource.

    Untuk mendapatkan kebijakan izin project, gunakan metode projects.getIamPolicy Resource Manager API.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: Project ID Google Cloud Anda Project ID adalah string alfanumerik, seperti my-project.
    • POLICY_VERSION: Versi kebijakan yang akan ditampilkan Permintaan harus menentukan versi kebijakan terbaru, yaitu kebijakan versi 3. Lihat Menentukan versi kebijakan saat mendapatkan kebijakan untuk detailnya.

    Metode HTTP dan URL:

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

    Meminta isi JSON:

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

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

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

  2. Ubah kebijakan izin yang ditampilkan untuk mencerminkan perubahan yang ingin Anda simulasikan.

    Ada beberapa jenis perubahan yang dapat Anda buat pada kebijakan izinkan. Misalnya, Anda dapat menambahkan atau menghapus akun utama dari binding peran, atau menghapus binding peran dari kebijakan izinkan.

  3. Buat simulasi, atau Replay, dengan kebijakan izin yang telah diubah.

    Untuk membuat Replay untuk project, folder, atau organisasi, gunakan metode replays.create Policy Simulator API.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • HOST_RESOURCE_TYPE: Jenis resource yang akan menghosting Replay. Nilai ini harus projects, folders, atau organizations.
    • HOST_RESOURCE_ID: ID resource host, misalnya, my-project.
    • TARGET_FULL_RESOURCE_NAME: Nama lengkap resource resource yang kebijakannya ingin Anda simulasikan. Resource ini dapat berupa resource apa pun yang menerima kebijakan IAM, dan tidak perlu terkait dengan resource host dengan cara apa pun.

      Nama lengkap resource adalah URI yang terdiri dari nama layanan dan jalur ke resource. Misalnya, jika Anda menyimulasikan kebijakan untuk suatu project, sebaiknya gunakan //cloudresourcemanager.googleapis.com/projects/PROJECT_ID, dengan PROJECT_ID sebagai ID project yang kebijakannya Anda simulasikan.

      Untuk daftar lengkap format nama resource, lihat Nama resource lengkap.

    • POLICY: Kebijakan yang ingin Anda simulasikan. Untuk contoh kebijakan, lihat referensi kebijakan.

      Untuk menyimulasikan beberapa kebijakan, sertakan beberapa pasangan "OBJECT_FULL_RESOURCE_NAME" : POLICY dalam isi permintaan.

    • PROJECT_ID: Project ID Google Cloud Anda Project ID adalah string alfanumerik, seperti my-project.

    Metode HTTP dan URL:

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

    Meminta isi JSON:

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

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Respons berisi nama operasi yang merepresentasikan Replay:

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

  4. Polling metode operations.get sampai Replay selesai.

    Untuk polling operasi, sebaiknya Anda berulang kali memanggil metode operations.get hingga respons menyertakan kolom "done": true dan kolom name dengan nama Replay yang sudah selesai. Gunakan backoff eksponensial terpotong untuk memasukkan penundaan di antara setiap permintaan.

    Untuk mendapatkan status Replay, gunakan metode operations.get Policy Simulator API.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • OPERATION_NAME: Nama operasi Replay, termasuk awalan operations. Salin nilai ini dari kolom name dalam respons replays.create. Contoh: operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8
    • PROJECT_ID: Project ID Google Cloud Anda Project ID adalah string alfanumerik, seperti my-project.

    Metode HTTP dan URL:

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

    Untuk mengirim permintaan, perluas salah satu opsi berikut:

    Operasi yang sedang berlangsung akan menampilkan respons seperti berikut:

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

    Operasi yang telah selesai akan menampilkan respons seperti berikut:

    {
      "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. Dapatkan hasil Replay.

    Untuk mendapatkan hasil Replay, gunakan metode replays.results.list Policy Simulator API.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • REPLAY_NAME: Nama Replay yang hasilnya ingin Anda ambil. Salin nilai ini dari kolom response.replay.name dalam respons operations.get. Sertakan jenis resource dan awalan lokasi. Misalnya, "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b"
    • PAGE_SIZE: Opsional. Jumlah hasil maksimum yang akan ditampilkan dari permintaan ini. Jika tidak ditentukan, server akan menentukan jumlah hasil yang akan ditampilkan. Jika jumlah hasil lebih besar dari ukuran halaman, respons akan berisi token penomoran halaman yang dapat Anda gunakan untuk mengambil halaman hasil berikutnya.
    • PAGE_TOKEN: Opsional. Token penomoran halaman yang ditampilkan dalam respons sebelumnya dari metode ini. Jika ditentukan, daftar hasil akan dimulai dari akhir permintaan sebelumnya.
    • PROJECT_ID: Project ID Google Cloud Anda Project ID adalah string alfanumerik, seperti my-project.

    Metode HTTP dan URL:

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

    Untuk mengirim permintaan, perluas salah satu opsi berikut:

    Respons ini berisi daftar hasil yang menjelaskan perubahan pada akses akun utama jika kebijakan yang diusulkan diterapkan. Hasil ini juga mencantumkan semua error yang terjadi selama simulasi, terutama error apa pun karena jenis resource yang tidak didukung

    Lihat Memahami hasil Simulator Kebijakan di halaman ini untuk mempelajari cara membaca hasilnya.

    Berikut adalah contoh respons untuk simulasi kebijakan yang melibatkan pengguna my-user@example.com. Dalam hal ini, jika perubahan yang diusulkan diterapkan, my-user@example.com kemungkinan tidak akan lagi memiliki izin resourcemanager.projects.list dan resourcemanager.projects.get untuk project my-project, dan pasti tidak lagi memiliki izin resourcemanager.projects.update untuk project my-project:

    {
      "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"
    }
    

    Jika tidak ada perubahan akses antara kebijakan izin yang sudah ada dan kebijakan izin simulasi, permintaan akan menampilkan daftar kosong ({}).

Memahami hasil Policy Simulator

Policy Simulator melaporkan dampak perubahan yang diusulkan pada kebijakan izin sebagai daftar perubahan akses. Setiap perubahan akses mewakili upaya akses dari 90 hari terakhir yang akan memiliki hasil berbeda berdasarkan kebijakan izin yang diusulkan dibandingkan dengan kebijakan izin saat ini.

Policy Simulator juga mencantumkan semua error yang terjadi selama simulasi, yang membantu Anda mengidentifikasi potensi celah dalam simulasi.

Tampilan perubahan dan error ini bergantung pada platform yang Anda gunakan.

Konsol

Halaman hasil Policy Simulator menampilkan hasil simulasi di beberapa bagian yang berbeda:

  • Perubahan kebijakan: Bagian ini mencantumkan resource yang kebijakan izinnya Anda sarankan untuk diubah, peran yang Anda usulkan untuk dihapus, dan peran yang Anda sarankan untuk ditambahkan.

    Bagian ini juga berisi tombol Lihat perbedaan kebijakan. Jika mengklik tombol ini, Anda dapat melihat tampilan kebijakan izin resource sebelum dan setelah perubahan yang diusulkan.

  • Perubahan izin: Bagian ini berisi jumlah izin yang dihapus dan ditambahkan, yang menjelaskan perubahan izin akun utama jika Anda menerapkan perubahan yang diusulkan. Jumlah izin ini dihitung dengan membandingkan izin dalam peran akun utama saat ini dengan izin dalam peran yang diusulkan akun utama, mengabaikan peran yang diwarisi.

    Bagian ini juga berisi tombol Lihat perbedaan izin. Dengan mengklik tombol ini, Anda dapat melihat perbandingan izin secara berdampingan dalam peran akun utama saat ini dan yang diusulkan.

  • Perubahan akses selama 90 hari terakhir: Bagian ini menunjukkan upaya akses mana dari 90 hari terakhir yang memiliki hasil berbeda berdasarkan kebijakan izin yang diusulkan dan kebijakan izin saat ini. Bagian ini mencakup ringkasan perubahan akses, dan tabel yang berisi hasil yang lebih mendetail.

    Ringkasan perubahan akses mencantumkan jumlah setiap jenis perubahan akses, jumlah error dan hasil yang tidak diketahui, serta jumlah upaya akses yang memiliki hasil yang sama berdasarkan kebijakan izin yang diusulkan dan kebijakan izin saat ini. Ringkasan ini juga menunjukkan jumlah izin yang tidak dapat disimulasikan. Untuk informasi selengkapnya, lihat Error di halaman ini.

    Bagian ini juga berisi tabel perubahan akses. Tabel ini mencantumkan setiap upaya akses dari 90 hari terakhir yang memiliki hasil berbeda berdasarkan kebijakan izin yang diusulkan dan berdasarkan kebijakan izin saat ini. Setiap entri menyertakan resource yang coba diakses oleh akun utama, tanggal permintaan, akun utama yang membuat permintaan, izin dalam permintaan, dan status akses berdasarkan kebijakan izin yang diusulkan, dibandingkan dengan status akses berdasarkan kebijakan izin saat ini.

    Ada beberapa jenis perubahan akses:

    Perubahan akses Detail
    Akses dicabut Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi tidak akan lagi memiliki akses setelah perubahan yang diusulkan.
    Akses berpotensi dicabut

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi aksesnya berdasarkan kebijakan izin yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun utama tersebut tidak akan memiliki akses setelah perubahan yang diusulkan.
    Akses diperoleh Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi akan memiliki akses setelah perubahan yang diusulkan.
    Akses yang berpotensi diperoleh

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi aksesnya setelah perubahan yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun tersebut akan memiliki akses setelah perubahan yang diusulkan.
    Akses tidak diketahui Akses akun utama berdasarkan kebijakan izin saat ini dan kebijakan izin yang diusulkan tidak diketahui, dan perubahan yang diusulkan dapat memengaruhi akses akun utama.
    Error Terjadi error saat simulasi berlangsung.

    Untuk melihat detail tambahan tentang perubahan akses, klik perubahan akses. Tindakan ini akan membuka panel Detail perubahan akses yang menampilkan informasi tambahan tentang perubahan akses, termasuk akses yang ada milik akun utama, akses yang diusulkan akun utama, dan detail tambahan tentang hasil perubahan akses.

gcloud

Saat Anda menggunakan perintah replay-recent-access, respons gcloud CLI akan berisi daftar replayResults.

Setiap hasil replay menjelaskan upaya akses yang hasilnya akan berbeda jika kebijakan izinkan yang diusulkan telah diterapkan pada saat upaya tersebut. Misalnya, hasil replay berikut menunjukkan bahwa my-user@example.com menggunakan izin resourcemanager.projects.update sebelumnya untuk melakukan tindakan dalam project my-project. Namun, jika kebijakan izin yang diusulkan diterapkan, akses mereka akan ditolak.

{
  "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"
    }
  }
}

Setiap hasil replay memiliki kolom berikut:

  • accessTuple: Upaya akses yang terkait dengan hasil tersebut. Kolom ini mencakup resource, izin, dan akun utama yang terlibat dalam upaya akses.

  • lastSeenDate: Tanggal terakhir kali upaya akses dilakukan.

  • diff.accessDiff atau error: Jika replay upaya akses berhasil, hasilnya berisi kolom diff.accessDiff yang melaporkan perbedaan antara hasil upaya akses berdasarkan kebijakan izin saat ini dan berdasarkan kebijakan izin yang diusulkan. Jika upaya replay tidak berhasil, hasil replay akan berisi kolom error dengan deskripsi error. Untuk mempelajari error simulasi lebih lanjut, lihat Error di halaman ini.

Setiap perbedaan akses memiliki komponen berikut:

  • baseline: Hasil akses saat menggunakan kebijakan izinkan saat ini. Nilai ini dilaporkan sebagai salah satu nilai berikut: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL, atau UNKNOWN_INFO_DENIED. Jika hasilnya adalah UNKNOWN_CONDITIONAL atau UNKNOWN_INFO_DENIED, respons juga akan mencantumkan error yang terkait dengan informasi yang tidak diketahui, serta kebijakan izinkan yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang nilai UNKNOWN, lihat Hasil tidak diketahui di halaman ini.
  • simulated: Hasil akses saat menggunakan kebijakan izinkan yang diusulkan. Dilaporkan sebagai salah satu nilai berikut: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL, atau UNKNOWN_INFO_DENIED. Jika hasilnya adalah UNKNOWN_CONDITIONAL atau UNKNOWN_INFO_DENIED, respons juga akan mencantumkan error yang terkait dengan informasi yang tidak diketahui, serta kebijakan izinkan yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang nilai UNKNOWN, lihat Hasil tidak diketahui di halaman ini.
  • accessChange: Perubahan antara status akses dasar pengukuran dan status akses simulasi. Lihat tabel berikut untuk daftar nilai potensial:

    Perubahan akses Detail
    ACCESS_REVOKED Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi tidak akan lagi memiliki akses setelah perubahan yang diusulkan.
    ACCESS_MAYBE_REVOKED

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi aksesnya berdasarkan kebijakan izin yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun utama tersebut tidak akan memiliki akses setelah perubahan yang diusulkan.
    ACCESS_GAINED Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi akan memiliki akses setelah perubahan yang diusulkan.
    ACCESS_MAYBE_GAINED

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi aksesnya setelah perubahan yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun tersebut akan memiliki akses setelah perubahan yang diusulkan.
    UNKNOWN_CHANGE Akses akun utama berdasarkan kebijakan izin saat ini dan kebijakan izin yang diusulkan tidak diketahui, dan perubahan yang diusulkan dapat memengaruhi akses akun utama.

REST

Saat Anda memanggil metode replays.results.list, respons akan berisi daftar replayResults.

Setiap hasil replay menjelaskan upaya akses yang hasilnya akan berbeda jika kebijakan izinkan yang diusulkan telah diterapkan pada saat upaya tersebut. Misalnya, hasil replay berikut menunjukkan bahwa my-user@example.com menggunakan izin resourcemanager.projects.update sebelumnya untuk melakukan tindakan dalam project my-project. Namun, jika kebijakan izin yang diusulkan diterapkan, akses mereka akan ditolak.

{
  "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"
    }
  }
}

Setiap hasil replay memiliki kolom berikut:

  • accessTuple: Upaya akses yang terkait dengan hasil tersebut. Kolom ini mencakup resource, izin, dan akun utama yang terlibat dalam upaya akses.

  • lastSeenDate: Tanggal terakhir kali upaya akses dilakukan.

  • diff.accessDiff atau error: Jika replay upaya akses berhasil, hasilnya berisi kolom diff.accessDiff yang melaporkan perbedaan antara hasil upaya akses berdasarkan kebijakan izin saat ini dan berdasarkan kebijakan izin yang diusulkan. Jika upaya replay tidak berhasil, hasil replay akan berisi kolom error dengan deskripsi error. Untuk mempelajari error simulasi lebih lanjut, lihat Error di halaman ini.

Setiap perbedaan akses memiliki komponen berikut:

  • baseline: Hasil akses saat menggunakan kebijakan izinkan saat ini. Nilai ini dilaporkan sebagai salah satu nilai berikut: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL, atau UNKNOWN_INFO_DENIED. Jika hasilnya adalah UNKNOWN_CONDITIONAL atau UNKNOWN_INFO_DENIED, respons juga akan mencantumkan error yang terkait dengan informasi yang tidak diketahui, serta kebijakan izinkan yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang nilai UNKNOWN, lihat Hasil tidak diketahui di halaman ini.
  • simulated: Hasil akses saat menggunakan kebijakan izinkan yang diusulkan. Dilaporkan sebagai salah satu nilai berikut: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL, atau UNKNOWN_INFO_DENIED. Jika hasilnya adalah UNKNOWN_CONDITIONAL atau UNKNOWN_INFO_DENIED, respons juga akan mencantumkan error yang terkait dengan informasi yang tidak diketahui, serta kebijakan izinkan yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang nilai UNKNOWN, lihat Hasil tidak diketahui di halaman ini.
  • accessChange: Perubahan antara status akses dasar pengukuran dan status akses simulasi. Lihat tabel berikut untuk daftar nilai potensial:

    Perubahan akses Detail
    ACCESS_REVOKED Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi tidak akan lagi memiliki akses setelah perubahan yang diusulkan.
    ACCESS_MAYBE_REVOKED

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama memiliki akses berdasarkan kebijakan izin saat ini, tetapi aksesnya berdasarkan kebijakan izin yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun utama tersebut tidak akan memiliki akses setelah perubahan yang diusulkan.
    ACCESS_GAINED Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi akan memiliki akses setelah perubahan yang diusulkan.
    ACCESS_MAYBE_GAINED

    Hasil ini dapat terjadi karena alasan berikut:

    • Akun utama tidak memiliki akses berdasarkan kebijakan izinkan saat ini, tetapi aksesnya setelah perubahan yang diusulkan tidak diketahui.
    • Akses akun utama berdasarkan kebijakan izin saat ini tidak diketahui, tetapi akun tersebut akan memiliki akses setelah perubahan yang diusulkan.
    UNKNOWN_CHANGE Akses akun utama berdasarkan kebijakan izin saat ini dan kebijakan izin yang diusulkan tidak diketahui, dan perubahan yang diusulkan dapat memengaruhi akses akun utama.

Hasil tidak diketahui

Jika hasil akses tidak diketahui, artinya Simulator Kebijakan tidak memiliki cukup informasi untuk mengevaluasi upaya akses sepenuhnya.

Konsol

Jika hasil akses tidak diketahui, panel detail perubahan akses akan melaporkan alasan tidak diketahuinya, serta peran tertentu, kebijakan izinkan, keanggotaan grup, dan kondisi yang tidak dapat diakses atau dievaluasi.

Ada beberapa alasan mengapa hasilnya bisa tidak diketahui:

  • Info peran ditolak: Akun utama yang menjalankan simulasi tidak memiliki izin untuk melihat detail peran satu atau beberapa peran yang disimulasikan.
  • Tidak dapat mengakses kebijakan: Akun utama yang menjalankan simulasi tidak memiliki izin untuk mendapatkan kebijakan izinkan untuk satu atau beberapa resource yang terlibat dalam simulasi.
  • Info keanggotaan ditolak: Akun utama yang menjalankan simulasi tidak memiliki izin untuk melihat anggota satu atau beberapa grup yang disertakan dalam kebijakan izin yang diusulkan.
  • Kondisi tidak didukung: Ada binding peran bersyarat dalam kebijakan izin yang sedang diuji. Policy Simulator tidak mendukung kondisi, sehingga binding tidak dapat dievaluasi.

gcloud

Di gcloud CLI, hasil simulasi akan melaporkan alasan mengapa hasilnya tidak diketahui dalam perbedaan akses.

Alasan hasil akses tidak diketahui adalah salah satu alasan berikut:

  • UNKNOWN_INFO_DENIED: Pengguna tidak memiliki izin untuk mengakses informasi yang diperlukan untuk mengevaluasi status akses. Hal ini dapat terjadi karena salah satu alasan berikut:

    • Pengguna tidak memiliki izin untuk mengambil kebijakan izinkan yang sedang disimulasikan, atau mereka tidak memiliki izin untuk mengambil kebijakan izinkan untuk resource dalam log akses.
    • Pengguna tidak memiliki izin untuk melihat keanggotaan grup.
    • Pengguna tidak dapat mengambil informasi peran yang diperlukan.

    Untuk mengetahui informasi yang tidak ada, lihat informasi error mengikuti status akses yang dilaporkan.

  • UNKNOWN_CONDITIONAL: Ada binding peran bersyarat dalam kebijakan izinkan yang sedang diuji. Policy Simulator tidak mendukung kondisi, sehingga binding tidak dapat dievaluasi.

Jika hasilnya tidak diketahui, kolom untuk kebijakan izin (baseline atau simulated) berisi kolom errors yang menjelaskan alasan informasi tersebut tidak diketahui, dan kolom policies yang mencantumkan kebijakan izin yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang error, lihat Error di halaman ini.

REST

Di REST API, hasil simulasi akan melaporkan alasan mengapa hasilnya tidak diketahui dalam perbedaan akses.

Alasan hasil akses tidak diketahui adalah salah satu alasan berikut:

  • UNKNOWN_INFO_DENIED: Pengguna tidak memiliki izin untuk mengakses informasi yang diperlukan untuk mengevaluasi status akses. Hal ini dapat terjadi karena salah satu alasan berikut:

    • Pengguna tidak memiliki izin untuk mengambil kebijakan izinkan yang sedang disimulasikan, atau mereka tidak memiliki izin untuk mengambil kebijakan izinkan untuk resource dalam log akses.
    • Pengguna tidak memiliki izin untuk melihat keanggotaan grup.
    • Pengguna tidak dapat mengambil informasi peran yang diperlukan.

    Untuk mengetahui informasi yang tidak ada, lihat informasi error mengikuti status akses yang dilaporkan.

  • UNKNOWN_CONDITIONAL: Ada binding peran bersyarat dalam kebijakan izinkan yang sedang diuji. Policy Simulator tidak mendukung kondisi, sehingga binding tidak dapat dievaluasi.

Jika hasilnya tidak diketahui, kolom untuk kebijakan izin (baseline atau simulated) berisi kolom errors yang menjelaskan alasan informasi tersebut tidak diketahui, dan kolom policies yang mencantumkan kebijakan izin yang terkait dengan error tersebut. Untuk informasi selengkapnya tentang error, lihat Error di halaman ini.

Error

Policy Simulator juga melaporkan error yang terjadi selama simulasi. Anda perlu meninjau error ini agar dapat memahami potensi celah dalam simulasi.

Konsol

Ada beberapa jenis error yang mungkin dilaporkan Simulator Kebijakan:

  • Error operasi: Simulasi tidak dapat dijalankan. Policy Simulator melaporkan error operasi di bagian atas halaman hasil.

    Jika pesan error menyatakan bahwa simulasi tidak dapat dijalankan karena ada terlalu banyak log dalam project atau organisasi Anda, maka Anda tidak dapat menjalankan simulasi pada resource.

    Jika Anda mendapatkan error ini karena alasan lain, coba jalankan simulasi lagi. Jika Anda tetap tidak dapat menjalankan simulasi, hubungi policy-simulator-feedback@google.com.

  • Error pengulangan: Pengulangan upaya akses tunggal tidak berhasil, sehingga Simulator Kebijakan tidak dapat menentukan apakah hasil upaya akses akan berubah berdasarkan kebijakan izin yang diusulkan.

    Konsol Google Cloud mencantumkan error replay di tabel Perubahan akses selama 90 hari terakhir. Panel Detail perubahan akses untuk setiap error menyertakan pesan error untuk membantu Anda memahami masalah, serta resource dan izin yang disimulasikan saat error terjadi.

  • Error jenis resource yang tidak didukung: Kebijakan izinkan yang diusulkan memengaruhi izin yang terkait dengan jenis resource yang tidak didukung, yang tidak dapat disimulasikan oleh Policy Simulator.

    Policy Simulator mencantumkan izin ini dalam hasil simulasi sehingga Anda mengetahui izin mana yang tidak dapat disimulasikan.

gcloud

Dalam hasil simulasi gcloud CLI, error dapat muncul di dua tempat:

  • Kolom replayResult.error: Jika upaya replay tidak berhasil, Simulator Kebijakan akan melaporkan error di kolom replayResult.error. Jika hasil replay berisi kolom ini, hasil tersebut tidak akan berisi kolom diff.
  • Kolom replayResult.diff.accessDiff.policy-type.errors, dengan policy-type adalah baseline atau simulated. Jika upaya replay berhasil, tetapi hasilnya adalah UNKNOWN_INFO_DENIED atau UNKNOWN_CONDITIONAL, Simulator Kebijakan akan melaporkan alasan bahwa hasil tidak diketahui di kolom ini.

Policy Simulator menghasilkan jenis error berikut:

Error Kode error Detail
GENERIC_INTERNAL_ERROR 13 Simulasi gagal karena terjadi error internal. Untuk mengatasinya, coba jalankan kembali simulasi. Jika simulasi masih gagal, hubungi policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 Policy Simulator tidak dapat memutar ulang upaya akses karena berisi izin, nama resource, atau akun utama yang tidak valid.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 Policy Simulator tidak dapat mengevaluasi keanggotaan akun utama dalam grup karena grup ini memiliki terlalu banyak subgrup. Error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk melihat keanggotaan grup. Error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil kebijakan yang diizinkan. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil izin dalam peran IAM. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil kebijakan yang diizinkan resource ancestor. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 Tuple akses berisi jenis utama yang tidak didukung Simulator Kebijakan.
UNIMPLEMENTED_MEMBER 12 Tuple akses berisi entity utama yang tidak didukung Simulator Kebijakan.
UNIMPLEMENTED_CONDITION 12 Tuple akses berisi kondisi yang tidak didukung oleh Simulator Kebijakan. Jenis error ini terkait dengan perubahan akses UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 Resource ini dikaitkan dengan terlalu banyak log akses, sehingga Policy Simulator tidak dapat menjalankan simulasi. Lihat Ukuran replay log maksimum di halaman konsep Simulator Kebijakan untuk mengetahui detailnya.
UNSUPPORTED_RESOURCE 12

Usulan kebijakan izinkan mengubah izin yang terkait dengan jenis resource yang tidak didukung. Error ini muncul di kolom replayResult.error dan berisi daftar izin yang terkait dengan jenis resource yang tidak didukung. Contoh:


"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"
}

Untuk mengetahui informasi selengkapnya tentang jenis resource yang tidak didukung, lihat Tingkat dukungan untuk jenis resource di halaman konsep Policy Simulator.

REST

Dalam hasil simulasi REST API, error dapat muncul di dua tempat:

  • Kolom replayResult.error: Jika upaya replay tidak berhasil, Simulator Kebijakan akan melaporkan error di kolom replayResult.error. Jika hasil replay berisi kolom ini, hasil tersebut tidak akan berisi kolom diff.
  • Kolom replayResult.diff.accessDiff.policy-type.errors, dengan policy-type adalah baseline atau simulated. Jika upaya replay berhasil, tetapi hasilnya adalah UNKNOWN_INFO_DENIED atau UNKNOWN_CONDITIONAL, Simulator Kebijakan akan melaporkan alasan bahwa hasil tidak diketahui di kolom ini.

Policy Simulator menghasilkan jenis error berikut:

Error Kode error Detail
GENERIC_INTERNAL_ERROR 13 Simulasi gagal karena terjadi error internal. Untuk mengatasinya, coba jalankan kembali simulasi. Jika simulasi masih gagal, hubungi policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 Policy Simulator tidak dapat memutar ulang upaya akses karena berisi izin, nama resource, atau akun utama yang tidak valid.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 Policy Simulator tidak dapat mengevaluasi keanggotaan akun utama dalam grup karena grup ini memiliki terlalu banyak subgrup. Error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk melihat keanggotaan grup. Error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil kebijakan yang diizinkan. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil izin dalam peran IAM. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 Policy Simulator tidak dapat mengevaluasi akses pengguna karena pemanggil tidak memiliki izin untuk mengambil kebijakan yang diizinkan resource ancestor. Jenis error ini terkait dengan perubahan akses UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 Tuple akses berisi jenis utama yang tidak didukung Simulator Kebijakan.
UNIMPLEMENTED_MEMBER 12 Tuple akses berisi entity utama yang tidak didukung Simulator Kebijakan.
UNIMPLEMENTED_CONDITION 12 Tuple akses berisi kondisi yang tidak didukung oleh Simulator Kebijakan. Jenis error ini terkait dengan perubahan akses UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 Resource ini dikaitkan dengan terlalu banyak log akses, sehingga Policy Simulator tidak dapat menjalankan simulasi. Lihat Ukuran replay log maksimum di halaman konsep Simulator Kebijakan untuk mengetahui detailnya.
UNSUPPORTED_RESOURCE 12

Usulan kebijakan izinkan mengubah izin yang terkait dengan jenis resource yang tidak didukung. Error ini muncul di kolom replayResult.error dan berisi daftar izin yang terkait dengan jenis resource yang tidak didukung. Contoh:


"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"
}

Untuk mengetahui informasi selengkapnya tentang jenis resource yang tidak didukung, lihat Tingkat dukungan untuk jenis resource di halaman konsep Policy Simulator.

Menerapkan simulasi perubahan kebijakan

Untuk menerapkan simulasi perubahan pada kebijakan izinkan, ikuti langkah-langkah berikut:

Konsol

  1. Klik Terapkan perubahan yang diusulkan.

  2. Pada dialog konfirmasi, klik Apply untuk mengonfirmasi perubahan.

gcloud

Gunakan perintah set-iam-policy, dan berikan jalur ke file JSON yang berisi kebijakan izin yang disimulasikan yang ingin Anda terapkan:

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

Berikan nilai berikut:

  • resource-type: Jenis resource yang kebijakan izinkannya ingin Anda update. Contoh, projects.
  • resource-id: ID resource yang kebijakan izinnya ingin Anda perbarui. Contoh, my-project.
  • filepath: Jalur ke file yang berisi kebijakan izin yang diperbarui.

Respons berisi kebijakan izin yang telah diperbarui. Jika Anda memperlakukan kebijakan izin IAM sebagai kode dan menyimpannya dalam sistem kontrol versi, Anda harus menyimpan kebijakan izinkan yang ditampilkan gcloud CLI, bukan file JSON yang berisi kebijakan izin yang disimulasikan.

REST

Tetapkan kebijakan izinkan yang diusulkan sebagai kebijakan izin baru untuk resource.

Untuk menetapkan kebijakan izinkan dalam permintaan sebagai kebijakan izin baru pada project, gunakan metode projects.setIamPolicy Resource Manager API.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: Project ID Google Cloud Anda Project ID adalah string alfanumerik, seperti my-project.
  • POLICY: Representasi JSON dari kebijakan yang ingin Anda tetapkan. Untuk informasi selengkapnya tentang format kebijakan, lihat referensi Kebijakan.

Metode HTTP dan URL:

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

Meminta isi JSON:

{
  "policy": {
    POLICY
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Respons berisi kebijakan izin yang telah diperbarui.


Simpan hasil simulasi

Jika menggunakan gcloud CLI, Anda dapat menyimpan hasil Simulator Kebijakan sebagai file JSON, YAML, atau CSV.

Simpan sebagai JSON atau YAML

Untuk menyimpan hasil simulasi sebagai file JSON atau YAML, tambahkan flag berikut ke perintah replay-recent-access saat menjalankan simulasi:

--output=output-format > filename

Ganti nilai berikut:

  • output-format: Bahasa file yang diekspor, json atau yaml.
  • filename: Nama untuk file yang diekspor.

Simpan sebagai CSV

Untuk menyimpan file CSV, tambahkan tanda berikut ke perintah replay-recent-access saat menjalankan simulasi:

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

Ganti nilai berikut:

  • output-fields: Daftar yang dipisahkan koma untuk kolom yang ingin disertakan dalam hasil yang diekspor. Misalnya, diffs.accessTuple.principal, diffs.accessTuple.permission.
  • filename: Nama untuk file yang diekspor.

Secara opsional, Anda dapat menambahkan kolom lain, seperti errors[] ke tanda --flatten. Dengan menambahkan kolom ke tanda --flatten, elemen dalam kolom tersebut dapat dicantumkan pada baris terpisah dalam file CSV.

Berikut adalah contoh perintah replay-recent-access yang menyimpan kolom terpenting dari hasil simulasi sebagai file CSV simulation-results.csv:

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

Contoh ini menyimulasikan proposed-policy.json untuk project my-project dan menyimpan hasilnya sebagai simulation-results.csv. File CSV ini berisi kolom berikut: akun utama, izin, resource, perubahan akses, status akses dasar pengukuran, dan simulasi status akses.

Untuk mengetahui informasi lebih lanjut tentang cara memformat dengan gcloud CLI, baca format.

Langkah selanjutnya