Halaman ini menunjukkan cara menulis template batasan kustom dan menggunakannya untuk memperluas Pengontrol Kebijakan jika Anda tidak dapat menemukan template batasan yang telah ditulis sebelumnya yang sesuai dengan kebutuhan Anda.
Halaman ini ditujukan bagi administrator IT dan Operator 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 template konfigurasi deklaratif. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise umum.
Kebijakan Pengontrol Kebijakan dijelaskan menggunakan Framework Batasan OPA dan ditulis dalam Rego. Kebijakan dapat mengevaluasi kolom apa pun dari objek Kubernetes.
Menulis kebijakan menggunakan Rego adalah keterampilan khusus. Oleh karena itu, library template batasan umum diinstal 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 peraturan.
Sebelum memulai
- Instal Pengontrol Kebijakan.
Contoh template batasan
Berikut adalah contoh template batasan yang menolak semua resource yang namanya cocok dengan nilai yang diberikan oleh pembuat batasan. Bagian selanjutnya dari halaman ini membahas konten template, yang menyoroti konsep penting di sepanjang jalan.
Jika Anda menggunakan Config Sync dengan
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 bernama 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 minta pengguna buat. 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 blueprint 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 ditulis dalam huruf kecil, nilai kolom ini harus sama dengan metadata.name . |
spec.crd.spec.validation.openAPIV3Schema |
Skema untuk kolom |
Menambahkan awalan ke template batasan dengan nama K8s
adalah konvensi yang
memungkinkan Anda menghindari konflik dengan jenis template batasan lainnya, seperti
template Forseti yang menargetkan resource Google Cloud.
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 dalam format berikut:
{"target": "admission.k8s.gatekeeper.sh","rego": REGO_SOURCE_CODE, "libs": LIST_OF_REGO_LIBRARIES}
target
: memberi tahu Pengontrol Kebijakan sistem yang kita lihat (dalam hal ini, Kubernetes); hanya satu entri ditargets
yang diizinkan.rego
: kode sumber untuk batasan.libs
: daftar opsional library kode Rego yang disediakan untuk template batasan; ini dimaksudkan untuk mempermudah 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 Pengontrol Kebijakan untuk melihat apakah ada pelanggaran
disebut
violation
. Jika aturan ini memiliki kecocokan, pelanggaran batasan telah terjadi. - Aturan
violation
memiliki tanda tanganviolation[{"msg": "violation message for the user"}]
, dengan nilai"msg"
adalah pesan pelanggaran yang ditampilkan kepada pengguna. - Parameter yang diberikan ke batasan tersedia di bagian kata kunci
input.parameters
. request-under-test
disimpan di bagian kata kunciinput.review
.
Kata kunci input.review
memiliki kolom berikut.
Kolom | Deskripsi |
---|---|
uid |
ID unik untuk permintaan khusus ini; ID ini tidak tersedia selama audit. |
kind |
Informasi Jenis untuk
|
name |
Nama resource. Kolom 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. Formatnya adalah sebagai berikut:
|
object |
Objek yang dicoba diubah atau dibuat oleh pengguna. |
oldObject |
Status asli objek; hanya tersedia pada operasi UPDATE. |
dryRun |
Apakah permintaan ini dipanggil dengan kubectl --dry-run ;
permintaan ini tidak tersedia selama audit. |
Menulis template batasan referensi
Template batasan referensi adalah template yang memungkinkan pengguna membatasi satu objek sehubungan dengan objek lain. Contohnya mungkin "jangan izinkan Pod dibuat sebelum Ingress yang cocok diketahui ada". Contoh lainnya mungkin "jangan izinkan dua layanan memiliki nama host yang sama".
Pengontrol Kebijakan memungkinkan Anda menulis batasan referensi dengan memantau
Server API untuk sekumpulan resource yang disediakan pengguna. Saat resource diubah,
Policy Controller akan meng-cache-nya secara lokal sehingga dapat dengan mudah dirujuk oleh kode sumber
Rego. Pengontrol Kebijakan menyediakan cache ini berdasarkan 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 bagian
data.inventory.namespace["shipping-prod"]["v1"]["ConfigMap"]["production-variables"]
Konten lengkap 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 dalam Rego tidak termasuk dalam 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 Policy Controller akan menangani penyerapannya. Pastikan untuk memeriksa kolom status
template batasan Anda untuk memastikan tidak ada error
saat membuat instance-nya. Setelah berhasil ditransfer, kolom status
akan menampilkan
created: true
dan observedGeneration
yang dicatat 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:
Pastikan tidak ada batasan yang ingin Anda pertahankan yang 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
Hapus template batasan:
kubectl delete constrainttemplate CONSTRAINT_TEMPLATE_NAME
Saat menghapus template batasan, Anda tidak dapat lagi membuat batasan yang mereferensikannya.
Langkah selanjutnya
- Pelajari Pengontrol Kebijakan lebih lanjut.
- Lihat dokumentasi referensi library template batasan.
- Pelajari cara menggunakan batasan, bukan PodSecurityPolicies.