Memecahkan masalah izin IAM

Pemecah Masalah Kebijakan untuk IAM membantu Anda memahami mengapa pengguna memiliki akses ke resource atau tidak memiliki izin untuk memanggil API. Dengan mempertimbangkan alamat email, resource, dan izin, Pemecah Masalah Kebijakan memeriksa semua kebijakan izinkan dan tolak yang berlaku untuk resource. Kemudian, class menggunakan kebijakan tersebut untuk memberi tahu Anda apakah akun utama memiliki izin atau tidak. Bagian ini juga mencantumkan binding peran dan aturan tolak dalam kebijakan, serta menjelaskan pengaruhnya terhadap akses akun utama.

Anda dapat mengakses Pemecah Masalah Kebijakan menggunakan Konsol Google Cloud, Google Cloud CLI, atau REST API. Untuk kueri sederhana, menggunakan Konsol Google Cloud biasanya adalah yang tercepat. Untuk skenario yang lebih kompleks, pertimbangkan gcloud CLI atau REST API.

Sebelum memulai

  • Enable the Policy Troubleshooter API.

    Enable the API

Izin yang diperlukan

Untuk memecahkan masalah akses akun utama sepenuhnya, Anda memerlukan izin berikut.

Izin untuk memecahkan masalah akses untuk masing-masing akun utama

Pemecah Masalah Kebijakan menganalisis akses akun utama ke resource berdasarkan kebijakan izin, kebijakan penolakan, dan peran yang dapat Anda lihat. Jika tidak memiliki izin untuk melihat kebijakan yang berlaku pada suatu resource, atau jika tidak memiliki izin untuk melihat peran khusus, Anda mungkin tidak dapat mengetahui apakah akun utama memiliki akses atau tidak.

Untuk mendapatkan izin yang Anda perlukan dalam memecahkan masalah akses akun utama, minta administrator Anda untuk memberi Anda peran IAM berikut di organisasi:

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

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Izin untuk memecahkan masalah akses bagi anggota grup

Jika kebijakan izinkan dan tolak menyertakan grup, Anda memerlukan izin Google Workspace Admin API groups.read untuk memecahkan masalah akses bagi masing-masing anggota grup. Admin Super dan Admin Grup otomatis memiliki izin ini. Untuk memberikan izin ini kepada pengguna yang bukan admin Super atau Grup, buat peran administrator Google Workspace kustom yang berisi hak istimewa groups.read (berada di bagian Hak Istimewa Admin API) dan berikan kepada pengguna.

Jika Anda tidak memiliki izin ini, binding peran dan aturan tolak yang berisi grup atau domain akan memiliki hasil akses Tidak diketahui, kecuali jika binding peran atau aturan penolakan juga menyertakan akun utama secara eksplisit.

Izin untuk memecahkan masalah akses bagi anggota domain

Jika kebijakan izinkan dan tolak Anda menyertakan akun Google Workspace atau domain Cloud Identity, Anda harus menjadi administrator domain untuk memecahkan masalah akses bagi setiap anggota domain.

Jika Anda tidak memiliki izin ini, binding peran dan aturan tolak yang berisi grup atau domain akan memiliki hasil akses Tidak diketahui, kecuali jika binding peran atau aturan penolakan juga menyertakan akun utama secara eksplisit.

Memecahkan masalah akses

Untuk memecahkan masalah akses, Anda memerlukan informasi berikut:

  • Principal: Alamat email yang akan diperiksa. Alamat email harus merujuk ke akun pengguna atau layanan. Jenis akun utama lainnya, termasuk grup, domain, identitas tenaga kerja, dan identitas beban kerja, tidak didukung.
  • Resource: Nama lengkap resource. Misalnya, untuk memeriksa project my-project, masukkan //cloudresourcemanager.googleapis.com/projects/my-project. Untuk jenis resource lainnya, lihat contoh nama resource lengkap.
  • Izin: Izin untuk memeriksa. Jika Anda menggunakan Konsol Google Cloud, konsol akan menampilkan daftar saran saat Anda mengetik. Untuk mengetahui daftar lengkap izin, lihat referensi izin.

Konsol

Untuk memecahkan masalah akses, lakukan hal berikut:

  1. Di konsol Google Cloud, buka halaman Pemecah Masalah Kebijakan.

    Buka Pemecah Masalah Kebijakan

  2. Masukkan email akun utama yang aksesnya ingin Anda periksa.

  3. Masukkan nama lengkap resource yang akan diperiksa.

    Jika Anda tidak mengetahui nama lengkap resource, lakukan salah satu hal berikut:

    • Jika Anda memecahkan masalah akses untuk project, folder, atau organisasi, mulailah mengetik untuk melihat opsi pelengkapan otomatis.
    • Jika Anda memecahkan masalah akses untuk jenis resource lain, klik Browse untuk membuka dialog penelusuran resource, lalu telusuri resource:

      1. Di kotak Select scope, pilih project, folder, atau organisasi yang akan ditelusuri.
      2. Di kotak Resource type, pilih jenis resource yang ingin ditelusuri.
      3. Di kotak Search for resources, masukkan bagian nama resource.
      4. Di bagian hasil, pilih referensi yang ingin diperiksa.
      5. Klik Select untuk memilih materi dan menutup dialog.
  4. Masukkan izin untuk memeriksa.

    Jika Anda tidak tahu nama izin lengkap, mulailah mengetik untuk melihat opsi pelengkapan otomatis.

  5. Opsional: Untuk memeriksa beberapa resource dan izin, pilih Add Another Pair dan ulangi langkah sebelumnya.

  6. Klik Periksa akses.

gcloud

Untuk mengetahui alasan akun utama memiliki, atau tidak memiliki, izin IAM, gunakan perintah gcloud policy-troubleshoot iam.

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • EMAIL: Alamat email akun utama yang izinnya ingin Anda pecahkan masalahnya.
  • RESOURCE: Resource tempat izin diberikan.
  • PERMISSION: Izin yang ingin Anda pecahkan masalahnya.

Jalankan perintah gcloud policy-troubleshoot iam:

Linux, macOS, atau Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

Anda akan melihat respons seperti berikut:

{
  "accessTuple": {
    "conditionContext": {
      "destination": {},
      "effectiveTags": [
        {
          "tagValue": "tagValues/281481941428044",
          "namespacedTagValue": "803434038361/env/dev",
          "tagKey": "tagKeys/281475994198094",
          "namespacedTagKey": "803434038361/env",
          "tagKeyParentName": "organizations/803434038361"
        }
      ],
      "request": {},
      "resource": {}
    },
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "compute.instances.get",
    "permissionFqdn": "compute.googleapis.com/instances.get",
    "principal": "user1@example.com"
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_HIGH"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "role": "roles/compute.viewer",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/owner",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.organizationAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
        "policy": {
          "bindings": [
            {
              "members": [
                "user:user1@example.com"
              ],
              "role": "roles/compute.viewer"
            },
            {
              "members": [
                "user:user2@example.com"
              ],
              "role": "roles/owner"
            },
            {
              "members": [
                "user:user1@example.com"
              ],
              "role": "roles/resourcemanager.organizationAdmin"
            },
          ],
          "etag": "BwX5/L9Vbg4=",
          "version": 3
        },
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_DENIED",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_DENIED",
            "policy": {
              "createTime": "2023-04-18T07:15:47.702191Z",
              "displayName": "Deny compute instance get",
              "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=",
              "kind": "DenyPolicy",
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get",
              "rules": [
                {
                  "denyRule": {
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com"
                    ],
                    "deniedPermissions": [
                      "compute.googleapis.com/instances.get"
                    ]
                  }
                }
              ],
              "uid": "77e93c80-b383-0027-268e-a52a608aa13d",
              "updateTime": "2023-04-18T07:15:47.702191Z",
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "ruleExplanations": [
              {
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "compute.googleapis.com/instances.get": {
                    "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": {
                    "membership": "MEMBERSHIP_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "denyAccessState": "DENY_ACCESS_STATE_DENIED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ]
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "permissionDeniable": true,
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "overallAccessState": "CANNOT_ACCESS"
}

REST

Untuk mengetahui alasan akun utama memiliki, atau tidak memiliki, izin IAM, gunakan metode iam.troubleshoot Policy Pemecah Masalah API.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • EMAIL: Alamat email akun utama yang izinnya ingin Anda pecahkan masalahnya.
  • RESOURCE: Resource tempat izin diberikan.
  • PERMISSION: Izin yang ingin Anda pecahkan masalahnya.
  • PROJECT_ID: ID project yang ingin Anda gunakan untuk membuat permintaan. Project ID adalah string alfanumerik, seperti my-project.

Metode HTTP dan URL:

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

Meminta isi JSON:

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

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan melihat respons JSON seperti berikut:

{
  "overallAccessState": "CANNOT_ACCESS",
  "accessTuple": {
    "principal": "user1@example.com",
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "compute.instances.get",
    "permissionFqdn": "compute.googleapis.com/instances.get",
    "conditionContext": {
      "effectiveTags": [
        {
          "tagValue": "tagValues/281481941428044",
          "namespacedTagValue": "803434038361/env/dev",
          "tagKey": "tagKeys/281475994198094",
          "namespacedTagKey": "803434038361/env",
          "tagKeyParentName": "organizations/803434038361"
        }
      ]
    }
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
            "role": "roles/compute.viewer",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_HIGH"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "role": "roles/owner",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "role": "roles/resourcemanager.organizationAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "relevance": "HEURISTIC_RELEVANCE_HIGH",
        "policy": {
          "version": 3,
          "etag": "BwX5/L9Vbg4=",
          "bindings": [
            {
              "role": "roles/compute.viewer",
              "members": [
                "user:user1@example.com"
              ]
            },
            {
              "role": "roles/owner",
              "members": [
                "user:user2@example.com"
              ]
            },
            {
              "role": "roles/resourcemanager.organizationAdmin",
              "members": [
                "user:user1@example.com"
              ]
            },
          ]
        }
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_DENIED",
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_DENIED",
            "policy": {
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get",
              "uid": "77e93c80-b383-0027-268e-a52a608aa13d",
              "kind": "DenyPolicy",
              "displayName": "Deny compute instance get",
              "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=",
              "createTime": "2023-04-18T07:15:47.702191Z",
              "updateTime": "2023-04-18T07:15:47.702191Z",
              "rules": [
                {
                  "denyRule": {
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com"
                    ],
                    "deniedPermissions": [
                      "compute.googleapis.com/instances.get"
                    ]
                  }
                }
              ]
            },
            "ruleExplanations": [
              {
                "denyAccessState": "DENY_ACCESS_STATE_DENIED",
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "compute.googleapis.com/instances.get": {
                    "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": {
                    "membership": "MEMBERSHIP_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ],
            "relevance": "HEURISTIC_RELEVANCE_HIGH"
          }
        ],
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_HIGH",
    "permissionDeniable": true
  }
}

Memahami hasil Pemecah masalah

Konsol

Halaman hasil berisi informasi berikut:

Detail evaluasi

Bagian Evaluation details berisi ringkasan tentang akses yang Anda pecahkan, termasuk akun utama, resource, dan izin yang ditentukan. Jika memecahkan masalah beberapa pasangan izin resource, Anda dapat menggunakan daftar Evaluasi Akses untuk beralih di antara pasangan izin tersebut.

Detail kebijakan

Bagian Detail kebijakan berisi detail pengaruh kebijakan izinkan dan tolak yang relevan terhadap akses akun utama.

Kebijakan izin dan penolakan yang relevan meliputi hal-hal berikut:

  • Kebijakan izinkan resource
  • Kebijakan penolakan resource, jika ada
  • Kebijakan izinkan project induk, folder, dan organisasi resource, jika ada
  • Kebijakan penolakan project, folder, dan organisasi induk resource, jika ada

Kebijakan izin dan penolakan project induk, folder, dan organisasi bersifat relevan karena adanya pewarisan kebijakan. Jika Anda melampirkan kebijakan izinkan atau tolak ke project, folder, atau organisasi, kebijakan tersebut juga berlaku untuk semua resource di dalam project, folder, atau organisasi tersebut.

Misalnya, jika kebijakan penolakan untuk organisasi mengatakan bahwa akun utama tidak dapat menggunakan izin tertentu, akun utama tidak dapat menggunakan izin tersebut untuk resource apa pun dalam organisasi. Aturan ini berlaku meskipun folder dan project di dalam organisasi tersebut memiliki kebijakan penolakan yang lebih permisif, atau mengizinkan kebijakan yang memberikan izin kepada entity utama.

Demikian pula, jika kebijakan izinkan untuk suatu project memberikan izin khusus kepada akun utama, maka akun utama memiliki izin tersebut untuk setiap resource dalam project, asalkan tidak ditolak.

Bagian Detail kebijakan berisi bagian berikut:

Status akses

Bagian Status akses berisi ringkasan singkat tentang akses akun utama berdasarkan kebijakan izin dan penolakan IAM yang relevan. Ringkasan ini mencakup dampak kebijakan penolakan, dampak kebijakan izin, dan hasil akhir akses berdasarkan kebijakan penolakan dan izin yang relevan.

Kebijakan penolakan

Di bagian Kebijakan penolakan, Anda dapat melihat semua kebijakan penolakan yang relevan, mengidentifikasi aturan penolakan yang menolak akses ke akun utama, dan memahami alasan aturan penolakan menolak atau tidak menolak izin akun utama.

Panel Resource dengan kebijakan penolakan mencantumkan semua kebijakan penolakan yang relevan, yang diatur menurut resource yang terkait. Di samping setiap kebijakan penolakan terdapat evaluasi akses. Evaluasi ini hanya berlaku untuk kebijakan penolakan tersebut dan tidak mencerminkan akses apa pun dari kebijakan yang diwarisi. Jika Anda tidak memiliki izin untuk melihat kebijakan penolakan resource, daftar resource tidak menyertakan resource tersebut atau kebijakan penolakannya.

Untuk melihat aturan penolakan yang relevan dalam kebijakan penolakan ini, klik kebijakan penolakan. Untuk melihat semua aturan penolakan dalam kebijakan penolakan resource, klik resource. Aturan penolakan muncul di panel Deny rules. Panel ini berisi tabel semua aturan penolakan dengan akun utama atau izin yang dikueri untuk resource atau kebijakan penolakan yang telah Anda pilih.

Kolom Access menunjukkan apakah aturan penolakan menolak izin akun utama. Untuk melihat detail selengkapnya tentang aturan penolakan, klik Lihat aturan penolakan di baris aturan tersebut.

Kebijakan izin

Di bagian Allow policy, Anda dapat melihat semua kebijakan izin yang relevan, mengidentifikasi binding peran yang memberikan akses ke akun utama, dan memahami alasan binding peran memberikan atau tidak memberikan izin kepada akun utama.

Panel Resources mencantumkan resource yang ditentukan dan ancestornya. Di samping setiap resource adalah evaluasi akses. Evaluasi ini hanya berlaku untuk kebijakan izin resource tersebut. Evaluasi ini tidak mencerminkan akses apa pun dari kebijakan yang diwarisi. Jika Anda tidak memiliki izin untuk melihat kebijakan izin resource, daftar resource tidak menyertakan resource tersebut.

Untuk menampilkan binding peran yang relevan dalam kebijakan izin resource dan melihat caranya atau tidak memberikan izin pada akun utama, klik resource. Binding kebijakan izinkan akan muncul di panel Binding peran.

Panel Binding peran berisi tabel binding peran di kebijakan izin resource yang dipilih. Secara default, tabel hanya berisi binding peran yang menyertakan peran dengan izin yang ditentukan. Jika akun utama tidak memiliki akses, tabel juga menampilkan binding peran dengan peran khusus yang dapat diedit. Untuk melihat semua binding peran, hapus centang pada kotak Show only relevant bindings.

Kolom Akses menunjukkan apakah binding peran memberikan izin kepada akun utama. Untuk melihat detail binding peran selengkapnya, klik Lihat detail binding di baris binding tersebut.

gcloud

Respons berisi empat bagian utama: deskripsi tuple akses dalam permintaan, hasil evaluasi kebijakan izinkan, hasil evaluasi kebijakan penolakan, dan status akses secara keseluruhan.

  • accessTuple: Deskripsi tuple akses dalam permintaan, termasuk konteks kondisi apa pun yang Anda berikan. Bagian ini juga berisi ringkasan tag yang berlaku untuk resource.
  • allowPolicyExplanation: Ringkasan apakah kebijakan izinkan yang relevan memberikan izin kepada akun utama, diikuti dengan daftar kebijakan izin dan binding perannya.

    Untuk setiap kebijakan izinkan, respons mencantumkan semua binding peran dalam kebijakan dan mengevaluasinya berdasarkan kriteria berikut:

    • Apakah binding mencakup izin.
    • Apakah binding menyertakan akun utama.
    • Apakah kondisi dalam binding, jika ada, terpenuhi.

    Kemudian, respons akan mencetak teks JSON lengkap dari kebijakan izinkan.

  • denyPolicyExplanation: Rangkuman apakah kebijakan penolakan yang relevan menolak memberikan izin kepada akun utama, diikuti dengan daftar resource dengan kebijakan penolakan. Untuk setiap resource, respons mencantumkan semua kebijakan penolakan yang melekat pada resource tersebut.

    Untuk setiap kebijakan penolakan, respons mencetak metadata kebijakan, mencantumkan aturan penolakan dalam kebijakan, lalu mengevaluasi setiap aturan berdasarkan kriteria berikut:

    • Apakah aturan penolakan mencakup izin.
    • Apakah izin tercantum sebagai pengecualian dalam aturan penolakan.
    • Apakah aturan penolakan menyertakan akun utama.
    • Apakah akun utama tercantum sebagai pengecualian dalam aturan penolakan.
    • Apakah kondisi dalam aturan penolakan, jika ada, terpenuhi.
  • overallAccessState: Apakah akun utama dapat menggunakan izin yang ditentukan untuk mengakses resource yang ditentukan berdasarkan kebijakan izinkan dan tolak yang relevan.

    Kebijakan izin dan penolakan yang relevan meliputi hal-hal berikut:

    • Kebijakan izinkan resource
    • Kebijakan penolakan resource, jika ada
    • Kebijakan izinkan project induk, folder, dan organisasi resource, jika ada
    • Kebijakan penolakan project, folder, dan organisasi induk resource, jika ada

    Kebijakan izin dan penolakan project induk, folder, dan organisasi bersifat relevan karena adanya pewarisan kebijakan. Jika Anda melampirkan kebijakan izinkan atau tolak ke project, folder, atau organisasi, kebijakan tersebut juga berlaku untuk semua resource di dalam project, folder, atau organisasi tersebut.

    Misalnya, jika kebijakan penolakan untuk organisasi mengatakan bahwa akun utama tidak dapat menggunakan izin tertentu, akun utama tidak dapat menggunakan izin tersebut untuk resource apa pun dalam organisasi. Aturan ini berlaku meskipun folder dan project di dalam organisasi tersebut memiliki kebijakan penolakan yang lebih permisif, atau mengizinkan kebijakan yang memberikan izin kepada entity utama.

    Demikian pula, jika kebijakan izinkan untuk suatu project memberikan izin khusus kepada akun utama, maka akun utama memiliki izin tersebut untuk setiap resource dalam project, asalkan tidak ditolak.

  • Banyak objek dalam respons juga memiliki kolom relevance. Nilai di kolom ini menunjukkan seberapa besar kontribusi objek tersebut terhadap status akses secara keseluruhan. Kolom relevance dapat memiliki nilai berikut:

    • HEURISTIC_RELEVANCE_HIGH: Menunjukkan bahwa objek memiliki dampak yang kuat terhadap hasil. Dengan kata lain, menghapus objek kemungkinan akan mengubah status akses secara keseluruhan. Misalnya, binding peran yang memberikan izin yang ditentukan kepada akun utama akan memiliki nilai relevansi ini.

    • HEURISTIC_RELEVANCE_NORMAL: Menunjukkan bahwa objek memiliki dampak terbatas pada hasil. Dengan kata lain, menghapus objek tidak akan mengubah status akses secara keseluruhan. Misalnya, aturan penolakan yang tidak berisi izin atau akun utama akan memiliki nilai relevansi ini.

REST

Respons berisi empat bagian utama: status akses secara keseluruhan, deskripsi tuple akses dalam permintaan, hasil evaluasi kebijakan izinkan, dan hasil evaluasi kebijakan penolakan.

  • overallAccessState: Apakah akun utama dapat menggunakan izin yang ditentukan untuk mengakses resource yang ditentukan berdasarkan kebijakan izinkan dan tolak yang relevan.

    Kebijakan izin dan penolakan yang relevan meliputi hal-hal berikut:

    • Kebijakan izinkan resource
    • Kebijakan penolakan resource, jika ada
    • Kebijakan izinkan project induk, folder, dan organisasi resource, jika ada
    • Kebijakan penolakan project, folder, dan organisasi induk resource, jika ada

    Kebijakan izin dan penolakan project induk, folder, dan organisasi bersifat relevan karena adanya pewarisan kebijakan. Jika Anda melampirkan kebijakan izinkan atau tolak ke project, folder, atau organisasi, kebijakan tersebut juga berlaku untuk semua resource di dalam project, folder, atau organisasi tersebut.

    Misalnya, jika kebijakan penolakan untuk organisasi mengatakan bahwa akun utama tidak dapat menggunakan izin tertentu, akun utama tidak dapat menggunakan izin tersebut untuk resource apa pun dalam organisasi. Aturan ini berlaku meskipun folder dan project di dalam organisasi tersebut memiliki kebijakan penolakan yang lebih permisif, atau mengizinkan kebijakan yang memberikan izin kepada entity utama.

    Demikian pula, jika kebijakan izinkan untuk suatu project memberikan izin khusus kepada akun utama, maka akun utama memiliki izin tersebut untuk setiap resource dalam project, asalkan tidak ditolak.

  • accessTuple: Deskripsi tuple akses dalam permintaan, termasuk konteks kondisi apa pun yang Anda berikan. Bagian ini juga berisi ringkasan tag yang berlaku untuk resource.
  • allowPolicyExplanation: Ringkasan apakah kebijakan izinkan yang relevan memberikan izin kepada akun utama, diikuti dengan daftar kebijakan izin dan binding perannya.

    Untuk setiap kebijakan izinkan, respons mencantumkan semua binding peran dalam kebijakan dan mengevaluasinya berdasarkan kriteria berikut:

    • Apakah binding mencakup izin.
    • Apakah binding menyertakan akun utama.
    • Apakah kondisi dalam binding, jika ada, terpenuhi.

    Kemudian, respons akan mencetak teks JSON lengkap dari kebijakan izinkan.

  • denyPolicyExplanation: Rangkuman apakah kebijakan penolakan yang relevan menolak memberikan izin kepada akun utama, diikuti dengan daftar resource dengan kebijakan penolakan. Untuk setiap resource, respons mencantumkan semua kebijakan penolakan yang melekat pada resource tersebut.

    Untuk setiap kebijakan penolakan, respons mencetak metadata kebijakan, mencantumkan aturan penolakan dalam kebijakan, lalu mengevaluasi setiap aturan berdasarkan kriteria berikut:

    • Apakah aturan penolakan mencakup izin.
    • Apakah izin tercantum sebagai pengecualian dalam aturan penolakan.
    • Apakah aturan penolakan menyertakan akun utama.
    • Apakah akun utama tercantum sebagai pengecualian dalam aturan penolakan.
    • Apakah kondisi dalam aturan penolakan, jika ada, terpenuhi.
  • Banyak objek dalam respons juga memiliki kolom relevance. Nilai di kolom ini menunjukkan seberapa besar kontribusi objek tersebut terhadap status akses secara keseluruhan. Kolom relevance dapat memiliki nilai berikut:

    • HEURISTIC_RELEVANCE_HIGH: Menunjukkan bahwa objek memiliki dampak yang kuat terhadap hasil. Dengan kata lain, menghapus objek kemungkinan akan mengubah status akses secara keseluruhan. Misalnya, binding peran yang memberikan izin yang ditentukan kepada akun utama akan memiliki nilai relevansi ini.

    • HEURISTIC_RELEVANCE_NORMAL: Menunjukkan bahwa objek memiliki dampak terbatas pada hasil. Dengan kata lain, menghapus objek tidak akan mengubah status akses secara keseluruhan. Misalnya, aturan penolakan yang tidak berisi izin atau akun utama akan memiliki nilai relevansi ini.

Memecahkan masalah binding peran bersyarat

Pemecah Masalah Kebijakan otomatis memecahkan masalah binding peran bersyarat dan aturan penolakan berdasarkan tag. Namun, untuk memecahkan jenis binding peran bersyarat lainnya atau aturan penolakan bersyarat, Pemecah Masalah Kebijakan memerlukan konteks tambahan tentang permintaan tersebut. Misalnya, untuk memecahkan masalah berdasarkan atribut tanggal/waktu, Pemecah Masalah Kebijakan memerlukan waktu permintaan.

Di gcloud CLI dan REST API, Anda memberikan konteks tambahan ini secara manual.

Di konsol Google Cloud, Anda dapat memberikan konteks tambahan ini dengan memecahkan masalah langsung dari log audit Aktivitas Admin atau log audit Akses Data. Setiap entri log audit sesuai dengan sebuah permintaan ke Google Cloud API, atau tindakan yang dilakukan Google Cloud atas nama Anda. Saat Anda memecahkan masalah dari log audit, Pemecah Masalah Kebijakan akan otomatis mendapatkan informasi tambahan tentang permintaan tersebut, seperti tanggal dan waktunya, yang memungkinkan Pemecah Masalah Kebijakan menganalisis binding peran bersyarat dan aturan penolakan.

Konsol

Untuk memecahkan masalah binding peran bersyarat dan aturan penolakan, lakukan langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Logs Explorer.

    Buka Logs Explorer

  2. Jika judul halamannya adalah Log Viewer Lama, klik menu drop-down Upgrade lalu pilih Upgrade ke Logs Explorer baru.

  3. Untuk hanya melihat log audit Aktivitas Admin dan Akses Data, masukkan kueri berikut di pembuat kueri, lalu klik Jalankan kueri:

    logName=("RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity" OR "RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Fdata_access")
    

    Ganti nilai berikut:

    • RESOURCE_TYPE: Jenis resource yang Anda cantumkan log auditnya. Gunakan projects, folders, atau organizations.
    • RESOURCE_ID: ID resource Anda.
  4. Temukan entri log audit yang sesuai dengan permintaan yang ingin Anda pecahkan. Untuk mempelajari cara menggunakan Logs Explorer untuk menemukan entri log tertentu, lihat Menggunakan Logs Explorer.

  5. Di kolom Ringkasan entri log, klik IAM, lalu klik Pecahkan masalah akses.

    Pemecah Masalah Kebijakan menggunakan informasi dalam entri log untuk memecahkan masalah akses, lalu menampilkan hasilnya. Konteks tambahan dicantumkan dalam detail evaluasi di bagian Konteks kondisi. Untuk melihat detail konteks, klik Lihat konteks kondisi. Untuk mempelajari halaman hasil Pemecah Masalah Kebijakan lebih lanjut, lihat Memecahkan masalah akses di halaman ini.

  6. Opsional: Untuk memecahkan masalah permintaan lain yang melibatkan binding peran bersyarat dan aturan penolakan, kembali ke halaman Logs Explorer dan ulangi langkah sebelumnya.

gcloud

Untuk memecahkan masalah binding peran bersyarat dan aturan penolakan, gunakan perintah gcloud policy-troubleshoot iam.

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • EMAIL: Alamat email akun utama yang izinnya ingin Anda pecahkan masalahnya.
  • RESOURCE: Resource tempat izin diberikan.
  • PERMISSION: Izin yang ingin Anda pecahkan masalahnya.
  • DESTINATION_IP: Opsional. Alamat IP tujuan permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Misalnya, 198.1.1.1.
  • DESTINATION_PORT: Opsional. Port tujuan permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Misalnya, `8080`.
  • REQUEST_TIME: Opsional. Stempel waktu permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Gunakan stempel waktu dalam format RFC 3339—misalnya, 2099-02-01T00:00:00Z.
  • RESOURCE_NAME: Opsional. Nilai nama resource yang akan digunakan saat memeriksa binding peran bersyarat. Untuk daftar format nama resource yang diterima, lihat Format nama resource.
  • RESOURCE_SERVICE: Opsional. Nilai layanan resource yang akan digunakan saat memeriksa binding peran bersyarat. Untuk daftar nama layanan yang diterima, lihat Nilai layanan resource.
  • RESOURCE_TYPE: Opsional. Untuk daftar jenis resource yang diterima, lihat Nilai jenis resource.

Jalankan perintah gcloud policy-troubleshoot iam:

Linux, macOS, atau Cloud Shell

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION --destination-ip=DESTINATION_IP \
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME \
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE \
    --resource-type=RESOURCE_TYPE

Windows (PowerShell)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION --destination-ip=DESTINATION_IP `
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME `
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE `
    --resource-type=RESOURCE_TYPE

Windows (cmd.exe)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION --destination-ip=DESTINATION_IP ^
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME ^
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE ^
    --resource-type=RESOURCE_TYPE

Respons berisi penjelasan tentang akses akun utama. Untuk setiap aturan binding dan penolakan peran dengan suatu kondisi, responsnya akan menyertakan kolom conditionExplanation yang menjelaskan apakah kondisi tersebut bernilai benar atau salah berdasarkan konteks kondisi yang Anda berikan.

Misalnya, berikut ini adalah evaluasi binding peran dengan kondisi yang menentukan jenis resource dan layanan resource:

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "evaluationStates": [{
      "end": 51,
      "start": 1,
      "value": true
    }, {
      "end": 99,
      "start": 55,
      "value": true
    }],
    "value": true,
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
}
...

REST

Untuk memecahkan masalah binding peran bersyarat dan aturan penolakan, gunakan metode iam.troubleshoot Policy Pemecah Masalah API.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • EMAIL: Alamat email akun utama yang izinnya ingin Anda pecahkan masalahnya.
  • RESOURCE: Resource tempat izin diberikan.
  • PERMISSION: Izin yang ingin Anda pecahkan masalahnya.
  • DESTINATION_IP: Opsional. Alamat IP tujuan permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Misalnya, 198.1.1.1.
  • DESTINATION_PORT: Opsional. Port tujuan permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Misalnya, `8080`.
  • REQUEST_TIME: Opsional. Stempel waktu permintaan yang akan digunakan saat memeriksa binding peran bersyarat. Gunakan stempel waktu dalam format RFC 3339—misalnya, 2099-02-01T00:00:00Z.
  • RESOURCE_NAME: Opsional. Nilai nama resource yang akan digunakan saat memeriksa binding peran bersyarat. Untuk daftar format nama resource yang diterima, lihat Format nama resource.
  • RESOURCE_SERVICE: Opsional. Nilai layanan resource yang akan digunakan saat memeriksa binding peran bersyarat. Untuk daftar nama layanan yang diterima, lihat Nilai layanan resource.
  • RESOURCE_TYPE: Opsional. Untuk daftar jenis resource yang diterima, lihat Nilai jenis resource.

Metode HTTP dan URL:

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

Meminta isi JSON:

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION",
    "conditionContext": {
      "destination": {
        "ip": DESTINATION_IP,
        "port": DESTINATION_PORT
      },
      "request": {
        "receiveTime": REQUEST_TIME
      },
      "resource": {
        "name": RESOURCE_NAME,
        "service": RESOURCE_SERVICE,
        "type": RESOURCE_TYPE
      }
    }
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Respons berisi penjelasan tentang akses akun utama. Untuk setiap aturan binding dan penolakan peran dengan suatu kondisi, responsnya akan menyertakan kolom conditionExplanation yang menjelaskan apakah kondisi tersebut bernilai benar atau salah berdasarkan konteks kondisi yang Anda berikan.

Misalnya, berikut ini adalah evaluasi binding peran dengan kondisi yang menentukan jenis resource dan layanan resource:

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "value": true,
    "evaluationStates": [{
      "start": 1,
      "end": 51,
      "value": true
    }, {
      "start": 55,
      "end": 99,
      "value": true
    }]
  }
}
...

Langkah selanjutnya