Menerapkan kebijakan keamanan level Pod yang telah ditetapkan sebelumnya menggunakan PodSecurity


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 initialize 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.

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 permisif
  • restricted-ns: Untuk workload yang sangat dibatasi

Menggunakan label untuk menerapkan kebijakan keamanan

Terapkan Standar Keamanan Pod berikut:

  • baseline: Menerapkan ke baseline-ns dalam mode warn
  • restricted: Menerapkan ke restricted-ns dalam mode enforce
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 kebijakan baseline akan diizinkan, dan klien akan menampilkan pesan peringatan.
  • Workload di namespace restricted-ns yang melanggar kebijakan restricted 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.

  1. 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
    
  2. Terapkan manifes ke namespace baseline-ns:

    kubectl apply -f psa-workload.yaml --namespace=baseline-ns
    

    Outputnya mirip dengan hal 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.

  3. Verifikasi bahwa Pod berhasil di-deploy:

    kubectl get pods --namespace=baseline-ns -l=app=nginx
    
  4. Terapkan manifes ke namespace restricted-ns:

    kubectl apply -f psa-workload.yaml --namespace=restricted-ns
    

    Outputnya mirip dengan hal 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.

  1. Buka halaman Logs Explorer di Konsol Google Cloud.

    Buka Logs Explorer

  2. Di kolom Query, tentukan hal berikut untuk mengambil log audit mode audit dan enforce:

    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")
    
  3. Klik Jalankan kueri.

  4. Di bagian Query results, luaskan entri log Forbidden untuk memeriksa log penolakan mode enforce. 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"
    }
    
  5. Luaskan entri log audit-violations untuk memeriksa log mode audit. 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 selanjutnya