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.
Kondisi dan jenis kebijakan
Anda dapat menggunakan kondisi di tempat berikut:
- Kebijakan izin
- Kebijakan tolak
- Binding kebijakan untuk kebijakan batas akses akun utama
Bagian berikut menjelaskan cara menggunakan kondisi di setiap tempat ini untuk menerapkan kontrol akses berbasis atribut.
Kondisi dalam kebijakan izin
Anda dapat menggunakan kondisi di kebijakan izin untuk memilih 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 jaringan perusahaan Anda.
Conditions ditentukan dalam binding peran kebijakan izinkan resource. Jika
binding peran memiliki kondisi, akun utama dalam peran hanya akan diberi
peran jika ekspresi kondisi bernilai true
.
Untuk menambahkan kondisi ke binding peran, Anda harus menentukan kolom condition
:
"bindings": [ { "role": "ROLE", "members": [ "MEMBER_1", "MEMBER_2" ], "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } ]
Untuk mempelajari kolom dalam kondisi lebih lanjut, lihat Struktur kondisi di halaman ini.
Hanya beberapa jenis resource yang menerima kondisi dalam binding peran. Namun, Anda dapat memberikan akses bersyarat ke jenis resource lainnya dengan memberikan peran di tingkat organisasi atau project.
Sebagai praktik terbaik, jangan tambahkan lebih dari 100 binding peran bersyarat ke satu kebijakan izinkan. Jika menggunakan binding peran bersyarat dalam jumlah yang lebih besar, Anda dapat melebihi batas ukuran keseluruhan untuk kebijakan izin.
Untuk mempelajari cara menambahkan, mengubah, dan menghapus binding peran bersyarat, lihat Mengelola binding peran bersyarat.
Kondisi dalam kebijakan tolak
Anda dapat menggunakan kondisi dalam kebijakan tolak untuk menerapkan aturan tolak
hanya jika kondisi tertentu terpenuhi. Misalnya, Anda dapat menolak izin
hanya jika resource yang coba diakses akun utama diberi tag sebagai bagian
dari lingkungan prod
.
Kondisi ditentukan dalam aturan tolak dalam kebijakan tolak resource. Jika
kondisi bernilai true
atau tidak dapat dievaluasi, aturan tolak akan berlaku dan
akun utama tidak dapat menggunakan izin yang ditentukan. Jika kondisi
bernilai false
, aturan tolak tidak akan berlaku dan akun utama dapat menggunakan
izin yang ditentukan jika memiliki izin tersebut.
Untuk menambahkan kondisi ke aturan tolak, Anda menentukan kolom denialCondition
:
"rules": [ { "denyRule": { "deniedPrincipals": [ "PRINCIPAL_1", "PRINCIPAL_2" ], "exceptionPrincipals": [ "EXCEPTION_PRINCIPAL_1", "EXCEPTION_PRINCIPAL_2" ], "deniedPermissions": [ "DENIED_PERMISSION_1", "DENIED_PERMISSION_2" ], "denialCondition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } } ]
Untuk mempelajari kolom dalam kondisi lebih lanjut, lihat Struktur kondisi di halaman ini.
Untuk mempelajari cara membuat dan mengelola kebijakan tolak, lihat Menolak akses.
Kondisi dalam binding kebijakan batas akses akun utama
Anda dapat menggunakan kondisi dalam binding kebijakan untuk kebijakan batas akses
utama guna menyaring kumpulan akun utama yang
diterapkan kebijakan batas akses utama. Misalnya, Anda hanya dapat menerapkan
kebijakan untuk akun layanan, atau mengecualikan super-admin@example.com
dari kebijakan.
Kondisi ditentukan dalam setiap binding kebijakan. Jika binding kebijakan memiliki
kondisi, kebijakan dalam binding kebijakan hanya diterapkan jika
kondisi bernilai true
.
Untuk menambahkan kondisi ke binding kebijakan, Anda menentukan kolom condition
dalam
binding kebijakan:
{ "displayName": "DISPLAY_NAME", "target": { "principalSet": "PRINCIPAL_SET" }, "policyKind": "PRINCIPAL_ACCESS_BOUNDARY", "policy": "PAB_POLICY", "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } }
Untuk mempelajari kolom dalam kondisi lebih lanjut, lihat Struktur kondisi di halaman ini.
Untuk mempelajari cara membuat binding kebijakan untuk kebijakan batas akses akun utama, lihat Menerapkan kebijakan batas akses akun utama ke kumpulan akun utama.
Struktur kondisi
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.
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 operator
logis (&&
, ||
, atau !
).
Kondisi dalam IAM Conditions 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 logika: Kondisi mendukung tiga operator logika yang dapat
digunakan untuk membuat ekspresi logika kompleks dari pernyataan ekspresi dasar:
&&
,||
, 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 dasar, 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 kondisi yang dapat Anda gunakan dalam ekspresi kondisi bergantung pada jenis kebijakan yang kondisinya Anda tulis. Untuk mengetahui daftar lengkap atribut kondisi dan informasi selengkapnya tentang atribut yang didukung untuk setiap jenis kebijakan, lihat referensi atribut.
Bagian berikut menunjukkan contoh beberapa atribut yang dapat Anda gunakan dalam kondisi.
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
Dalam binding peran, ekspresi kondisi berikut mengizinkan akses ke instance VM Compute Engine, tetapi tidak mengizinkan jenis resource lainnya:
resource.type == 'compute.googleapis.com/Instance'
Dalam binding peran, ekspresi kondisi berikut mengizinkan akses ke resource Cloud Storage, tetapi tidak mengizinkan akses ke resource layanan lainnya:
resource.service == 'storage.googleapis.com'
Dalam binding peran, ekspresi kondisi berikut hanya mengizinkan akses ke objek Cloud Storage di dalam bucket tertentu:
resource.type == 'storage.googleapis.com/Object' &&
resource.name.startsWith('projects/_/buckets/exampleco-site-assets/')
Dalam aturan tolak, ekspresi kondisi berikut menolak akses ke
resource Google Cloud yang memiliki tag env: prod
:
resource.matchTag('123456789012/env', 'prod')
Atribut utama
Atribut akun utama memungkinkan Anda menulis kondisi berdasarkan akun utama yang mengeluarkan permintaan. Atribut yang dapat Anda evaluasi meliputi:
- Jenis akun utama dalam permintaan
- Identitas akun utama dalam permintaan
Untuk mengetahui detailnya, lihat referensi atribut kondisi.
Contoh ekspresi
Dalam binding kebijakan batas akses akun utama, ekspresi kondisi berikut memastikan bahwa kebijakan dalam binding hanya diterapkan untuk akun layanan:
principal.type == 'iam.googleapis.com/ServiceAccount'
Dalam binding kebijakan batas akses akun utama, ekspresi kondisi berikut
memastikan bahwa kebijakan dalam binding tidak diterapkan untuk
super-admin@example.com
:
principal.subject != 'super-admin@example.com'
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 atau jalur URL yang diharapkan (untuk IAP)
Contoh ekspresi tingkat akses (hanya untuk IAP)
Dalam contoh berikut, organisasi Anda menentukan tingkat akses, CorpNet
,
yang membatasi akses ke rentang alamat IP tempat traffic masuk dan keluar dari
jaringan perusahaan. Kemudian, Anda menambahkan ekspresi kondisi berikut ke binding
peran untuk mengizinkan akses hanya 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
Dalam binding peran untuk peran dengan izin iam.projects.setIamPolicy
, ekspresi kondisi berikut memungkinkan pengguna memberikan dan mencabut
hanya peran Billing Account Administrator (roles/billing.admin
) di
project:
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
Dalam binding peran, ekspresi kondisi berikut memungkinkan akses hingga tengah malam pada 1 Januari 2021:
request.time < timestamp('2021-01-01T00:00:00Z')
Dalam binding peran, ekspresi kondisi berikut hanya mengizinkan akses 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') <= '
Dalam binding peran, ekspresi kondisi berikut hanya mengizinkan akses untuk Juni 2020, 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 dan port tujuan (untuk tunneling TCP IAP)
Dalam binding peran, ekspresi kondisi berikut mengizinkan 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
Dalam penetapan peran, ekspresi kondisi berikut mengizinkan 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'
])
)
Untuk mengetahui detail tentang skema load balancing, lihat Menggunakan Ketentuan IAM pada load balancer Google Cloud.
Contoh ekspresi host atau jalur URL (untuk IAP)
Dalam binding peran, ekspresi kondisi berikut hanya mengizinkan akses 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')
Contoh ekspresi dengan berbagai jenis atribut
Dalam binding peran, ekspresi kondisi berikut mengizinkan akses jika permintaan dibuat selama waktu tertentu, mencocokkan awalan nama resource, dengan tingkat akses yang dipilih, 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.