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 .

Kondisi dan jenis kebijakan

Anda dapat menggunakan kondisi di tempat berikut:

  • Binding peran kebijakan izinkan, termasuk binding peran yang dikelola oleh hak Privileged Access Manager
  • Aturan kebijakan penolakan
  • Binding kebijakan untuk kebijakan Principal Access Boundary

Bagian berikut menjelaskan cara menggunakan kondisi di setiap tempat ini untuk menerapkan kontrol akses berbasis atribut.

Kondisi dalam kebijakan izinkan

Anda dapat menggunakan kondisi dalam kebijakan izinkan 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 diberikan peran jika ekspresi kondisi bernilai true.

Untuk menambahkan kondisi ke binding peran, Anda menentukan kolom condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]
Jika Anda menggunakan hak Privileged Access Manager, Anda juga dapat menambahkan kondisi ke peran dalam hak tersebut. Saat pengguna berhasil meminta pemberian hak tersebut, mereka akan diberikan peran dengan kondisi yang ditentukan.

Untuk mempelajari lebih lanjut kolom dalam kondisi, 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 lain 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 izinkan.

Untuk mempelajari cara menambahkan, mengubah, dan menghapus binding peran bersyarat, lihat Mengelola binding peran bersyarat.

Kondisi dalam kebijakan penolakan

Anda dapat menggunakan kondisi dalam kebijakan penolakan untuk menerapkan aturan penolakan 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.

Conditions ditentukan dalam aturan penolakan dalam kebijakan penolakan resource. Jika kondisi bernilai true atau tidak dapat dievaluasi, aturan penolakan akan berlaku dan akun utama tidak dapat menggunakan izin yang ditentukan. Jika kondisi bernilai false, aturan penolakan tidak akan berlaku dan akun utama dapat menggunakan izin yang ditentukan jika memiliki izin tersebut.

Kondisi dalam kebijakan penolakan memiliki struktur yang sama dengan kondisi dalam kebijakan izinkan namun, kondisi tersebut hanya mengenali fungsi tag resource.

Untuk menambahkan kondisi ke aturan penolakan, 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 lebih lanjut kolom dalam kondisi, lihat Struktur kondisi di halaman ini.

Untuk mempelajari cara membuat dan mengelola kebijakan penolakan, lihat Menolak akses.

Kondisi dalam binding kebijakan Principal Access Boundary

Anda dapat menggunakan kondisi dalam binding kebijakan untuk kebijakan Principal Access Boundaryguna menyaring kumpulan akun utama yang diterapkan kebijakan Principal Access Boundary. Misalnya, Anda hanya dapat menerapkan kebijakan untuk akun layanan, atau mengecualikan super-admin@example.com dari kebijakan.

Conditions ditentukan dalam setiap binding kebijakan. Jika binding kebijakan memiliki kondisi, kebijakan dalam binding kebijakan hanya akan 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 lebih lanjut kolom dalam kondisi, lihat Struktur kondisi di halaman ini.

Untuk mempelajari cara membuat binding kebijakan untuk kebijakan Principal Access Boundary, lihat Menerapkan kebijakan Principal Access Boundary 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 IAM Conditions. 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 !).

Setiap pernyataan menyatakan aturan kontrol berbasis atribut, dan pada akhirnya menentukan apakah binding peran, aturan penolakan, atau binding kebijakan berlaku.

Kondisi dalam IAM Conditions 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 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 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 kondisi yang dapat Anda gunakan dalam ekspresi kondisi bergantung pada jenis kebijakan yang Anda tulis kondisinya. 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

Anda dapat menggunakan salah satu atribut ini dalam binding peran kebijakan izinkan. Selain itu, Anda dapat menggunakan atribut tag resource dalam aturan penolakan kebijakan penolakan.

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 penolakan, ekspresi kondisi berikut menolak akses ke Google Cloud resource yang memiliki tag env: prod:

resource.matchTag('123456789012/env', 'prod')

Atribut akun utama

Atribut akun utama memungkinkan Anda menulis kondisi berdasarkan akun utama yang mengeluarkan permintaan. Atribut yang dapat Anda evaluasi meliputi hal berikut:

  • Jenis akun utama dalam permintaan
  • Identitas akun utama dalam permintaan

Anda dapat menggunakan atribut ini dalam binding kebijakan untuk kebijakan Principal Access Boundary.

Untuk mengetahui detailnya, lihat referensi atribut kondisi.

Contoh ekspresi

Dalam binding kebijakan Principal Access Boundary, ekspresi kondisi berikut memastikan bahwa kebijakan dalam binding hanya diterapkan untuk akun layanan:

principal.type == 'iam.googleapis.com/ServiceAccount'

Dalam binding kebijakan Principal Access Boundary, 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)

Anda dapat menggunakan atribut ini dalam binding peran kebijakan izinkan.

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 mengizinkan akses hingga tengah malam pada 1 Januari 2021:

request.time < timestamp('2021-01-01T00:00:00Z')

Dalam binding peran, ekspresi kondisi berikut mengizinkan 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') <= '

Dalam binding peran, ekspresi kondisi berikut mengizinkan akses hanya untuk bulan 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 RFC 3339 format. 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 binding peran, ekspresi kondisi berikut mengizinkan akses untuk akun utama jika permintaan tidak membuat aturan penerusan, atau jika permintaan tersebut membuat aturan penerusan untukload balancer internal Google Cloud :

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ])
)

Untuk mengetahui detail tentang skema load balancing, lihat Menggunakan Ketentuan IAM pada Google Cloud load balancer.

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, 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.type != 'compute.googleapis.com/Instance')

Langkah berikutnya