Kubernetes Security: Hardening di Sistema e Controlli Operativi¶
L'hardening security riduce la superficie di attacco e rende piu controllabile l'esecuzione di servizi, container e workload applicativi. L'obiettivo e' verificare privilegi, servizi esposti, configurazioni sensibili e policy di rete, mantenendo ogni controllo ripetibile e documentabile.
Panoramica¶
Le verifiche principali riguardano identita utente, privilegi sudo, possibili vettori di privilege escalation, permessi sui file critici, stato dei servizi, autenticazione SSH e hardening dei workload Kubernetes. In ambienti esposti tramite Traefik, anche header HTTP, rate limit e instradamento devono essere trattati come parte della superficie pubblica.
Verifica identita e privilegi¶
Controllare l'utente corrente, i gruppi associati e i privilegi disponibili:
Verificare gli utenti privilegiati:
Questi controlli permettono di validare che gli utenti abbiano solo i privilegi necessari e che le regole sudo siano esplicite, limitate e tracciabili.
Controllo privilege escalation¶
Ricercare binari con bit SUID e SGID:
Verificare file e directory scrivibili nel filesystem corrente:
Controllare eventuali Linux capabilities assegnate ai binari:
SUID, SGID, path scrivibili e capabilities anomale sono elementi da validare periodicamente, perche possono trasformarsi in vettori di escalation se combinati con binari vulnerabili o configurazioni permissive.
Servizi, porte e SSH¶
Verificare porte in ascolto e servizi attivi:
Controllare la configurazione effettiva di SSH:
Parametri da verificare:
La configurazione attesa privilegia autenticazione tramite chiave, accessi limitati agli utenti necessari e divieto di login diretto come root quando non richiesto.
Permessi sensibili e aggiornamenti¶
Validare permessi e sintassi dei file legati ad autenticazione e privilegi:
ls -l /etc/passwd
ls -l /etc/shadow
ls -l /etc/group
ls -l /etc/sudoers
ls -ld /etc/sudoers.d
visudo -c
Verificare aggiornamenti disponibili:
Su distribuzioni RHEL-like:
Hardening Kubernetes¶
Per i workload Kubernetes, il baseline minimo deve limitare privilegi, token automatici e accesso alla rete.
spec:
enableServiceLinks: false # (1)!
automountServiceAccountToken: false # (2)!
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false # (3)!
capabilities:
drop:
- ALL # (4)!
readOnlyRootFilesystem: true # (5)!
runAsNonRoot: true # (6)!
- Evita l'iniezione automatica delle variabili ambiente dei Service Kubernetes nel Pod.
- Non monta automaticamente il token del ServiceAccount quando il workload non deve chiamare l'API Kubernetes.
- Impedisce al processo di acquisire privilegi aggiuntivi rispetto a quelli iniziali.
- Rimuove tutte le Linux capabilities non necessarie dal container.
- Monta il filesystem root del container in sola lettura.
- Forza l'esecuzione del processo con utente non root.
NetworkPolicy e Traefik¶
Le NetworkPolicy permettono di ridurre la comunicazione laterale tra Pod, consentendo solo i flussi necessari. Per un endpoint pubblico esposto tramite Traefik, il traffico in ingresso dovrebbe arrivare esclusivamente dal controller ingress/gateway e solo sulla porta applicativa prevista.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-public-endpoint
spec:
podSelector:
matchLabels:
app: mkdocs
component: mcp
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system # (1)!
podSelector:
matchLabels:
app.kubernetes.io/name: rke2-traefik # (2)!
ports:
- protocol: TCP
port: 8000 # (3)!
egress: [] # (4)!
- Limita la sorgente al namespace in cui opera Traefik.
- Consente traffico solo dai Pod del controller Traefik.
- Espone esclusivamente la porta applicativa necessaria.
- Blocca traffico in uscita dal workload quando non richiesto.
Sul layer HTTP, Traefik puo applicare controlli aggiuntivi come rimozione dell'header Server, Cache-Control: no-store, X-Content-Type-Options: nosniff e rate limit sull'endpoint pubblico. CORS deve rimanere chiuso quando non esiste una reale esigenza di accesso browser cross-origin.
Risultato atteso¶
Una configurazione hardened deve garantire che:
- gli utenti dispongano solo dei privilegi necessari;
- le regole
sudosiano limitate e verificabili; - SUID, SGID e capabilities anomale vengano identificate;
- non siano presenti file critici scrivibili impropriamente;
- siano esposti solo i servizi necessari;
- SSH utilizzi una configurazione restrittiva;
- i container girino non-root, con privilegi minimi e filesystem read-only;
- le policy di rete limitino ingress ed egress;
- gli endpoint pubblici siano protetti da header hardening e rate limit;
- le verifiche possano essere ripetute periodicamente.
