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:

  • 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 !).

Setiap pernyataan menyatakan aturan kontrol berbasis atribut, dan pada akhirnya menentukan apakah binding peran, aturan tolak, 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 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 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 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