Memecahkan masalah izin IAM

Pemecah Masalah Kebijakan untuk IAM membantu Anda memahami alasan 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, biasanya tercepat adalah menggunakan konsol Google Cloud. 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 akun utama individual

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

Untuk mendapatkan izin yang diperlukan dalam memecahkan masalah akses akun utama, minta administrator untuk memberi Anda peran IAM berikut pada 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 Anda menyertakan grup, Anda memerlukan izin Admin API Google Workspace groups.read untuk memecahkan masalah akses bagi setiap anggota grup. Admin Super dan Admin Grup secara 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 Unknown, kecuali jika peran binding atau aturan penolakan tersebut juga menyertakan entity 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 Unknown, kecuali jika peran binding atau aturan penolakan tersebut juga menyertakan entity utama secara eksplisit.

Memecahkan masalah akses

Untuk memecahkan masalah akses, Anda memerlukan informasi berikut:

  • Utama: 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, daftar saran akan ditampilkan 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 langkah 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 tersebut:

      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 dari nama resource.
      4. Di bagian hasil, pilih resource yang ingin diperiksa.
      5. Klik Select untuk memilih referensi dan menutup dialog.
  4. Masukkan izin untuk diperiksa.

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

  5. Opsional: Untuk memeriksa beberapa resource dan izin, pilih Tambahkan Pasangan Lain dan ulangi langkah sebelumnya.

  6. Klik Periksa akses.

gcloud

Untuk mencari tahu 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 mencari tahu 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 Detail evaluasi berisi ringkasan akses yang sedang 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 tentang pengaruh kebijakan izinkan dan tolak yang relevan terhadap akses akun utama.

Kebijakan izinkan dan tolak yang relevan meliputi:

  • 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 tolak project induk, folder, dan organisasi menjadi relevan karena 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 izinkan, dan hasil akses akhir berdasarkan kebijakan tolak dan izinkan 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 utama.

Panel Resource dengan kebijakan penolakan mencantumkan semua kebijakan penolakan yang relevan, yang diatur berdasarkan resource yang menyertainya. 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 akan 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 tolak 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 utama. Untuk melihat detail selengkapnya tentang aturan penolakan, klik Lihat aturan penolakan di baris aturan tersebut.

Kebijakan izinkan

Di bagian Izinkan kebijakan, 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 izinkan 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 akan menyertakan resource tersebut.

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

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

Kolom Access menunjukkan apakah binding peran memberikan izin kepada akun utama. Untuk melihat detail selengkapnya tentang binding peran, 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 yang diizinkan 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: Ringkasan apakah kebijakan penolakan yang relevan menolak izin utama, diikuti dengan daftar resource dengan kebijakan penolakan. Untuk setiap resource, respons akan mencantumkan semua kebijakan penolakan yang terpasang pada resource.

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

    • Apakah aturan penolakan menyertakan izin.
    • Apakah izin dicantumkan sebagai pengecualian dalam aturan penolakan.
    • Apakah aturan penolakan menyertakan entity utama.
    • Apakah akun utama dicantumkan 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 izinkan dan tolak yang relevan meliputi:

    • 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 tolak project induk, folder, dan organisasi menjadi relevan karena 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 objek tersebut berkontribusi 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 akun utama izin yang ditentukan akan memiliki nilai relevansi ini.

    • HEURISTIC_RELEVANCE_NORMAL: Menunjukkan bahwa objek memiliki dampak terbatas terhadap hasilnya. Dengan kata lain, menghapus objek tidak mungkin 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 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 izinkan dan tolak yang relevan meliputi:

    • 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 tolak project induk, folder, dan organisasi menjadi relevan karena 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 yang diizinkan 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: Ringkasan apakah kebijakan penolakan yang relevan menolak izin utama, diikuti dengan daftar resource dengan kebijakan penolakan. Untuk setiap resource, respons akan mencantumkan semua kebijakan penolakan yang terpasang pada resource.

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

    • Apakah aturan penolakan menyertakan izin.
    • Apakah izin dicantumkan sebagai pengecualian dalam aturan penolakan.
    • Apakah aturan penolakan menyertakan entity utama.
    • Apakah akun utama dicantumkan 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 objek tersebut berkontribusi 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 akun utama izin yang ditentukan akan memiliki nilai relevansi ini.

    • HEURISTIC_RELEVANCE_NORMAL: Menunjukkan bahwa objek memiliki dampak terbatas terhadap hasilnya. Dengan kata lain, menghapus objek tidak mungkin 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 tolak berdasarkan tag. Namun, untuk memecahkan masalah jenis binding peran bersyarat atau aturan penolakan bersyarat lainnya, 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 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 tolak, lakukan langkah berikut:

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

    Buka Logs Explorer

  2. Jika judul halaman adalah Legacy Logs Viewer, klik menu drop-down Upgrade dan 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 log auditnya Anda cantumkan. 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 guna menemukan entri log tertentu, lihat Menggunakan Logs Explorer.

  5. Pada kolom Summary di entri log, klik IAM, lalu klik Memecahkan masalah akses.

    Pemecah Masalah Kebijakan menggunakan informasi dalam entri log untuk memecahkan masalah akses, lalu menampilkan hasilnya kepada Anda. Konteks tambahan tercantum 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-langkah sebelumnya.

gcloud

Untuk memecahkan masalah binding peran bersyarat dan aturan tolak, 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 mengetahui 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 akses akun utama. Untuk setiap aturan pengikatan 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 mengetahui 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 akses akun utama. Untuk setiap aturan pengikatan 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