Menggunakan Common Expression Language

Halaman ini menjelaskan cara menggunakan Common Expression Language (CEL) dengan kebijakan penerbitan sertifikat, template sertifikat, dan kondisi Identity and Access Management (IAM) di CA pool Anda.

Ringkasan

Common Expression Language (CEL) adalah bahasa non-Turing lengkap open source yang menerapkan semantik umum untuk evaluasi ekspresi. Certificate Authority Service mendukung CEL untuk menerapkan berbagai kontrol kebijakan untuk penerbitan sertifikat.

Ada dua dialek CEL yang dapat digunakan dengan CA Service:

  • Dialek fleksibel yang dapat digunakan dalam kebijakan penerbitan sertifikat dan template sertifikat CA pool.
  • Dialek yang lebih terbatas yang dapat digunakan dalam kondisi IAM.

Dialek CEL untuk kebijakan penerbitan sertifikat dan template sertifikat

Saat membuat CA pool atau template sertifikat, Anda dapat menentukan ekspresi CEL sebagai bagian dari batasan identitas sertifikat. Ekspresi CEL memungkinkan Anda memvalidasi kolom Subjek dan Nama Alternatif Subjek (SAN).

Untuk mengetahui informasi selengkapnya tentang kebijakan penerbitan, lihat Menambahkan kebijakan penerbitan sertifikat.

Untuk mengetahui informasi selengkapnya tentang template sertifikat, lihat Ringkasan kontrol kebijakan.

Dialek CEL untuk batasan identitas CA pool dan template sertifikat mengekspos variabel berikut untuk mengakses dan memvalidasi kolom subjek dan SAN:

  • Subjek: subject
  • SAN: subject_alt_names

Subjek

Anda dapat memvalidasi semua kolom dalam nama domain subjek sertifikat (termasuk nama umum), seperti yang ditentukan dalam permintaan sertifikat menggunakan variabel jenis Subject dan nama subject.

Subject adalah struktur yang berisi kolom berikut:

Jenis Nama
String common_name
String country_code
String organization
String organizational_unit
String locality
String province
String street_address
String postal_code

Nama Alternatif Subjek (SAN)

Anda dapat memvalidasi semua SAN seperti yang ditentukan dalam permintaan sertifikat menggunakan variabel subject_alt_names. Variabel subject_alt_names berisi daftar struct SAN, dengan setiap SAN berjenis SubjectAltName.

SubjectAltName adalah struct yang berisi kolom berikut:

Jenis Nama
String nilai
[]Int32 oid
Enum jenis

Anda dapat menggunakan nilai berikut untuk jenis SubjectAltName:

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

Variabel subject_alt_names berisi daftar dengan semua SAN yang diminta.

Anda dapat menggunakan makro berikut di SAN:

  • subject_alt_names.all(san, predicate)
  • subject_alt_names.exists(san, predicate)
  • subject_alt_names.exists_one(san, predicate)
  • subject_alt_names.filter(san, predicate)

Untuk mengetahui informasi selengkapnya tentang makro, lihat Definisi bahasa: Makro.

Contoh ekspresi

Memastikan nama umum tertentu dan sekumpulan negara

subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")

Memastikan semua nama DNS diakhiri dengan string kustom

subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))

Memastikan semua SAN berjenis DNS atau EMAIL

subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )

Memastikan hanya satu SAN kustom dengan OID tertentu

subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]

Memastikan SAN kustom hanya sekumpulan OID

subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])

Dialek CEL untuk kebijakan IAM

Gunakan kondisi IAM untuk membuat binding peran IAM tunduk pada ekspresi bersyarat. Jika kondisi bernilai true, binding peran IAM akan efektif, jika tidak, binding akan diabaikan. CA Service memungkinkan Anda menambahkan binding bersyarat IAM ke CA pool.

Kondisi IAM adalah ekspresi CEL yang mereferensikan sekumpulan atribut kontekstual tentang permintaan dan bernilai boolean. Pengguna menetapkan kondisi pada binding peran dalam kebijakan IAM, yang disimpan oleh IAM dan dievaluasi untuk melihat apakah operasi yang akan dilakukan diizinkan.

Untuk mengetahui informasi selengkapnya tentang kondisi IAM, lihat Ringkasan kondisi IAM.

Atribut berikut diekspos selama evaluasi CEL kondisi IAM:

  • privateca.googleapis.com/subject

    privateca.googleapis.com/subject dapat diakses sebagai api.getAttribute('privateca.googleapis.com/subject', {}).

Jenis Deskripsi
map{string, string} Kolom ini berisi nama subjek yang dibedakan (termasuk nama umum) seperti yang ditentukan dalam permintaan sertifikat masuk.

Contoh

{
 'common_name': 'Foobar',
 'organization': 'Example LLC'
 'country_code' :'US'
 'organizational_unit':'Foobar'
 'locality':'Mountain View'
 'Province':'California'
 'street_address':'Foobar 22'
 'postal_code':55555
}
  • privateca.googleapis.com/subject_alt_names

    privateca.googleapis.com/subject_alt_names dapat diakses sebagai api.getAttribute('privateca.googleapis.com/subject_alt_names', []).

Jenis Deskripsi
list{string} Kolom ini berisi semua SAN yang diminta seperti yang ditentukan dalam permintaan sertifikat masuk. Setiap SAN yang diminta diberi awalan dengan jenisnya. SAN dengan jenis yang tidak diketahui diberi awalan dengan OID serialisasi jenis.

Contoh

{
 'dns:foo.bar.com',
 'uri:spiffe://foo/ns/bar/sa/baz'
 'email:foo@bar.com'
 'ip:169.169.254.254'
 'custom:1.2.3.4.5.6.3:foobar'
}
  • privateca.googleapis.com/template

    privateca.googleapis.com/template dapat diakses sebagai api.getAttribute('privateca.googleapis.com/template', '').

Jenis Deskripsi
String Template sertifikat yang digunakan, jika ada. Formatnya adalah {project_id}/-/{template_id}.

Contoh: my-project-pki/-/workload_tls

Sintaksis template menggunakan {project_id}/-/{template_id}, bukan nama resource lengkap standar projects/{project_id}/locations/{location}/certificateTemplates/{template_id} karena template sertifikat harus berada di lokasi yang sama dengan CA pool. Dalam format ini, tanda hubung (-) bertindak sebagai karakter pengganti lokasi, yang membuat kondisi CEL tetap ringkas, mudah dibaca, dan tidak bergantung pada lokasi.

Nama template yang diberikan dalam kondisi IAM harus cocok dengan nama template dalam permintaan sertifikat. Jadi, jika Anda memberikan project ID dalam atribut privateca.googleapis.com/template dari ekspresi CEL, Anda juga harus memberikan project ID saat meminta sertifikat. Jika Anda memberikan nomor project dalam ekspresi CEL, Anda juga harus memberikan nomor project dalam permintaan sertifikat.

Contoh ekspresi

Memastikan semua subjek memiliki organisasi yang ditetapkan sebagai 'Contoh' dan kode negara ditetapkan sebagai US atau UK

api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']

Memastikan permintaan sertifikat hanya menyertakan SAN DNS yang diberikan

api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
        .hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])

Memastikan semua sertifikat menggunakan template tertentu

api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'

Langkah berikutnya