Menulis template batasan kustom

Halaman ini menunjukkan cara menulis template batasan kustom dan menggunakannya untuk memperluas Pengontrol Kebijakan jika Anda tidak dapat menemukan template batasan yang ditulis sebelumnya yang sesuai dengan kebutuhan Anda.

Halaman ini ditujukan untuk administrator dan Operator IT yang ingin memastikan bahwa semua resource yang berjalan dalam platform cloud memenuhi persyaratan kepatuhan organisasi dengan menyediakan dan mempertahankan otomatisasi untuk mengaudit atau menerapkan, dan menggunakan pembuatan template konfigurasi deklaratif. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

Kebijakan Pengontrol Kebijakan dijelaskan menggunakan Framework Batasan OPA dan ditulis dalam Rego. Kebijakan dapat mengevaluasi kolom objek Kubernetes.

Menulis kebijakan menggunakan Rego adalah keterampilan khusus. Oleh karena itu, a library template batasan umum di instal secara default. Anda mungkin dapat memanggil template batasan ini saat membuat batasan. Jika memiliki kebutuhan khusus, Anda dapat membuat template batasan sendiri.

Template batasan memungkinkan Anda memisahkan logika kebijakan dari persyaratan spesifiknya, untuk penggunaan kembali dan delegasi. Anda dapat membuat batasan menggunakan template batasan yang dikembangkan oleh pihak ketiga, seperti project open source, vendor software, atau pakar regulasi.

Sebelum memulai

Contoh template batasan

Berikut adalah contoh template batasan yang menolak semua resource yang namanya cocok dengan nilai yang diberikan oleh pembuat batasan. Bagian lain dari halaman ini membahas konten template, dengan menyoroti konsep penting.

Jika Anda menggunakan Config Sync dengan a repositori hierarkis, sebaiknya buat batasan di direktori cluster/.

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sdenyname
spec:
  crd:
    spec:
      names:
        kind: K8sDenyName
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          properties:
            invalidName:
              type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sdenynames
        violation[{"msg": msg}] {
          input.review.object.metadata.name == input.parameters.invalidName
          msg := sprintf("The name %v is not allowed", [input.parameters.invalidName])
        }

Contoh batasan

Berikut adalah contoh batasan yang dapat Anda terapkan untuk menolak semua resource yang diberi nama policy-violation:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sDenyName
metadata:
  name: no-policy-violation
spec:
  parameters:
    invalidName: "policy-violation"

Bagian dari template batasan

Template batasan memiliki dua bagian penting:

  • Skema batasan yang ingin Anda buat oleh pengguna. Skema template batasan disimpan di kolom crd.

  • Kode sumber Rego yang dieksekusi saat batasan dievaluasi. Kode sumber Rego untuk template disimpan di kolom targets.

Skema (kolom crd)

Kolom CRD adalah cetak biru untuk membuat Definisi Resource Kustom Kubernetes yang menentukan resource batasan untuk server Kubernetes API. Anda hanya perlu mengisi kolom berikut.

Kolom Deskripsi
spec.crd.spec.names.kind Jenis batasan. Jika menggunakan huruf kecil, nilai kolom ini harus sama dengan metadata.name.
spec.crd.spec.validation.openAPIV3Schema

Skema untuk kolom spec.parameters resource batasan (Pengontrol Kebijakan secara otomatis menentukan skema batasan lainnya). Skema ini mengikuti konvensi yang sama seperti pada resource CRD reguler.

Memberi awalan pada template batasan dengan nama K8s adalah konvensi yang memungkinkan Anda menghindari konflik dengan jenis template batasan lainnya, seperti template Forseti yang menargetkan Google Cloud resource.

Kode sumber Rego (kolom targets)

Bagian berikut memberikan informasi selengkapnya tentang kode sumber Rego.

Lokasi

Kode sumber Rego disimpan di kolom spec.targets, dengan targets adalah array objek dengan format berikut:

{"target": "admission.k8s.gatekeeper.sh","rego": REGO_SOURCE_CODE, "libs": LIST_OF_REGO_LIBRARIES}
  • target: memberi tahu Pengontrol Kebijakan sistem mana yang kita lihat (dalam hal ini Kubernetes); hanya satu entri di targets yang diizinkan.
  • rego: kode sumber untuk batasan.
  • libs: daftar opsional library kode Rego yang disediakan untuk template batasan; tujuannya adalah untuk memudahkan penggunaan library bersama dan berada di luar cakupan dokumen ini.

Kode sumber

Berikut adalah kode sumber Rego untuk batasan sebelumnya:

package k8sdenynames

violation[{"msg": msg}] {
   input.review.object.metadata.name == input.parameters.invalidName
   msg := sprintf("The name %v is not allowed", [input.parameters.invalidName])
}

Perhatikan hal berikut:

  • package k8sdenynames diperlukan oleh OPA (runtime Rego). Nilai tersebut akan diabaikan.
  • Aturan Rego yang dipanggil oleh Pengontrol Kebijakan untuk melihat apakah ada pelanggaran disebut violation. Jika aturan ini memiliki kecocokan, pelanggaran batasan telah terjadi.
  • Aturan violation memiliki tanda tangan violation[{"msg": "violation message for the user"}], dengan nilai "msg" adalah pesan pelanggaran yang ditampilkan kepada pengguna.
  • Parameter yang diberikan ke batasan tersedia di bawah kata kunci input.parameters.
  • request-under-test disimpan di bawah kata kunci input.review.

Kata kunci input.review memiliki kolom berikut.

Kolom Deskripsi
uid ID unik untuk permintaan tertentu ini; ID ini tidak tersedia selama audit.
kind

Informasi Jenis untuk object-under-test. Informasi ini memiliki format berikut:

  • kind: jenis resource
  • group: grup resource
  • version: versi resource
name Nama resource. Nama ini mungkin kosong jika pengguna mengandalkan server API untuk membuat nama pada permintaan CREATE.
namespace Namespace resource (tidak disediakan untuk resource cakupan cluster).
operation Operasi yang diminta (misalnya, CREATE atau UPDATE); operasi ini tidak tersedia selama audit.
userInfo

Informasi pengguna yang meminta; informasi ini tidak tersedia selama audit. Informasi ini memiliki format berikut:

  • username: pengguna yang membuat permintaan
  • uid: UID pengguna
  • groups: daftar grup yang menjadi anggota pengguna
  • extra: informasi pengguna tambahan yang disediakan oleh Kubernetes
object Objek yang coba diubah atau dibuat oleh pengguna.
oldObject Status asli objek; status ini hanya tersedia pada operasi UPDATE operasi.
dryRun Apakah permintaan ini dipanggil dengan kubectl --dry-run; permintaan ini tidak tersedia selama audit.

Menulis template batasan referensial

Template batasan referensial adalah template yang memungkinkan pengguna membatasi satu objek sehubungan dengan objek lainnya. Contohnya adalah "jangan izinkan Pod dibuat sebelum Ingress yang cocok diketahui ada". Contoh lainnya adalah "jangan izinkan dua layanan memiliki nama host yang sama".

Pengontrol Kebijakan memungkinkan Anda menulis batasan referensial dengan memantau Server API untuk kumpulan resource yang disediakan pengguna. Saat resource diubah, Pengontrol Kebijakan akan menyimpan resource tersebut secara lokal sehingga dapat dengan mudah direferensikan oleh kode sumber Rego. Pengontrol Kebijakan menyediakan cache ini di bawah kata kunci data.inventory.

Resource cakupan cluster di-cache di lokasi berikut:

data.inventory.cluster["GROUP_VERSION"]["KIND"]["NAME"]

Misalnya, Node bernama my-favorite-node dapat ditemukan di

data.inventory.cluster["v1"]["Node"]["my-favorite-node"]

Resource cakupan namespace di-cache di sini:

data.inventory.namespace["NAMESPACE"]["GROUP_VERSION"]["KIND"]["NAME"]

Misalnya, ConfigMap bernama production-variables di namespace shipping-prod dapat ditemukan di

data.inventory.namespace["shipping-prod"]["v1"]["ConfigMap"]["production-variables"]

Seluruh konten objek disimpan di lokasi cache ini dan dapat direferensikan dalam kode sumber Rego sesuai keinginan Anda.

Informasi selengkapnya tentang Rego

Informasi sebelumnya memberikan fitur unik Pengontrol Kebijakan yang memudahkan penulisan batasan pada resource Kubernetes di Rego. Tutorial lengkap tentang cara menulis di Rego berada di luar cakupan panduan ini. Namun, dokumentasi Open Policy Agent memiliki informasi tentang sintaksis dan fitur bahasa Rego itu sendiri.

Menginstal template batasan

Setelah membuat template batasan, gunakan kubectl apply untuk menerapkannya, dan Pengontrol Kebijakan akan menangani penyerapan template tersebut. Pastikan untuk memeriksa kolom status template batasan Anda untuk memastikan tidak ada error saat membuat instance. Jika penyerapan berhasil, kolom status akan menampilkan created: true dan observedGeneration yang tercatat di kolom status harus sama dengan kolom metadata.generation.

Setelah template diserap, Anda dapat menerapkan batasan untuk template tersebut seperti yang dijelaskan dalam Membuat batasan.

Menghapus template batasan

Untuk menghapus template batasan, selesaikan langkah-langkah berikut:

  1. Pastikan tidak ada batasan yang ingin Anda pertahankan menggunakan template batasan:

    kubectl get TEMPLATE_NAME
    

    Jika ada konflik penamaan antara nama template batasan dan objek lain di cluster, gunakan perintah berikut:

    kubectl get TEMPLATE_NAME.constraints.gatekeeper.sh
    
  2. Hapus template batasan:

    kubectl delete constrainttemplate CONSTRAINT_TEMPLATE_NAME
    

Saat menghapus template batasan, Anda tidak dapat lagi membuat batasan yang mereferensikannya.

Langkah berikutnya