Memecahkan masalah "withcond" dalam kebijakan dan binding peran

Saat melihat kebijakan izin, Anda mungkin melihat nama peran yang menyertakan string withcond, diikuti dengan nilai hash. Misalnya, Anda mungkin melihat nama peran seperti roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

Halaman ini menjelaskan kapan dan mengapa Anda melihat string withcond dalam kebijakan izin. Juga merekomendasikan tindakan yang harus Anda lakukan jika melihat string ini.

Versi kebijakan dan binding peran bersyarat

Kebijakan izinkan dapat ditampilkan dalam berbagai bentuk. Setiap formulir dikenal sebagai versi kebijakan izinkan.

Dalam kebijakan izinkan yang menggunakan versi 1, beberapa binding peran dapat berisi string withcond dalam nama peran, yang diikuti dengan nilai hash:

{
  "bindings": [
    {
      "members": [
        "user:dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Format ini menunjukkan bahwa binding peran bersifat conditional. Dengan kata lain, peran hanya diberikan jika kondisi tertentu terpenuhi.

Kebijakan izin versi 1 tidak menampilkan ketentuan ini. Jika Anda melihat string withcond dan nilai hash, berarti binding peran menyertakan kondisi yang tidak dapat Anda lihat.

Solusi: Tentukan kebijakan versi 3

Untuk memastikan Anda dapat melihat dan memperbarui seluruh kebijakan izin, termasuk kondisinya, Anda harus selalu menentukan versi 3 saat mendapatkan atau menetapkan kebijakan izin. Untuk menentukan versi 3, selesaikan tugas di bagian berikut.

Mengupdate alat gcloud

Jika Anda menggunakan Google Cloud CLI, jalankan gcloud version untuk memeriksa nomor versinya. Output-nya mencakup string yang mirip dengan Google Cloud CLI 279.0.0.

Jika nomor versi kurang dari 263.0.0, jalankan gcloud components update untuk mengupdate gcloud CLI. Pada versi 263.0.0 dan yang lebih baru, gcloud CLI secara otomatis menetapkan versi kebijakan izinkan yang mendukung kondisi.

Mengupdate library klien

Jika aplikasi Anda menggunakan pustaka klien, ikuti langkah-langkah berikut:

  1. Temukan nama dan nomor versi untuk library klien, lalu periksa daftar library klien yang mendukung versi kebijakan izinkan.

    • Jika sudah menggunakan library klien versi terbaru dan mendukung versi kebijakan izin, Anda tidak perlu mengupdate library klien. Lanjutkan ke langkah berikutnya.

    • Jika Anda menggunakan library klien versi lama, dan versi yang lebih baru mendukung mengizinkan versi kebijakan, update library klien Anda ke versi terbaru.

    • Jika menggunakan library klien yang tidak mendukung izin versi kebijakan, Anda dapat menambahkan library klien lain yang mendukung versi kebijakan izinkan ke aplikasi Anda. Gunakan library klien tersebut untuk menangani kebijakan izinkan. Atau, Anda dapat menggunakan IAM REST API secara langsung.

  2. Perbarui kode apa pun di aplikasi Anda yang mendapatkan dan menetapkan kebijakan izinkan:

    • Saat Anda mendapatkan kebijakan izinkan, selalu tentukan versi 3 dalam permintaan.
    • Saat Anda menetapkan kebijakan izinkan, selalu setelversion di bidang kebijakan izinkan untuk3 , dan sertakanetag lapangan dalam permintaan Anda.

Mengupdate panggilan REST API

Jika aplikasi Anda menggunakan IAM REST API secara langsung, update kode apa pun yang mendapatkan dan menetapkan kebijakan yang diizinkan:

  • Saat Anda mendapatkan kebijakan izinkan, selalu tentukan versi 3 dalam permintaan.
  • Saat Anda menetapkan kebijakan izinkan, selalu setelversion di bidang kebijakan izinkan untuk3 , dan sertakanetag lapangan dalam permintaan Anda.

Memperbarui alat pengelolaan untuk kebijakan

Jika Anda menyimpan salinan lokal kebijakan izin—misalnya, jika Anda menyimpannya di sistem kontrol versi dan memperlakukannya sebagai kode—pastikan semua alat yang Anda gunakan memenuhi kriteria berikut:

  • Semua permintaan untuk mendapatkan atau menyetel kebijakan izinkan menentukan versi 3
  • Semua permintaan untuk menetapkan kebijakan izinkan menyertakan kolom etag dalam permintaan

Jika alat tidak memenuhi kriteria ini, periksa versi terbaru alat tersebut.

Selain itu, pastikan alat pengelolaan Anda mempertahankan pemberian peran bersyarat, bukan menambahkan pemberian peran duplikat yang tidak menyertakan kondisi. Misalnya, perhatikan skenario berikut ini:

  1. Anda memberikan peran Buat Akun Layanan (roles/iam.serviceAccountCreator) kepada pengguna vikram@example.com di folder my-folder. Kebijakan izinkan untuk folder tersebut terlihat mirip dengan contoh ini:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. Anda menggunakan alat untuk mengambil kebijakan izinkan dan menyimpannya di sistem kontrol versi.

  3. Anda menambahkan kondisi sehingga vikram@example.com hanya dapat membuat akun layanan selama minggu kerja normal, berdasarkan tanggal dan waktu di Berlin, Jerman. Kebijakan izinkan yang diperbarui terlihat mirip dengan contoh ini:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. Anda menggunakan alat untuk mengambil kebijakan izinkan yang telah diperbarui. Alat ini tidak menentukan versi kebijakan izinkan saat meminta kebijakan izinkan, sehingga Anda menerima kebijakan izinkan versi 1 dengan nama peran yang diubah:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

Pada tahap ini, alat pengelolaan dapat memutuskan bahwa binding dari vikram@example.com ke peran roles/iam.serviceAccountCreator telah hilang, dan harus memulihkan binding peran asli ke kebijakan izin:

Hindari: Binding peran tambahan tanpa kondisi

{
  "bindings": [
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

Perubahan ini salah. Hal ini memberikan peran roles/iam.serviceAccountCreator ke vikram@example.com, terlepas dari hari dalam seminggu. Akibatnya, kondisi pada binding peran pertama tidak berpengaruh.

Jika alat pengelolaan Anda mencoba membuat perubahan seperti ini, jangan setujui perubahan tersebut. Sebagai gantinya, Anda harus mengupdate alat pengelolaan untuk menentukan versi 3 dalam permintaan.

Langkah selanjutnya