Halaman ini menunjukkan cara menerapkan kontrol keamanan level Pod yang telah ditetapkan sebelumnya
di cluster Google Kubernetes Engine (GKE) menggunakan pengontrol penerimaan
PodSecurity
.
Untuk mengetahui informasi lebih lanjut tentang cara kerja PodSecurity
, lihat
Penerimaan Keamanan Pod.
Ringkasan
PodSecurity
adalah pengontrol penerimaan Kubernetes yang memungkinkan Anda menerapkan
Standar Keamanan Pod
ke Pod yang berjalan di cluster GKE. Standar Keamanan Pod adalah
kebijakan keamanan yang telah ditetapkan sebelumnya dan mencakup kebutuhan keamanan Pod tingkat tinggi di
Kubernetes. Kebijakan ini bervariasi, mulai dari yang sangat permisif hingga
sangat ketat.
Anda dapat menerapkan Standar Keamanan Pod berikut ke cluster GKE:
- Privileged: Kebijakan yang tidak dibatasi dan memberikan tingkat izin terluas. Mengizinkan eskalasi akses umum.
- Baseline: Kebijakan dengan batasan minimal yang memungkinkan konfigurasi Pod default yang tidak banyak ditentukan. Mencegah eskalasi akses umum.
- Restricted: Kebijakan sangat ketat yang mengikuti praktik terbaik hardening Pod.
Anda dapat menggunakan pengontrol penerimaan PodSecurity
untuk menerapkan Standar Keamanan Pod
dalam mode berikut:
- Enforce: Pelanggaran kebijakan akan menolak pembuatan Pod. Peristiwa audit ditambahkan ke log audit.
- Audit: Pelanggaran kebijakan akan memicu penambahan peristiwa audit ke log audit. Pembuatan pod diizinkan.
- Warn: Pelanggaran kebijakan akan memicu peringatan yang ditampilkan kepada pengguna. Pembuatan pod diizinkan.
Pengontrol penerimaan PodSecurity
menyematkan kebijakan ini ke Kubernetes
API.
Jika Anda ingin membuat dan menerapkan kebijakan keamanan kustom pada level Pod, pertimbangkan untuk menggunakan pengontrol penerimaan Gatekeeper.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan
gcloud components update
.
- Pastikan Anda memiliki cluster GKE Autopilot atau
Standard yang menjalankan versi 1.23 atau yang lebih baru.
- Untuk cluster Autopilot, daftar di saluran rilis yang versi defaultnya adalah 1.23 atau yang lebih baru.
- Untuk cluster Standar, daftar di saluran rilis atau upgrade cluster ke versi tertentu.
Persyaratan
Pengontrol penerimaan PodSecurity
tersedia dan diaktifkan secara default di
cluster yang menjalankan versi GKE berikut:
- Versi 1.25 atau yang lebih baru: Stabil
- Versi 1.23 dan versi 1.24: Beta
Untuk memeriksa apakah versi GKE tersedia dan sudah menjadi versi default untuk saluran rilis Anda, lihat Jadwal rilis.
Menerapkan Standar Keamanan Pod menggunakan PodSecurity
Untuk menggunakan pengontrol penerimaan PodSecurity
, Anda harus menerapkan Standar Keamanan Pod tertentu
ke namespace tertentu dalam mode tertentu. Anda dapat melakukannya menggunakan label namespace.
Dalam latihan ini, Anda akan melakukan hal berikut:
- Membuat dua namespace baru
- Menerapkan kebijakan keamanan ke setiap namespace
- Menguji kebijakan yang dikonfigurasi
Pada versi GKE berikut, GKE mengabaikan kebijakan
yang Anda terapkan ke namespace kube-system
:
- 1.23.6-gke.1900 dan yang lebih baru
- 1.24.0-gke.1200 dan yang lebih baru
Pada versi GKE sebelumnya, hindari penerapan kebijakan di
kube-system
.
Membuat namespace baru
Buat namespace di cluster Anda:
kubectl create ns baseline-ns
kubectl create ns restricted-ns
Perintah ini akan membuat namespace berikut:
baseline-ns
: Untuk workload permisifrestricted-ns
: Untuk workload yang sangat dibatasi
Menggunakan label untuk menerapkan kebijakan keamanan
Terapkan Standar Keamanan Pod berikut:
baseline
: Menerapkan kebaseline-ns
dalam modewarn
restricted
: Menerapkan kerestricted-ns
dalam modeenforce
kubectl label --overwrite ns baseline-ns pod-security.kubernetes.io/warn=baseline
kubectl label --overwrite ns restricted-ns pod-security.kubernetes.io/enforce=restricted
Perintah ini akan memberikan hasil berikut:
- Workload di namespace
baseline-ns
yang melanggar kebijakanbaseline
akan diizinkan, dan klien akan menampilkan pesan peringatan. - Workload di namespace
restricted-ns
yang melanggar kebijakanrestricted
akan ditolak, dan GKE akan menambahkan entri ke log audit.
Pastikan label telah ditambahkan:
kubectl get ns --show-labels
Outputnya mirip dengan yang berikut ini:
baseline-ns Active 74s kubernetes.io/metadata.name=baseline-ns,pod-security.kubernetes.io/warn=baseline
restricted-ns Active 18s kubernetes.io/metadata.name=restricted-ns,pod-security.kubernetes.io/enforce=restricted
default Active 57m kubernetes.io/metadata.name=default
kube-public Active 57m kubernetes.io/metadata.name=kube-public
kube-system Active 57m kubernetes.io/metadata.name=kube-system
Menguji kebijakan yang dikonfigurasi
Untuk memverifikasi bahwa pengontrol penerimaan PodSecurity
berfungsi sebagaimana mestinya, deploy
workload yang melanggar kebijakan baseline
dan restricted
ke kedua
namespace. Contoh manifes berikut men-deploy container nginx
yang
memungkinkan eskalasi akses.
Simpan manifes berikut sebagai
psa-workload.yaml
:apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx securityContext: privileged: true
Terapkan manifes ke namespace
baseline-ns
:kubectl apply -f psa-workload.yaml --namespace=baseline-ns
Outputnya mirip dengan yang berikut ini:
Warning: would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)
Kebijakan
baseline
memungkinkan Pod di-deploy di namespace.Verifikasi bahwa Pod berhasil di-deploy:
kubectl get pods --namespace=baseline-ns -l=app=nginx
Terapkan manifes ke namespace
restricted-ns
:kubectl apply -f psa-workload.yaml --namespace=restricted-ns
Outputnya mirip dengan yang berikut ini:
Error from server (Forbidden): error when creating "workload.yaml": pods "nginx" is forbidden: violates 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 tidak akan di-deploy di namespace. Entri audit ditambahkan ke log.
Melihat pelanggaran kebijakan di log audit
Pelanggaran kebijakan dalam mode audit
dan enforce
dicatat dalam log
audit untuk cluster Anda. Anda dapat melihat log ini menggunakan Logs Explorer di
Konsol Google Cloud.
Buka halaman Logs Explorer di Konsol Google Cloud.
Di kolom Query, tentukan kode berikut untuk mengambil log audit mode
audit
danenforce
:resource.type="k8s_cluster" protoPayload.resourceName:"/pods/nginx" protoPayload.methodName="io.k8s.core.v1.pods.create" (labels."pod-security.kubernetes.io/audit-violations":"PodSecurity" OR protoPayload.response.reason="Forbidden")
Klik Run query.
Di bagian Query results, luaskan entri log
Forbidden
untuk memeriksa log penolakan modeenforce
. Detailnya mirip dengan berikut ini:{ ... protoPayload: { @type: "type.googleapis.com/google.cloud.audit.AuditLog" authenticationInfo: {1} authorizationInfo: [1] methodName: "io.k8s.core.v1.pods.create" request: {6} requestMetadata: {2} resourceName: "core/v1/namespaces/restricted-ns/pods/nginx" response: { @type: "core.k8s.io/v1.Status" apiVersion: "v1" code: 403 details: {2} kind: "Status" message: "pods "nginx" is forbidden: violates PodSecurity "restricted:latest": privileged (container "nginx" must not set securityContext.privileged=true), 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")" metadata: {0} reason: "Forbidden" status: "Failure" } serviceName: "k8s.io" status: {2} } receiveTimestamp: "2022-02-01T19:19:25.353235326Z" resource: {2} timestamp: "2022-02-01T19:19:21.469360Z" }
Luaskan entri log
audit-violations
untuk memeriksa log modeaudit
. Detailnya mirip dengan yang berikut ini:{ ... labels: { ... pod-security.kubernetes.io/audit-violations: "would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)" pod-security.kubernetes.io/enforce-policy: "privileged:latest" } operation: {4} protoPayload: {10} receiveTimestamp: "2023-12-26T05:18:04.533631468Z" resource: {2} timestamp: "2023-12-26T05:17:36.102387Z" }
Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda, hapus namespace:
kubectl delete ns baseline-ns
kubectl delete ns restricted-ns
Alternatif untuk PodSecurity
Selain menggunakan pengontrol penerimaan PodSecurity
Kubernetes bawaan
untuk menerapkan Standar Keamanan Pod, Anda juga dapat menggunakan Gatekeeper, pengontrol penerimaan
berdasarkan Open Policy Agent (OPA), untuk membuat dan menerapkan kontrol keamanan kustom
di level Pod.
Langkah berikutnya
- Pelajari Standar Keamanan Pod lebih lanjut.
- Pelajari pengontrol penerimaan lebih lanjut
PodSecurity
. - Bermigrasi dari PodSecurityPolicy ke pengontrol penerimaan
PodSecurity
.