Menggunakan library template batasan

Halaman ini menunjukkan cara menetapkan batasan Pengontrol Kebijakan dengan menggunakan template batasan yang sudah ada sebelumnya dan disediakan oleh Google.

Pengontrol Kebijakan memungkinkan Anda menerapkan kebijakan untuk cluster Kubernetes dengan menentukan satu atau beberapa objek batasan. Setelah batasan diinstal, permintaan ke server API akan diperiksa berdasarkan batasan tersebut dan akan ditolak jika tidak mematuhi batasan tersebut. Resource yang tidak mematuhi kebijakan sebelumnya akan dilaporkan pada waktu audit.

Setiap batasan didukung oleh template batasan yang menentukan skema dan logika batasan tersebut. Template batasan dapat bersumber dari Google dan pihak ketiga, atau Anda dapat menulis sendiri. Untuk mengetahui informasi selengkapnya tentang cara membuat template baru, lihat Menulis template batasan.

Sebelum memulai

Memeriksa library template batasan

Saat menentukan batasan, tentukan template batasan yang diperluas. Library template batasan umum yang dikembangkan oleh Google diinstal secara default, dan banyak organisasi tidak perlu membuat template batasan kustom langsung di Rego. Template batasan yang disediakan oleh Google memiliki label configmanagement.gke.io/configmanagement.

Untuk menampilkan daftar batasan, gunakan perintah berikut:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

Untuk mendeskripsikan template batasan dan memeriksa parameter yang diperlukan, gunakan perintah berikut:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Anda juga dapat melihat semua template batasan di library.

Menentukan batasan

Anda menentukan batasan menggunakan YAML, dan Anda tidak perlu memahami atau menulis Rego. Sebagai gantinya, batasan akan memanggil template batasan dan memberinya parameter khusus untuk batasan tersebut.

Jika Anda menggunakan repo terstruktur, sebaiknya buat batasan di direktori cluster/.

Batasan memiliki kolom berikut:

  • kind huruf kecil cocok dengan nama template batasan.
  • metadata.name adalah nama batasan.
  • Kolom match menentukan objek tempat batasan diterapkan. Semua kondisi yang ditentukan harus dicocokkan sebelum objek berada dalam cakupan batasan. Kondisi match ditentukan oleh sub-kolom berikut:
    • kinds adalah jenis resource yang dikenai batasan, yang ditentukan oleh dua kolom: apiGroups adalah daftar grup Kubernetes API yang cocok dan kinds adalah daftar jenis yang cocok. "*" cocok dengan semuanya. Jika setidaknya satu entri apiGroup dan satu entri kind cocok, kondisi kinds akan terpenuhi.
    • scope menerima *, Cluster, atau Namespaced, yang menentukan apakah resource dengan cakupan cluster atau dengan namespace dipilih (nilai defaultnya adalah *).
    • namespaces adalah daftar nama namespace yang mencakup objek tersebut. Objek harus dimiliki oleh setidaknya salah satu namespace ini. Resource namespace diperlakukan seolah-olah resource tersebut milik sendiri.
    • excludedNamespaces adalah daftar namespace yang tidak dapat mencakup objek.
    • labelSelector adalah pemilih label Kubernetes yang harus dipenuhi objek.
    • namespaceSelector adalah pemilih label pada namespace tempat objek berada. Jika namespace tidak memenuhi objek, namespace tidak akan cocok. Resource namespace diperlakukan seolah-olah resource tersebut milik sendiri.
  • Kolom parameters menentukan argumen untuk batasan, berdasarkan yang diharapkan oleh template batasan.

Batasan berikut, yang disebut ns-must-have-geo, memanggil template batasan yang disebut K8sRequiredLabels, yang disertakan dalam library template batasan yang disediakan oleh Google. Batasan menentukan parameter yang digunakan oleh template batasan untuk mengevaluasi apakah namespace memiliki label geo yang ditetapkan ke beberapa nilai.

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

Untuk membuat batasan, gunakan kubectl apply -f:

kubectl apply -f ns-must-have-geo.yaml

Mengaudit batasan

Jika batasan dikonfigurasi dan diinstal dengan benar, kolom status.byPod[].enforced-nya akan ditetapkan ke true, baik batasan tersebut dikonfigurasi untuk menerapkan batasan atau hanya menguji batasan tersebut.

Batasan diterapkan secara default, dan pelanggaran batasan akan mencegah operasi cluster tertentu. Anda dapat menetapkan spec.enforcementAction batasan ke dryrun untuk melaporkan pelanggaran di kolom status.violations tanpa mencegah operasi.

Untuk mempelajari lebih lanjut cara mengaudit, lihat Mengaudit menggunakan batasan.

Peringatan saat menyinkronkan batasan

Jika Anda menyinkronkan batasan ke sumber tepercaya dengan Config Sync atau alat bergaya GitOps lainnya, perhatikan peringatan berikut saat menyinkronkan batasan.

Konsistensi tertunda

Anda dapat meng-commit batasan ke sumber tepercaya seperti repositori Git, dan dapat membatasi efeknya menggunakan ClusterSelectors atau NamespaceSelectors. Karena sinkronisasi pada akhirnya akan konsisten, perhatikan peringatan berikut:

  • Jika operasi cluster memicu batasan yang NamespaceSelector-nya merujuk ke namespace yang belum disinkronkan, batasan tersebut akan diterapkan dan operasi akan dicegah. Dengan kata lain, namespace yang hilang "gagal ditutup".
  • Jika Anda mengubah label namespace, cache mungkin berisi data usang untuk waktu yang singkat.

Minimalkan kebutuhan untuk mengganti nama namespace atau mengubah labelnya, dan uji batasan yang memengaruhi namespace yang diganti namanya atau diberi label ulang untuk memastikannya berfungsi seperti yang diharapkan.

Mengonfigurasi Pengontrol Kebijakan untuk batasan referensial

Sebelum dapat mengaktifkan batasan referensi, Anda harus membuat konfigurasi yang memberi tahu Pengontrol Kebijakan jenis objek apa saja yang perlu dipantau, seperti namespace.

Simpan manifes YAML berikut ke file, lalu terapkan dengan kubectl. Manifes mengonfigurasi Pengontrol Kebijakan untuk memantau namespace dan Ingress. Buat entri dengan group, version, dan kind pada spec.sync.syncOnly, dengan nilai untuk setiap jenis objek yang ingin Anda pantau.

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

Mengaktifkan batasan referensial

Batasan referensi mereferensikan objek lain dalam definisinya. Misalnya, Anda dapat membuat batasan yang mengharuskan objek Ingress dalam cluster untuk memiliki nama host yang unik. Batasan ini bersifat referensial jika template batasannya berisi string data.inventory dalam Rego-nya.

Batasan referensial diaktifkan secara default jika Anda menginstal Pengontrol Kebijakan menggunakan konsol Google Cloud. Jika menginstal Pengontrol Kebijakan menggunakan Google Cloud CLI, Anda dapat memilih apakah akan mengaktifkan batasan referensial saat Menginstal Pengontrol Kebijakan. Batasan referensial hanya dijamin akan konsisten pada akhirnya, dan hal ini akan menimbulkan risiko:

  • Pada server API yang kelebihan beban, konten cache Pengontrol Kebijakan mungkin tidak berlaku lagi, menyebabkan batasan referensi menjadi "gagal dibuka", yang berarti tindakan penerapan tampak berfungsi padahal tidak. Misalnya, Anda dapat membuat Ingress dengan nama host duplikat terlalu cepat agar pengontrol penerimaan dapat mendeteksi duplikat.

  • Urutan penginstalan batasan dan urutan cache diupdate akan dilakukan secara acak.

Anda dapat mengupdate cluster yang ada untuk mengizinkan batasan referensial.

Konsol

Untuk menonaktifkan batasan referensial, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Policy GKE Enterprise di bagian Posture Management.

    Buka Kebijakan

  2. Di tab Settings, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Centang kotak Enable Constraint Templates yang merujuk ke objek selain objek yang sedang dievaluasi..
  5. Pilih Simpan perubahan.

Pengontrol Kebijakan gcloud

Untuk mengaktifkan dukungan bagi batasan referensial, jalankan perintah berikut:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

Ganti MEMBERSHIP_NAME dengan nama keanggotaan cluster terdaftar untuk mengaktifkan aturan referensial. Anda dapat menentukan beberapa langganan yang dipisahkan dengan koma.

gcloud ConfigManagement

Guna mengaktifkan dukungan untuk batasan referensial, tetapkan policyController.referentialRulesEnabled ke true dalam file config-management.yaml Anda:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: true

Menonaktifkan batasan referensial

Jika Anda menonaktifkan batasan referensial, semua template yang menggunakan batasan referensial juga akan dihapus dari cluster, beserta batasan yang menggunakan template tersebut.

Konsol

Batasan referensial diaktifkan secara default saat Anda menginstal Pengontrol Kebijakan dengan konsol Google Cloud. Untuk menonaktifkan batasan referensial, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Policy GKE Enterprise di bagian Posture Management.

    Buka Kebijakan

  2. Di tab Settings, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Hapus centang pada kotak Enable Constraint Templates yang merujuk ke objek selain objek yang sedang dievaluasi..
  5. Pilih Simpan perubahan.

Pengontrol Kebijakan gcloud

Guna menonaktifkan dukungan untuk batasan referensial, jalankan perintah berikut:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

Ganti MEMBERSHIP_NAME dengan nama keanggotaan cluster terdaftar untuk mengaktifkan aturan referensial. Anda dapat menentukan beberapa langganan yang dipisahkan dengan koma.

gcloud ConfigManagement

Untuk menonaktifkan batasan referensial pada cluster, tetapkan policyController.referentialRulesEnabled ke false dalam file config-management.yaml Anda:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: false

Mencantumkan semua batasan

Untuk menampilkan daftar semua batasan yang diinstal di cluster, gunakan perintah berikut:

kubectl get constraint

Anda juga dapat melihat ringkasan batasan yang diterapkan di konsol Google Cloud. Untuk informasi selengkapnya, lihat Metrik Pengontrol Kebijakan.

Menghapus batasan

Untuk menemukan semua batasan yang menggunakan template batasan, gunakan perintah berikut untuk mencantumkan semua objek dengan kind yang sama seperti metadata.name template batasan:

kubectl get CONSTRAINT_TEMPLATE_NAME

Untuk menghapus batasan, tentukan kind dan name-nya:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Saat Anda menghapusnya, batasan tersebut akan berhenti diterapkan segera setelah server API menandai batasan tersebut sebagai dihapus.

Hapus semua template batasan

Konsol

Untuk menonaktifkan library template batasan, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Policy GKE Enterprise di bagian Posture Management.

    Buka Kebijakan

  2. Di tab Settings, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Di menu Tambahkan/Edit paket kebijakan, nonaktifkan library template dan semua paket kebijakan.
  4. Pilih Simpan perubahan.

Pengontrol Kebijakan gcloud

Untuk menonaktifkan library template batasan, jalankan perintah berikut:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

Ganti MEMBERSHIP_NAME dengan nama keanggotaan cluster terdaftar untuk menonaktifkan library template batasan. Anda dapat menentukan beberapa keanggotaan yang dipisahkan dengan koma.

gcloud ConfigManagement

Tetapkan spec.policyController.templateLibraryInstalled ke false. Tindakan ini akan mencegah Pengontrol Kebijakan, Config Sync, dan Pengontrol Konfigurasi menginstal ulang library secara otomatis.

Untuk menghapus semua template batasan dan semua batasan, gunakan perintah berikut:

kubectl delete constrainttemplate --all

Memulihkan library template batasan

Konsol

Untuk mengaktifkan library template batasan, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Policy GKE Enterprise di bagian Posture Management.

    Buka Kebijakan

  2. Di tab Settings, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Di menu Tambahkan/Edit paket kebijakan, aktifkan library template ke . Anda juga dapat mengaktifkan salah satu atau semua paket kebijakan.
  4. Pilih Simpan perubahan.

Pengontrol Kebijakan gcloud

Untuk memulihkan library template batasan, jalankan perintah berikut:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

Ganti MEMBERSHIP_NAME dengan nama keanggotaan cluster yang terdaftar untuk mengaktifkan library template batasan. Anda dapat menentukan beberapa keanggotaan yang dipisahkan dengan koma.

gcloud ConfigManagement

Jika Anda menonaktifkan library template batasan atau meng-uninstal semua template batasan, Anda dapat memulihkannya dengan menetapkan spec.policyController.templateLibraryInstalled ke true di konfigurasi Pengontrol Kebijakan, Sinkronisasi Konfigurasi, dan Pengontrol Konfigurasi.

Untuk memulai ulang Pod Operator, gunakan perintah berikut:

kubectl delete pod -n config-management-system -l k8s-app=config-management-operator

Langkah selanjutnya