Menggunakan library template batasan

Halaman ini menunjukkan cara menentukan Batasan Pengontrol Kebijakan menggunakan template batasan yang sudah ada dan disediakan oleh Google.

Halaman ini ditujukan untuk administrator dan Operator TI 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.

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 terhadap batasan dan ditolak jika tidak mematuhi. Resource yang sudah ada dan tidak mematuhi akan dilaporkan pada waktu audit.

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

Sebelum memulai

Memeriksa library template batasan

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

Untuk mencantumkan batasan, gunakan perintah berikut:

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

Untuk menjelaskan 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 memanggil template batasan dan memberikannya parameter yang khusus untuk batasan tersebut.

Jika Anda menggunakan Config Sync dengan a repositori hierarkis, 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 yang diterapkan batasan. Semua kondisi yang ditentukan harus cocok sebelum objek berada dalam cakupan untuk batasan. match Kondisi ditentukan oleh sub-kolom berikut:
    • kinds adalah jenis resource yang diterapkan batasan, yang ditentukan oleh dua kolom: apiGroups adalah daftar grup API Kubernetes yang cocok dan kinds adalah daftar jenis yang cocok. "*" cocok dengan semuanya. Jika setidaknya satu apiGroup dan satu kind entri cocok, kondisi kinds akan terpenuhi.
    • scope menerima *, Cluster, atau Namespaced, yang menentukan apakah resource cakupan cluster atau cakupan namespace dipilih (defaultnya adalah *).
    • namespaces adalah daftar nama namespace yang dapat dimiliki objek. Objek harus dimiliki oleh setidaknya salah satu namespace ini. Resource namespace diperlakukan seolah-olah milik mereka sendiri.
    • excludedNamespaces adalah daftar namespace yang tidak dapat dimiliki objek.
    • labelSelector adalah pemilih label Kubernetes yang harus dipenuhi objek.
    • namespaceSelector adalah pemilih label pada namespace yang dimiliki objek. Jika namespace tidak memenuhi objek, namespace tidak akan cocok. Resource namespace diperlakukan seolah-olah milik mereka sendiri.
  • Kolom parameters menentukan argumen untuk batasan, berdasarkan yang diharapkan 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 template batasan untuk mengevaluasi apakah namespace memiliki label geo yang ditetapkan ke nilai tertentu.

# 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 akan ditetapkan ke true, baik batasan dikonfigurasi untuk menerapkan atau hanya menguji batasan.

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 audit, lihat Mengaudit menggunakan batasan.

Peringatan saat menyinkronkan batasan

Jika Anda menyinkronkan batasan ke sumber terpusat, seperti repositori Git, dengan Config Sync atau alat gaya GitOps lainnya, perhatikan peringatan berikut saat menyinkronkan batasan.

Konsistensi tertunda

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

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

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

Mengonfigurasi Pengontrol Kebijakan untuk batasan referensial

Sebelum dapat mengaktifkan batasan referensial, Anda harus membuat konfigurasi yang memberi tahu Pengontrol Kebijakan jenis objek yang akan dipantau, seperti namespace.

Simpan manifes YAML berikut ke file, dan terapkan dengan kubectl. Manifes mengonfigurasi Pengontrol Kebijakan untuk memantau namespace dan Ingress. Buat entri dengan group, version, dan kind di bagian 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 referensial mereferensikan objek lain dalam definisinya. Misalnya, Anda dapat membuat batasan yang mengharuskan objek Ingress dalam cluster memiliki nama host yang unik. Batasan bersifat referensial jika template batasannya berisi string data.inventory di Rego.

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

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

  • Urutan penginstalan batasan dan urutan pembaruan cache bersifat acak.

Anda dapat mengupdate cluster yang ada untuk mengizinkan batasan referensial.

Konsol

Untuk menonaktifkan batasan referensial, selesaikan langkah-langkah berikut:

  1. Di Google Cloud konsol, buka halaman Policy di bagian Posture Management.

    Buka Policy

  2. Di tab Settings, di tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Centang kotak Enable Constraint Templates that reference to objects other than the object currently being evaluated..
  5. Pilih Save changes.

gcloud

Untuk mengaktifkan dukungan untuk 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 keanggotaan yang dipisahkan dengan koma.

Menonaktifkan batasan referensial

Saat Anda menonaktifkan batasan referensial, template apa pun yang menggunakan batasan referensial juga akan dihapus dari cluster, bersama dengan batasan apa pun yang menggunakan template tersebut.

Konsol

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

  1. Di Google Cloud konsol, buka halaman Policy di bagian Posture Management.

    Buka Policy

  2. Di tab Settings, di tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Hapus centang kotak Enable Constraint Templates that reference to objects other than the object currently being evaluated..
  5. Pilih Save changes.

gcloud

Untuk 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 keanggotaan yang dipisahkan dengan koma.

Mencantumkan semua batasan

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

kubectl get constraint

Anda juga dapat melihat ringkasan batasan yang diterapkan di Google Cloud konsol. Untuk mengetahui 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 dengan metadata.name template batasan:

kubectl get CONSTRAINT_TEMPLATE_NAME

Untuk menghapus batasan, tentukan kind dan name:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

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

Menghapus semua template batasan

Konsol

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

  1. Di Google Cloud konsol, buka halaman Policy di bagian Posture Management.

    Buka Policy

  2. Di tab Settings, di tabel cluster, pilih Edit di kolom Edit configuration.
  3. Di menu Add/Edit policy bundles, nonaktifkan library template dan semua paket kebijakan .
  4. Pilih Save changes.

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.

Memulihkan library template batasan

Konsol

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

  1. Di Google Cloud konsol, buka halaman Policy di bagian Posture Management.

    Buka Policy

  2. Di tab Settings, di tabel cluster, pilih Edit di kolom Edit configuration.
  3. Di menu Add/Edit policy bundles, aktifkan library template . Anda juga dapat mengaktifkan salah satu atau semua paket kebijakan.
  4. Pilih Save changes.

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 terdaftar untuk mengaktifkan library template batasan. Anda dapat menentukan beberapa keanggotaan yang dipisahkan dengan koma.

Langkah berikutnya