Halaman ini menunjukkan cara menulis {i>template<i} batasan khusus 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 untuk admin IT dan Operator yang ingin memastikan bahwa semua resource yang berjalan dalam platform {i>cloud<i} memenuhi persyaratan persyaratan kepatuhan dengan menyediakan dan mempertahankan otomatisasi untuk menerapkan, dan menggunakan template konfigurasi deklaratif. Untuk mempelajari lebih lanjut tentang peran umum dan contoh tugas yang kami rujuk dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise yang umum.
Kebijakan Pengontrol Kebijakan dijelaskan dengan menggunakan Framework Batasan OPA dan ditulis dalam bahasa Rego. Kebijakan dapat mengevaluasi setiap kolom objek Kubernetes.
Menulis kebijakan menggunakan Rego adalah keterampilan khusus. Karena alasan ini, library template batasan umum diinstal secara {i>default<i}. Anda mungkin dapat memanggil {i>template<i} batasan ini saat menciptakan batasan. Jika Anda memiliki kebutuhan khusus, Anda dapat membuat {i>template<i} batasan Anda sendiri.
Template batasan memungkinkan Anda memisahkan logika kebijakan darinya persyaratan tertentu, untuk digunakan kembali dan didelegasikan. Anda dapat membuat batasan dengan menggunakan template batasan yang dikembangkan oleh pihak ketiga, seperti open source proyek, vendor perangkat lunak, 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 lainnya dari halaman ini membahas konten {i>template<i}, menyoroti konsep-konsep penting beserta langkah pertama tersebut,
Jika Anda menggunakan Config Sync dengan
repositori hierarkis,
sebaiknya buat batasan dalam 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 mungkin 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 Anda inginkan untuk dibuat pengguna. Skema dari template batasan disimpan di kolom
crd
.Kode sumber Rego yang dijalankan saat batasan dievaluasi. Tujuan Kode sumber rego untuk template disimpan di kolom
targets
.
Skema (kolom crd
)
Bidang CRD adalah cetak biru untuk membuat Definisi Resource Kustom Kubernetes yang menentukan resource batasan untuk server Kubernetes API. Hanya Anda harus mengisi kolom berikut.
Kolom | Deskripsi |
---|---|
spec.crd.spec.names.kind |
Jenis batasan. Bila ditulis dengan huruf kecil, nilai
bidang ini harus sama dengan metadata.name . |
spec.crd.spec.validation.openAPIV3Schema |
Skema untuk kolom |
Memberi awalan pada template batasan dengan nama K8s
adalah konvensi yang
memungkinkan Anda menghindari konflik dengan jenis template batasan lain, seperti
Template Forseti yang menargetkan resource Google Cloud.
Kode sumber Rego (kolom targets
)
Bagian berikut memberikan informasi selengkapnya tentang sumber Rego pada kode sumber.
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 apa yang kita lihat (dalam hal ini Kubernetes kasus); hanya satu entri ditargets
yang diizinkan.rego
: kode sumber untuk batasan.libs
: daftar opsional library kode Rego yang dibuat tersedia untuk template batasan; dimaksudkan untuk memudahkan penggunaan perpustakaan 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). Nilainya adalah diabaikan.- Aturan Rego yang dipanggil Pengontrol Kebijakan untuk melihat apakah ada
pelanggaran disebut
violation
. Jika aturan ini memiliki kecocokan, berarti pelanggaran kendala tersebut 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 untuk batasan tersedia berdasarkan kata kunci
input.parameters
. request-under-test
disimpan dengan kata kunciinput.review
.
Kata kunci input.review
memiliki kolom berikut.
Kolom | Deskripsi |
---|---|
uid |
ID unik untuk permintaan khusus ini; fitur tersebut tidak tersedia selama audit. |
kind |
Informasi Jenis untuk
|
name |
Nama resource. 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); tidak yang tersedia selama audit. |
userInfo |
Informasi pengguna yang meminta; dan tidak tersedia selama audit. Formatnya sebagai berikut:
|
object |
Objek yang coba diubah atau dibuat oleh pengguna. |
oldObject |
Status asli objek; hanya tersedia di UPDATE operasional bisnis. |
dryRun |
Apakah permintaan ini dipanggil dengan kubectl --dry-run ;
dan tidak tersedia
selama audit. |
Menulis template batasan referensial
Template batasan referensial adalah template yang memungkinkan pengguna membatasi satu objek dalam kaitannya dengan objek lainnya. Contoh dari hal ini mungkin adalah "jangan memungkinkan Pod dibuat sebelum Ingress yang cocok diketahui ada". Lainnya contohnya adalah "jangan izinkan dua layanan memiliki nama host yang sama".
Pengontrol Kebijakan memungkinkan Anda menulis batasan referensial dengan melihat
Server API untuk kumpulan resource yang disediakan pengguna. Ketika sumber daya diubah,
Pengontrol Kebijakan melakukan cache secara lokal sehingga dapat dengan mudah dirujuk oleh Rego
pada kode sumber Anda. Pengontrol Kebijakan menyediakan cache di bagian
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
dalam namespace
shipping-prod
dapat ditemukan di
data.inventory.namespace["shipping-prod"]["v1"]["ConfigMap"]["production-variables"]
Seluruh isi objek disimpan di lokasi cache ini dan dapat dalam kode sumber Rego sesuai keinginan Anda.
Informasi selengkapnya tentang Rego
Informasi sebelumnya menyediakan fitur unik Pengontrol Kebijakan yang memudahkan penulisan batasan pada resource Kubernetes di Rego. Lengkap tutorial tentang cara menulis di Rego berada di luar cakupan panduan ini. Namun, Buka dokumentasi Agen Kebijakan memiliki informasi tentang sintaks dan fitur bahasa Rego itu sendiri.
Menginstal template batasan Anda
Setelah Anda membuat template batasan, gunakan kubectl apply
untuk menerapkannya.
dan Pengontrol Kebijakan akan menangani penyerapan data tersebut. Pastikan untuk memeriksa status
di template batasan Anda untuk memastikan tidak ada error
membuat instance-nya. Setelah penyerapan berhasil, kolom status
akan menunjukkan
created: true
dan observedGeneration
yang tercantum dalam kolom status
seharusnya
sama dengan kolom metadata.generation
.
Setelah template ditransfer, Anda dapat menerapkan batasan seperti yang dijelaskan di Membuat batasan.
Menghapus template batasan
Untuk menghapus template batasan, selesaikan langkah-langkah berikut:
Pastikan tidak ada batasan yang ingin Anda pertahankan yang menggunakan batasan {i>template<i}:
kubectl get TEMPLATE_NAME
Jika ada konflik penamaan antara nama template batasan dan objek berbeda 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.