Ghid de Securitate Kubernetes (Hardening): Pod Security Standards (PSA), Restricții RBAC și NetworkPolicies în Kubernetes (kubectl)

Creare și actualizare Kubernetes 1.25+ Producție

Ghid complet de securitate defensivă în Kubernetes: implementarea standardelor Pod Security Admission (PSA - Privileged, Baseline, Restricted), blocarea containerelor root, securizarea secretelor cu Sealing/KMS și auditul RBAC.

Sintaxă comandă
pod-security.kubernetes.io/enforce: restricted | securityContext.readOnlyRootFilesystem: true

Securizarea unui cluster Kubernetes în producție (Cluster Hardening) presupune o strategie de apărare în adâncime (Defense in Depth): chiar dacă un atacator exploatează o vulnerabilitate din codul unei aplicații web și obține execuție de comenzi în interiorul unui container, el trebuie să fie complet izolat de rețeaua internă, să nu aibă drepturi de scriere pe disc, să nu aibă acces la API Server și să nu poată evada pe mașina fizică gazdă.

1. Standardul Pod Security Admission (PSA): Înlocuitorul Modern PSP

Kubernetes clasifică securitatea sarcinilor de calcul în trei profiluri oficiale:

  • Privileged: Fără nicio restricție (utilizat doar de plugin-uri de sistem CNI sau nod-uri de drivere).
  • Baseline: Blochează privilegiile flagrante (containere privileged, acces direct la hostNetwork/hostPID).
  • Restricted: Standardul de aur pentru producție. Obligă containerele să ruleze ca utilizator non-root, blochează escaladarea de privilegii (allowPrivilegeEscalation: false), impune sistem de fișiere numai-citire și elimină toate capabilitățile Linux.
Activarea nivelului Restricted pe un namespace de producție
apiVersion: v1
kind: Namespace
metadata:
  name: productia
  labels:
    # Respinge orice Pod care nu respectă standardul strict Restricted:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: latest
    # Afișează avertismente la kubectl apply dacă există probleme:
    pod-security.kubernetes.io/warn: restricted

2. Blocul de Aur securityContext pentru Pod-uri și Containere

Pentru ca un Pod să fie admis într-un namespace cu profil restricted, manifestul său trebuie să includă următoarea configurație strictă:

Configurația recomandată de securitate în PodSpec
spec:
  # Securitate la nivel de Pod:
  securityContext:
    runAsNonRoot: true
    runAsUser: 10001
    runAsGroup: 10001
    fsGroup: 10001
    seccompProfile:
      type: RuntimeDefault # Filtrează apelurile de sistem periculoase prin Seccomp
  
  # Dezactivăm montarea automată a token-ului de API Server dacă Pod-ul nu are nevoie de kubectl:
  automountServiceAccountToken: false

  containers:
    - name: api
      image: my-company/api:v1.0
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true # Sistem de fișiere complet imuabil!
        capabilities:
          drop:
            - ALL # Eliminăm absolut toate capabilitățile nucleului
      volumeMounts:
        # Singurul loc unde aplicația poate scrie fișiere temporare este în memoria RAM:
        - name: tmp-dir
          mountPath: /tmp
  volumes:
    - name: tmp-dir
      emptyDir:
        medium: Memory # tmpfs în RAM

3. Criptarea Secretelor în repaus (Encryption at Rest în etcd)

În configurația implicită, un obiect Secret din Kubernetes este codificat doar în Base64 și este stocat în plain-text în baza de date etcd. Pe serverele de Control Plane, configurați un fișier EncryptionConfiguration pentru a cripta toate secretele pe disc folosind algoritmul AES-CBC sau un provider KMS extern (AWS KMS, Google Cloud KMS, HashiCorp Vault).