Mengonfigurasi akses berbasis resource

Topik ini menjelaskan cara mengelola akses ke resource tertentu menggunakan binding peran bersyarat dalam kebijakan izin Anda. Dengan menggunakan atribut resource dalam ekspresi kondisi, Anda dapat memberikan subcakupan binding peran berdasarkan nama resource, jenis resource, dan/atau layanan Google Cloud.

Sebelum memulai

  • Baca Ringkasan Identity and Access Management (IAM) Conditions untuk memahami dasar-dasar binding peran bersyarat IAM.
  • Tinjau atribut resource yang dapat digunakan dalam ekspresi kondisi.
  • Atribut nama resource dapat mengontrol akses ke layanan Google Cloud berikut:
    • Apigee
    • Application Integration
    • BigQuery
    • Otorisasi Biner
    • Bigtable
    • Cloud Key Management Service
    • Cloud Logging
    • Spanner
    • Cloud SQL
    • Cloud Storage
    • Compute Engine
    • Dataform
    • Google Kubernetes Engine
    • Integration Connectors
    • Pub/Sub Lite
    • Secret Manager

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk mengelola binding peran bersyarat, minta administrator Anda untuk memberikan peran IAM berikut:

  • Untuk mengelola akses ke project: Admin IAM Project (roles/resourcemanager.projectIamAdmin) pada project
  • Untuk mengelola akses ke folder: Folder Admin (roles/resourcemanager.folderAdmin) pada folder
  • Untuk mengelola akses ke project, folder, dan organisasi: Organization Admin (roles/resourcemanager.organizationAdmin) pada organisasi
  • Untuk mengelola akses ke hampir semua resource Google Cloud: Security Admin (roles/iam.securityAdmin) pada project, folder, atau organisasi yang resource-nya ingin Anda kelola aksesnya

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

Peran bawaan ini berisi izin yang diperlukan untuk mengelola binding peran bersyarat. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengelola binding peran bersyarat:

  • Untuk mengelola akses ke project:
    • resourcemanager.projects.getIamPolicy pada project
    • resourcemanager.projects.setIamPolicy pada project
  • Untuk mengelola akses ke folder:
    • resourcemanager.folders.getIamPolicy pada folder
    • resourcemanager.folders.setIamPolicy pada folder
  • Untuk mengelola akses ke organisasi:
    • resourcemanager.organizations.getIamPolicy di organisasi
    • resourcemanager.organizations.setIamPolicy di organisasi

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Memberikan akses ke grup resource berdasarkan awalan nama resource

Binding peran bersyarat dapat digunakan untuk memberikan akses ke akun utama pada resource yang namanya cocok dengan awalan, misalnya instance virtual machine (VM) Compute Engine yang namanya diawali dengan string tertentu. Awalan nama resource biasanya digunakan untuk mengelompokkan resource yang ditujukan untuk fungsi tertentu atau yang memiliki properti tertentu.

Pertimbangkan contoh berikut: Perusahaan software ExampleCo menjalankan workload pada instance VM tertentu yang mungkin beroperasi pada data layanan kesehatan yang sensitif. Workload nonsensitif lainnya harus dijalankan dalam project yang sama, dan ExampleCo ingin memastikan bahwa developernya memiliki akses terbatas ke instance VM yang beroperasi pada data sensitif. Untuk mencapai tujuan ini, instance VM yang sensitif terhadap data diberi nama dengan awalan sensitiveAccess, dan instance VM lainnya diberi nama dengan awalan devAccess. Kemudian, binding peran bersyarat digunakan untuk memastikan bahwa developer dapat tetap produktif dengan instance VM devAccess normal tanpa memberi mereka akses ke instance VM sensitiveAccess.

Meskipun Anda dapat menggunakan atribut kondisi resource.name saja untuk mengelola akses, menggunakan atribut resource.type dan resource.service juga umum dilakukan. Saat Anda menggunakan atribut tambahan, kecil kemungkinannya bahwa suatu kondisi akan memengaruhi akses ke berbagai jenis resource dengan nama serupa. Contoh di bagian ini mengontrol akses menggunakan atribut resource.name dan resource.type.

Untuk memberikan akses berdasarkan awalan nama ke disk dan instance Compute Engine dalam sebuah project:

Konsol

  1. Di konsol Google Cloud, buka halaman IAM.

    Buka halaman IAM

  2. Dari daftar akun utama, temukan akun utama yang diinginkan, lalu klik tombol .

  3. Dari panel Izin edit, temukan peran yang diinginkan untuk mengonfigurasi kondisi. Kemudian, di bagian IAM condition (opsional), klik Tambahkan IAM condition.

  4. Di panel Edit kondisi, masukkan judul dan deskripsi opsional untuk kondisi tersebut.

  5. Anda dapat menambahkan ekspresi kondisi menggunakan Pembuat Kondisi atau Editor Kondisi. Pembuat kondisi menyediakan antarmuka interaktif untuk memilih jenis kondisi, operator, dan detain lain yang berlaku terkait ekspresi yang Anda inginkan. Editor kondisi menyediakan antarmuka berbasis teks untuk memasukkan ekspresi secara manual menggunakan sintaksis CEL.

    Pembuat Kondisi:

    1. Klik menu drop-down Tambahkan, lalu klik Kondisi yang dikelompokkan.
    2. Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
    3. Dari menu drop-down Operator, pilih adalah.
    4. Dari menu drop-down Jenis Resource, pilih compute.googleapis.com/Disk.
    5. Klik tombol Tambahkan pertama yang berada tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
    6. Dari menu drop-down Jenis kondisi, pilih Resource > Nama.
    7. Dari menu drop-down Operator, pilih Mulai dengan.
    8. Pada kolom Nilai, masukkan nama resource dengan format yang sesuai, seperti projects/project-123/zones/us-central1-a/disks/devAccess untuk disk yang namanya diawali dengan devAccess.
    9. Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
    10. Klik tombol Tambahkan yang berada tepat di atas tombol Simpan untuk menambahkan kumpulan kondisi lainnya yang dikelompokkan.
    11. Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
    12. Dari menu drop-down Operator, pilih adalah.
    13. Dari menu drop-down Jenis resource, pilih compute.googleapis.com/Instance.
    14. Klik tombol Tambahkan pertama tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
    15. Dari menu drop-down Jenis kondisi, pilih Resource > Nama.
    16. Dari menu drop-down Operator, pilih Mulai dengan.
    17. Pada kolom Nilai, masukkan nama resource dengan format yang sesuai, seperti projects/project-123/zones/us-central1-a/instances/devAccess untuk instance yang namanya diawali dengan devAccess.
    18. Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
    19. Klik tombol Tambahkan yang berada tepat di atas tombol Simpan untuk menambahkan kumpulan kondisi ketiga yang dikelompokkan.
    20. Untuk memastikan agar kondisi ini tidak memengaruhi resource lainnya, tambahkan juga klausa berikut ini: Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
    21. Dari menu drop-down Operator, pilih bukan.
    22. Dari menu drop-down Jenis Resource, pilih compute.googleapis.com/Disk.
    23. Klik tombol Tambahkan pertama tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
    24. Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
    25. Dari menu drop-down Operator, pilih bukan.
    26. Dari menu drop-down Jenis resource, pilih compute.googleapis.com/Instance.
    27. Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
    28. Setelah selesai, pembuat kondisi akan terlihat seperti berikut:

    29. Klik Simpan untuk menerapkan kondisi.

    30. Setelah panel Edit kondisi ditutup, klik kembali tombol Simpan dari panel Izin edit untuk memperbarui kebijakan izin.

    Editor Kondisi:

    1. Klik tab Editor Kondisi dan masukkan ekspresi berikut:

      (resource.type == "compute.googleapis.com/Disk" &&
      resource.name.startsWith("projects/project-123/regions/us-central1/disks/devAccess")) ||
      (resource.type == "compute.googleapis.com/Instance" &&
      resource.name.startsWith("projects/project-123/zones/us-central1-a/instances/devAccess")) ||
      (resource.type != "compute.googleapis.com/Disk" &&
      resource.type != "compute.googleapis.com/Instance")
    2. Setelah memasukkan ekspresi, Anda dapat memilih untuk melakukan linting pada sintaksis CEL dengan mengklik Jalankan Linter di atas kotak teks di sebelah kanan atas.

    3. Klik Simpan untuk menerapkan kondisi.

    4. Setelah panel Edit kondisi ditutup, klik kembali tombol Simpan dari panel Izin edit untuk memperbarui kebijakan izin.

gcloud

Kebijakan izin ditetapkan menggunakan pola baca-ubah-tulis.

Jalankan perintah gcloud projects get-iam-policy guna mendapatkan kebijakan izin saat ini untuk project. Pada contoh berikut, versi JSON dari kebijakan izin didownload ke jalur pada disk.

Perintah:

gcloud projects get-iam-policy project-id --format=json > filepath

Format JSON dari kebijakan izin didownload:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 1
}

Untuk mengonfigurasi kebijakan izin dengan kondisi awalan nama resource, tambahkan ekspresi kondisi yang ditandai berikut. gcloud CLI memperbarui versi secara otomatis:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin",
      "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

Selanjutnya, tetapkan kebijakan izin baru dengan menjalankan perintah gcloud projects set-iam-policy:

gcloud projects set-iam-policy project-id filepath

Binding peran bersyarat yang baru akan memberikan izin devs@example.com dengan cara berikut:

  • Semua izin disk dan instance hanya diberikan jika nama resource diawali dengan devAccess.

  • Semua izin lain dalam peran Admin Instance diberikan untuk semua jenis resource lainnya

REST

Gunakan pola baca-ubah-tulis untuk mengizinkan akses ke resource tertentu.

Pertama, baca kebijakan izin untuk project:

Metode projects.getIamPolicy Resource Manager API mendapatkan kebijakan izin project.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

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

Metode HTTP dan URL:

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

Meminta isi JSON:

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

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan melihat respons JSON seperti berikut:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ]
}

Selanjutnya, ubah kebijakan izin agar mengizinkan akses ke resource tertentu. Pastikan untuk mengubah kolom version menjadi nilai 3:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/compute.instanceAdmin",
      "members": [
        "group:devs@example.com"
      ],
      "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ]
}

Terakhir, tulis kebijakan izin yang telah diperbarui:

Metode projects.setIamPolicy Resource Manager API menetapkan kebijakan izin dalam permintaan sebagai kebijakan izin baru project.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

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

Metode HTTP dan URL:

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

Meminta isi JSON:

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/compute.instanceAdmin",
        "members": [
          "group:devs@example.com"
        ],
        "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
        }
      }
    ]
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Respons berisi kebijakan izin yang telah diperbarui.


Mengekstrak nilai dari nama resource

Contoh sebelumnya menunjukkan perbandingan boolean antara nama resource, atau awal nama resource, dan nilai lainnya. Namun, dalam beberapa kasus, Anda mungkin perlu membandingkan nilai dengan bagian tertentu dari nama resource yang tidak berada di awal nama.

Anda dapat menggunakan fungsi extract() dan menentukan template ekstraksi untuk mengekstrak bagian nama resource yang relevan menjadi string. Jika perlu, Anda dapat mengonversi string yang telah diekstrak ke jenis lain, seperti stempel waktu. Setelah mengekstrak nilai dari nama resource, Anda dapat membandingkan nilai tersebut dengan nilai lainnya.

Contoh berikut menunjukkan ekspresi kondisi yang menggunakan fungsi extract(). Untuk mengetahui detail tentang fungsi extract(), lihat Referensi atribut IAM Condition.

Contoh: Mencocokkan pesanan dari 30 hari terakhir

Misalnya, Anda menyimpan informasi pesanan di beberapa bucket Cloud Storage, dan objek di setiap bucket diatur berdasarkan tanggal. Nama objek yang umum digunakan akan mirip dengan contoh berikut:

projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/order_date=2019-11-03/aef87g87ae0876

Anda ingin mengizinkan akun utama untuk mengakses pesanan apa pun dari 30 hari terakhir. Kondisi berikut cocok dengan objek Cloud Storage untuk pesanan ini. Kondisi ini menggunakan fungsi duration() dan date() untuk mengurangi 30 hari (2.592.000 detik) dari waktu permintaan, lalu membandingkan stempel waktu tersebut dengan tanggal pesanan:

resource.type == 'storage.googleapis.com/Object' &&
  request.time - duration('2592000s') < date(resource.name.extract('/order_date={date_str}/'))

Untuk mengetahui detail tentang fungsi date() danduration(), lihat referensi atribut tanggal/waktu.

Contoh: Mencocokkan VM Compute Engine di lokasi mana pun

Misalnya, Anda ingin memberikan peran level project ke sebuah akun utama untuk semua VM Compute Engine yang namanya diawali dengan dev-, terlepas dari lokasi VM. Anda juga ingin agar akun utama tersebut dapat menggunakan peran yang diinginkan semua jenis resource lainnya.

Nama resource untuk VM menggunakan format yang mirip dengan projects/project-id/zones/zone-id/instances/instance-name. Kondisi berikut bernilai true untuk VM dengan nama instance yang diawali dengan string dev-, dan untuk semua jenis resource selain VM:

resource.type != 'compute.googleapis.com/Instance' ||
  resource.name.extract('/instances/{name}').startsWith('dev-')

Teks dalam tanda kurung kurawal mengidentifikasi bagian nama resource yang diekstrak untuk perbandingan. Dalam contoh ini, template ekstraksi mengekstrak semua karakter setelah kemunculan pertama string /instances/.

Pertimbangan penggunaan yang penting untuk kondisi berbasis resource

Saat menambahkan kondisi berbasis resource, penting untuk mempertimbangkan pengaruh kondisi tersebut terhadap izin akun utama.

Peran khusus

Pertimbangkan contoh berikut, yang melibatkan peran khusus. Admin ingin membuat peran khusus yang memberikan akses untuk membuat instance VM, tetapi hanya mengizinkan pengguna untuk membuat instance VM dalam project dengan nama resource yang diawali dengan staging, menggunakan disk dengan awalan nama yang sama.

Untuk mencapai sasaran ini, pastikan peran yang diberikan berisi izin yang diperlukan untuk membuat instance VM, yang berarti izin pada jenis resource instance dan disk. Kemudian, pastikan bahwa ekspresi kondisi memeriksa nama resource untuk kedua disk dan instance. Selain dua jenis ini, izin lain dalam peran tersebut tidak akan diberikan.

Ekspresi kondisi berikut akan menghasilkan perilaku yang tidak terduga. Izin untuk beroperasi pada VM Computer Engine diblokir:

resource.type == 'compute.googleapis.com/Disk' &&
 resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')

Ekspresi kondisi berikut mencakup disk dan instance, dan akan mengelola akses berdasarkan nama resource untuk kedua jenis ini:

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging'))

Ekspresi kondisi berikut mencakup disk dan instance, dan akan mengelola akses berdasarkan nama resource untuk kedua jenis ini. Untuk jenis resource lainnya, ekspresi kondisi memberikan peran apa pun terlepas dari nama resource-nya:

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')

Izin khusus induk

Dalam hierarki resource Google Cloud, beberapa izin dalam peran yang memengaruhi resource turunan dimaksudkan untuk diberlakukan hanya pada level induk. Misalnya, agar dapat mencantumkan kunci kripto untuk Cloud KMS, pengguna harus diberi izin cloudkms.cryptokeys.list pada key ring yang berisi kunci kriptografis, bukan kunci lainnya. Jenis izin ini disebut izin khusus induk, dan hanya berlaku untuk operasi list.

Untuk memberikan akses dengan benar ke izin *.*.list saat menggunakan kondisi, ekspresi kondisi harus menetapkan atribut resource.service dan resource.type sesuai dengan jenis resource induk dari resource target yang akan dicantumkan.

Perhatikan contoh berikut: Dengan menggunakan contoh Compute Engine di atas, ekspresi berikut mencegah akses ke izin compute.disks.list dan compute.instances.list karena resource yang izinnya diperiksa memiliki nilai atribut resource.type dari cloudresourcemanager.googleapis.com/Project.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess'))

Biasanya, izin list ini diberikan bersama dengan izin lain untuk operasi reguler pada resource. Dalam hal ini, untuk meningkatkan cakupan pemberian, Anda dapat memperluas cakupan untuk jenis cloudresourcemanager.googleapis.com/Project saja, atau memperluas cakupan untuk semua izin lain yang bukan merupakan jenis instance atau disk.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
 resource.type == 'cloudresourcemanager.googleapis.com/Project'

atau

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')