Halaman ini menjelaskan fitur Ketentuan Identity and Access Management (IAM). Anda dapat menggunakan Ketentuan IAM untuk menentukan dan menerapkan kontrol akses berbasis atribut bersyarat untuk resource Google Cloud.
Dengan Ketentuan IAM, Anda dapat memilih untuk memberikan akses ke akun utama hanya jika kondisi tertentu terpenuhi. Misalnya, Anda dapat memberikan akses sementara kepada pengguna sehingga mereka dapat menyelesaikan masalah produksi, atau Anda dapat memberikan akses hanya kepada karyawan yang membuat permintaan dari kantor perusahaan Anda.
Conditions ditentukan dalam binding peran kebijakan izinkan resource. Jika
suatu kondisi terjadi, permintaan akses hanya diberikan jika ekspresi
kondisi bernilai true
. Setiap ekspresi kondisi adalah kumpulan pernyataan
logika yang menentukan satu atau beberapa atribut untuk diperiksa.
Izinkan kebijakan dengan ketentuan
Izinkan kebijakan berisi satu atau beberapa binding peran, yang memiliki struktur berikut:
"bindings": [ { "role": ..., "members": ..., "condition": ... }, ... ]
Objek condition
bersifat opsional, dan setiap binding peran dapat berisi nol atau
satu kondisi. Jika binding peran tidak memiliki objek condition
, akun
utama dalam binding peran tersebut selalu memiliki peran yang ditentukan pada resource.
Hanya beberapa jenis resource yang menerima kondisi dalam binding peran. Namun, Anda dapat memberikan akses bersyarat ke jenis resource lain dengan memberikan peran di level organisasi atau project.
Objek condition
memiliki struktur berikut:
"condition": { "title": ..., "description": ..., "expression": ... }
title
kondisi bersifat wajib, tetapi description
bersifat opsional. Judul
dan deskripsi hanyalah kolom informasi untuk membantu Anda mengidentifikasi dan
mendeskripsikan kondisi.
Kolom expression
wajib diisi. Kode ini menentukan ekspresi logika berbasis atribut
menggunakan subset Common Expression Language (CEL).
Ekspresi kondisi dapat berisi beberapa pernyataan; setiap pernyataan
mengevaluasi satu atribut. Pernyataan digabungkan menggunakan operator logis,
dengan mengikuti spesifikasi bahasa CEL.
Untuk mempelajari cara menambahkan, mengubah, dan menghapus binding peran bersyarat, lihat Mengelola binding peran bersyarat.
CEL untuk kondisi
Common Expression Language, atau CEL, adalah bahasa ekspresi yang digunakan untuk menentukan ekspresi dalam Ketentuan IAM. Ini disesuaikan untuk mengekspresikan ekspresi logika berbasis atribut. Untuk informasi selengkapnya, lihat spesifikasi CEL dan definisi bahasanya.
Dalam Ketentuan IAM, subset CEL digunakan untuk membuat keputusan otorisasi
boolean berdasarkan data atribut. Secara umum, ekspresi
kondisi terdiri dari satu atau beberapa pernyataan yang digabungkan dengan maksimal
12 operator logis (&&
, ||
, atau !
). Setiap
pernyataan menyatakan aturan kontrol berbasis atribut yang berlaku pada binding
peran, dan pada akhirnya menentukan apakah akses diizinkan.
Ketentuan IAM menggunakan fitur CEL berikut:
- Variabel: Kondisi menggunakan variabel untuk menyatakan atribut tertentu, seperti
request.time
(dari jenis Stempel Waktu) atauresource.name
(dari jenis String). Variabel ini diisi dengan nilai berdasarkan konteks saat runtime. - Operator: Setiap jenis data, seperti Stempel Waktu atau String, mendukung sekumpulan
operator yang dapat digunakan untuk membuat ekspresi logika. Paling umum,
operator digunakan untuk membandingkan nilai yang terdapat dalam variabel dengan nilai
literal, seperti
resource.service == "compute.googleapis.com"
. Dalam contoh ini, jika nilai inputresource.service
adalahcompute.googleapis.com
, maka ekspresi akan bernilaitrue
. - Fungsi: Fungsi adalah operator "gabungan" untuk jenis data yang mendukung
operasi yang lebih kompleks. Dalam ekspresi kondisi, ada fungsi yang telah ditetapkan
sebelumnya yang dapat digunakan dengan jenis data tertentu. Misalnya,
request.path.startsWith("/finance")
menggunakan fungsi pencocokan awalan String, dan bernilaitrue
jika nilairequest.path
berisi awalan yang cocok, seperti "/finance". - Operator logis: Kondisi mendukung tiga operator logis yang dapat
digunakan untuk membuat ekspresi logika kompleks dari pernyataan ekspresi sederhana:
&&
,||
, dan!
. Operator logis ini memungkinkan penggunaan beberapa variabel input dalam ekspresi kondisi. Misalnya:request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com"
menggabungkan dua pernyataan sederhana, dan mengharuskan kedua pernyataan tersebut terpenuhi untuk menghasilkan hasil evaluasi keseluruhantrue
.
Untuk informasi selengkapnya tentang variabel, operator, dan fungsi yang didukung, lihat referensi atribut.
Atribut kondisi
Atribut kondisi didasarkan pada resource yang diminta, misalnya, jenis atau namanya, atau berdasarkan detail tentang permintaan, misalnya, stempel waktu atau alamat IP tujuannya.
Atribut resource
Anda dapat menggunakan atribut resource untuk menulis kondisi yang mengevaluasi resource dalam permintaan akses. Atribut yang dapat Anda evaluasi meliputi hal berikut:
- Jenis resource
- Nama resource
- Layanan Google Cloud yang digunakan
- Tag yang dilampirkan ke resource
Untuk mengetahui daftar lengkap atribut resource, lihat referensi atribut resource.
Untuk mempelajari cara menggunakan atribut resource guna mengonfigurasi akses berbasis resource, lihat Mengonfigurasi akses berbasis resource.
Contoh ekspresi
Izinkan akses ke instance VM Compute Engine, tetapi jangan izinkan jenis resource lainnya:
resource.type == "compute.googleapis.com/Instance"
Izinkan akses ke resource Cloud Storage, tetapi jangan izinkan akses ke resource layanan lainnya:
resource.service == "storage.googleapis.com"
Izinkan akses hanya ke objek Cloud Storage di dalam bucket tertentu:
resource.type == "storage.googleapis.com/Object" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets/")
Izinkan akses ke resource Google Cloud yang memiliki tag env: prod
:
resource.matchTag('123456789012/env', 'prod')
Atribut permintaan
Anda dapat menggunakan atribut permintaan untuk menulis kondisi yang mengevaluasi detail tentang permintaan, seperti berikut ini:
- Tingkat akses
- Tanggal dan waktu
- Port dan alamat IP tujuan (untuk tunneling TCP IAP)
- Host/jalur URL yang diharapkan (untuk IAP)
Contoh ekspresi tingkat akses (hanya untuk IAP)
Dalam contoh berikut, organisasi menentukan tingkat akses, CorpNet
,
yang membatasi akses ke rentang alamat IP tempat traffic masuk dan keluar dari
jaringan perusahaan. Akses hanya diizinkan jika permintaan memenuhi
tingkat akses CorpNet
:
"accessPolicies/199923665455/accessLevels/CorpNet" in
request.auth.access_levels
Organisasi Anda menentukan tingkat akses berdasarkan atribut permintaan, seperti alamat IP asal, atribut perangkat, waktu, dan lainnya. Untuk mengetahui detail selengkapnya, lihat dokumentasi Access Context Manager.
Contoh ekspresi atribut API
Izinkan pengguna memberikan dan mencabut hanya peran Billing Account Administrator
(roles/billing.admin
):
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
.hasOnly(['roles/billing.admin'])
Untuk mempelajari lebih lanjut cara menggunakan atribut API guna membatasi pemberian peran, lihat Menetapkan batas pemberian peran.
Contoh ekspresi tanggal/waktu
Izinkan akses sementara hingga tanggal/waktu habis masa berlaku yang ditentukan:
request.time < timestamp("2021-01-01T00:00:00Z")
Izinkan akses hanya selama jam kerja yang ditentukan, berdasarkan zona waktu untuk Berlin, Jerman:
request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5
Izinkan akses hanya untuk bulan dan tahun tertentu, berdasarkan zona waktu untuk Berlin, Jerman:
request.time.getFullYear("Europe/Berlin") == 2020
request.time.getMonth("Europe/Berlin") < 6
Untuk menentukan stempel waktu, gunakan format RFC 3339. Untuk menentukan zona waktu, gunakan ID di Database Zona Waktu IANA.
Untuk detail selengkapnya tentang ekspresi tanggal/waktu, lihat spesifikasi CEL.
Untuk mempelajari cara menggunakan ekspresi tanggal/waktu guna mengonfigurasi akses sementara, lihat Mengonfigurasi akses sementara.
Contoh ekspresi IP/port tujuan (untuk tunneling TCP IAP)
Izinkan akses ke alamat IP tujuan internal atau nomor port:
destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23
Contoh ekspresi aturan penerusan
Izinkan akses untuk akun utama jika permintaan tidak membuat aturan penerusan, atau jika permintaan tersebut membuat aturan penerusan untuk load balancer Google Cloud internal:
!compute.isForwardingRuleCreationOperation() || (
compute.isForwardingRuleCreationOperation() &&
compute.matchLoadBalancingSchemes([
'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
])
)
Contoh ekspresi host/jalur URL (untuk IAP)
Izinkan akses hanya untuk subdomain atau jalur URL tertentu dalam permintaan:
request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")
Untuk mengetahui detail tentang skema load balancing, lihat Menggunakan Ketentuan IAM pada load balancer Google Cloud.
Contoh ekspresi dengan berbagai jenis atribut
Izinkan akses jika permintaan dibuat selama waktu tertentu, mencocokkan awalan nama resource, dengan tingkat akses yang diinginkan, dan untuk jenis resource tertentu:
request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
(resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
"accessPolicies/34569256/accessLevels/CorpNet" in request.auth.access_levels)) ||
resource.type != "compute.googleapis.com/Instance")
Langkah selanjutnya
- Dapatkan detail tentang atribut kondisi yang dapat Anda gunakan untuk mengelola akses.
- Pelajari lebih lanjut tentang kebijakan izin.
- Temukan jenis resource yang menerima binding peran bersyarat.