Keamanan adalah hal yang sangat penting bagi kebanyakan organisasi dan individu yang menjalankan klaster Kubernetes. Anda dapat menemukan daftar periksa keamanan dasar di tempat lain dalam dokumentasi Kubernetes.
Untuk mempelajari cara men-deploy dan mengelola aspek keamanan Kubernetes, Anda dapat mengikuti tutorial di bagian ini.
1 - Menerapkan Standar Keamanan Pod di Tingkat Kluster
Catatan
Tutorial ini hanya berlaku untuk klaster baru.
Keamanan Pod adalah pengendali penerimaan (admission controller) yang melakukan pemeriksaan terhadap Standar Keamanan Pod Kubernetes saat pod baru dibuat. Fitur ini telah mencapai status GA di v1.25. Tutorial ini menunjukkan cara menerapkan Standar Keamanan Pod baseline di tingkat klaster, yang menerapkan konfigurasi standar ke semua namespace dalam klaster.
Tutorial ini menunjukkan apa yang dapat kamu konfigurasikan untuk klaster Kubernetes yang sepenuhnya kamu kendalikan. Jika kamu sedang mempelajari cara mengonfigurasi Pod Security Admission untuk klaster terkelola di mana kamu tidak dapat mengonfigurasi control plane, baca Menerapkan Standar Keamanan Pod di tingkat namespace.
Pilih Standar Keamanan Pod yang Tepat untuk Diterapkan
Untuk mengumpulkan informasi yang membantu kamu memilih Standar Keamanan Pod yang paling sesuai untuk konfigurasi kamu, lakukan langkah-langkah berikut:
Buat klaster tanpa Standar Keamanan Pod yang diterapkan:
kind create cluster --name psa-wo-cluster-pss
Outputnya akan serupa dengan:
Creating cluster "psa-wo-cluster-pss" ...
✓ Ensuring node image (kindest/node:v1.33.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-psa-wo-cluster-pss"
You can now use your cluster with:
kubectl cluster-info --context kind-psa-wo-cluster-pss
Thanks for using kind! 😊
Kubernetes control plane is running at https://127.0.0.1:61350
CoreDNS is running at https://127.0.0.1:61350/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Dapatkan daftar namespace di klaster:
kubectl get ns
Outputnya akan serupa dengan ini:
NAME STATUS AGE
default Active 9m30s
kube-node-lease Active 9m32s
kube-public Active 9m32s
kube-system Active 9m32s
local-path-storage Active 9m26s
Gunakan --dry-run=server untuk memahami apa yang terjadi saat Standar Keamanan Pod yang berbeda diterapkan:
Dari output sebelumnya, kamu akan melihat bahwa menerapkan Standar Keamanan Pod privileged tidak menunjukkan peringatan untuk namespace mana pun. Namun, standar baseline dan restricted keduanya memiliki peringatan, khususnya di namespace kube-system.
Setel mode, versi, dan standar
Di bagian ini, kamu menerapkan Standar Keamanan Pod berikut ke versi latest:
Standar baseline dalam mode enforce.
Standar restricted dalam mode warn dan audit.
Standar Keamanan Pod baseline menyediakan titik tengah yang nyaman yang memungkinkan daftar pengecualian tetap pendek dan mencegah eskalasi hak istimewa yang diketahui.
Selain itu, untuk mencegah pod gagal di kube-system, kamu akan mengecualikan namespace dari penerapan Standar Keamanan Pod.
Saat kamu menerapkan Pod Security Admission di lingkungan kamu sendiri, pertimbangkan hal-hal berikut:
Berdasarkan postur risiko yang diterapkan pada klaster, Standar Keamanan Pod yang lebih ketat seperti restricted mungkin merupakan pilihan yang lebih baik.
Mengecualikan namespace kube-system memungkinkan pod berjalan sebagai privileged di namespace ini. Untuk penggunaan di dunia nyata, proyek Kubernetes sangat menyarankan agar kamu menerapkan kebijakan RBAC yang ketat yang membatasi akses ke kube-system, mengikuti prinsip hak istimewa paling sedikit.
Untuk menerapkan standar sebelumnya, lakukan langkah-langkah berikut:
Buat file konfigurasi yang dapat dikonsumsi oleh Pod Security Admission Controller untuk menerapkan Standar Keamanan Pod ini:
Konfigurasi pod-security.admission.config.k8s.io/v1 mensyaratkan v1.25+
Untuk v1.23 dan v1.24, gunakan v1beta1.
Untuk v1.22, gunakan v1alpha1.
Konfigurasikan API server untuk mengonsumsi file ini selama pembuatan klaster:
cat <<EOF > /tmp/pss/cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: ClusterConfiguration
apiServer:
extraArgs:
admission-control-config-file: /etc/config/cluster-level-pss.yaml
extraVolumes:
- name: accf
hostPath: /etc/config
mountPath: /etc/config
readOnly: false
pathType: "DirectoryOrCreate"
extraMounts:
- hostPath: /tmp/pss
containerPath: /etc/config
# optional: if set, the mount is read-only.
# default false
readOnly: false
# optional: if set, the mount needs SELinux relabeling.
# default false
selinuxRelabel: false
# optional: set propagation mode (None, HostToContainer or Bidirectional)
# see https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
# default None
propagation: None
EOF
Catatan:
Jika kamu menggunakan Docker Desktop dengan kind di macOS, kamu dapat
menambahkan /tmp sebagai Direktori Bersama di bawah menu
Preferences > Resources > File Sharing.
Buat klaster yang menggunakan Pod Security Admission untuk menerapkan
Standar Keamanan Pod ini:
Creating cluster "psa-with-cluster-pss" ...
✓ Ensuring node image (kindest/node:v1.33.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-psa-with-cluster-pss"
You can now use your cluster with:
kubectl cluster-info --context kind-psa-with-cluster-pss
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
Kubernetes control plane is running at https://127.0.0.1:63855
CoreDNS is running at https://127.0.0.1:63855/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Pod akan dimulai secara normal, tetapi outputnya menyertakan peringatan:
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created
Bersihkan
Sekarang hapus klaster yang kamu buat di atas dengan menjalankan perintah berikut:
kind delete cluster --name psa-with-cluster-pss
kind delete cluster --name psa-wo-cluster-pss
Selanjutnya
Jalankan skrip shell untuk melakukan semua langkah sebelumnya sekaligus:
Buat Konfigurasi tingkat klaster berbasis Standar Keamanan Pod
Buat file untuk membiarkan API server mengonsumsi konfigurasi ini
Buat klaster yang membuat API server dengan konfigurasi ini
Setel konteks kubectl ke klaster baru ini
Buat file yaml pod minimal
Terapkan file ini untuk membuat Pod di klaster baru
2 - Menerapkan Standar Keamanan Pod di Tingkat Namespace
Catatan
Tutorial ini hanya berlaku untuk klaster baru.
Pod Security Admission adalah pengendali penerimaan (admission controller) yang menerapkan
Standar Keamanan Pod
saat pod dibuat. Fitur ini telah mencapai status GA di v1.25.
Dalam tutorial ini, Anda akan menerapkan Standar Keamanan Pod baseline,
satu namespace pada satu waktu.
Membuat klaster "psa-ns-level" ...
✓ Memastikan gambar node (kindest/node:v1.33.0) 🖼
✓ Menyiapkan node 📦
✓ Menulis konfigurasi 📜
✓ Memulai control-plane 🕹️
✓ Memasang CNI 🔌
✓ Memasang StorageClass 💾
Atur konteks kubectl ke "kind-psa-ns-level"
Anda sekarang dapat menggunakan klaster Anda dengan:
kubectl cluster-info --context kind-psa-ns-level
Tidak yakin apa yang harus dilakukan selanjutnya? 😅 Lihat https://kind.sigs.k8s.io/docs/user/quick-start/
Atur konteks kubectl ke klaster baru:
kubectl cluster-info --context kind-psa-ns-level
Outputnya mirip dengan ini:
Control plane Kubernetes berjalan di https://127.0.0.1:50996
CoreDNS berjalan di https://127.0.0.1:50996/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Untuk debug dan diagnosis masalah klaster lebih lanjut, gunakan 'kubectl cluster-info dump'.
Membuat namespace
Buat namespace baru bernama example:
kubectl create ns example
Outputnya mirip dengan ini:
namespace/example created
Mengaktifkan pemeriksaan Standar Keamanan Pod untuk namespace tersebut
Aktifkan Standar Keamanan Pod pada namespace ini menggunakan label yang didukung oleh
Pod Security Admission bawaan. Dalam langkah ini Anda akan mengkonfigurasi pemeriksaan untuk
memberikan peringatan pada Pod yang tidak memenuhi versi terbaru dari standar keamanan pod baseline.
kubectl label --overwrite ns example \
pod-security.kubernetes.io/warn=baseline \
pod-security.kubernetes.io/warn-version=latest
Anda dapat mengonfigurasi beberapa pemeriksaan standar keamanan pod pada namespace mana pun, menggunakan label.
Perintah berikut akan enforce Standar Keamanan Pod baseline, tetapi
warn dan audit untuk Standar Keamanan Pod restricted sesuai dengan versi terbaru
(nilai default)
kubectl apply -n example -f https://k8s.io/examples/security/example-baseline-pod.yaml
Pod berhasil dibuat; outputnya termasuk peringatan. Sebagai contoh:
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created
Pengaturan penerapan dan peringatan Standar Keamanan Pod hanya diterapkan
ke namespace example. Anda dapat membuat Pod yang sama di namespace default
tanpa peringatan.
Menghapus
Sekarang hapus klaster yang Anda buat di atas dengan menjalankan perintah berikut:
kind delete cluster --name psa-ns-level
Selanjutnya
Jalankan
skrip shell
untuk melakukan semua langkah sebelumnya sekaligus.
Membuat klaster kind
Membuat namespace baru
Menerapkan Standar Keamanan Pod baseline dalam mode enforce sambil menerapkan
Standar Keamanan Pod restricted juga dalam mode warn dan audit.
Membuat pod baru dengan standar keamanan pod berikut diterapkan