Ringkasan Ketentuan IAM

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) atau resource.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 input resource.service adalah compute.googleapis.com, maka ekspresi akan bernilai true.
  • 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 bernilai true jika nilai request.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 keseluruhan true.

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