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
Di konsol Google Cloud, buka halaman IAM.
Dari daftar akun utama, temukan akun utama yang diinginkan, lalu klik tombol
.Dari panel Izin edit, temukan peran yang diinginkan untuk mengonfigurasi kondisi. Kemudian, di bagian IAM condition (opsional), klik Tambahkan IAM condition.
Di panel Edit kondisi, masukkan judul dan deskripsi opsional untuk kondisi tersebut.
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:
- Klik menu drop-down Tambahkan, lalu klik Kondisi yang dikelompokkan.
- Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
- Dari menu drop-down Operator, pilih adalah.
- Dari menu drop-down Jenis Resource, pilih compute.googleapis.com/Disk.
- Klik tombol Tambahkan pertama yang berada tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
- Dari menu drop-down Jenis kondisi, pilih Resource > Nama.
- Dari menu drop-down Operator, pilih Mulai dengan.
- 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 dengandevAccess
. - Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
- Klik tombol Tambahkan yang berada tepat di atas tombol Simpan untuk menambahkan kumpulan kondisi lainnya yang dikelompokkan.
- Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
- Dari menu drop-down Operator, pilih adalah.
- Dari menu drop-down Jenis resource, pilih compute.googleapis.com/Instance.
- Klik tombol Tambahkan pertama tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
- Dari menu drop-down Jenis kondisi, pilih Resource > Nama.
- Dari menu drop-down Operator, pilih Mulai dengan.
- 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 dengandevAccess
. - Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
- Klik tombol Tambahkan yang berada tepat di atas tombol Simpan untuk menambahkan kumpulan kondisi ketiga yang dikelompokkan.
- Untuk memastikan agar kondisi ini tidak memengaruhi resource lainnya, tambahkan juga klausa berikut ini: Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
- Dari menu drop-down Operator, pilih bukan.
- Dari menu drop-down Jenis Resource, pilih compute.googleapis.com/Disk.
- Klik tombol Tambahkan pertama tepat di bawah kondisi yang baru saja Anda masukkan untuk menambahkan klausa lain ke ekspresi.
- Dari menu drop-down Jenis kondisi, pilih Resource > Jenis.
- Dari menu drop-down Operator, pilih bukan.
- Dari menu drop-down Jenis resource, pilih compute.googleapis.com/Instance.
- Di sebelah kiri masing-masing jenis kondisi, klik Dan untuk memastikan bahwa kedua klausa sudah benar.
Setelah selesai, pembuat kondisi akan terlihat seperti berikut:
Klik Simpan untuk menerapkan kondisi.
Setelah panel Edit kondisi ditutup, klik kembali tombol Simpan dari panel Izin edit untuk memperbarui kebijakan izin.
Editor Kondisi:
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")
Setelah memasukkan ekspresi, Anda dapat memilih untuk melakukan linting pada sintaksis CEL dengan mengklik Jalankan Linter di atas kotak teks di sebelah kanan atas.
Klik Simpan untuk menerapkan kondisi.
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, sepertimy-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, sepertimy-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')