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.
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ă:
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).