Torna al Blog
29 aprile 2026

Come risolvere comuni errori di configurazione nei cluster Kubernetes

Avrete probabilmente sentito la battuta che Kubernetes è essenzialmente un'enorme pila di file YAML tenuta insieme dalla speranza e da alcuni SRE molto stressati. Sebbene sia un po' un'esagerazione, coglie una verità fondamentale: Kubernetes è incredibilmente complesso. È un potente orchestratore, ma quella potenza comporta una curva di apprendimento ripida. Quando ci si muove velocemente — distribuendo aggiornamenti più volte al giorno, scalando pod tra regioni e gestendo service mesh — è quasi inevitabile che qualcosa venga configurato male.

Il problema è che in un ambiente cloud-native, un piccolo errore di battitura in un manifest o una modifica "temporanea" di un permesso può aprire un'enorme falla nella vostra sicurezza. Ci siamo passati tutti. Volevate solo che il pod si avviasse, quindi gli avete concesso i privilegi cluster-admin "solo per un secondo" per risolvere un problema di connessione. Poi ve ne siete dimenticati. Sei mesi dopo, quel pod è ancora in esecuzione ed è ora un biglietto d'oro per qualsiasi attaccante che riesca a ottenere una shell all'interno del vostro container.

Correggere le misconfigurazioni comuni nei cluster Kubernetes non significa solo eseguire uno scanner di sicurezza e spuntare delle caselle. Si tratta di capire il "perché" dietro i rischi. Se non capite come un container privilegiato possa portare a un breakout completo del nodo, continuerete a commettere gli stessi errori ogni volta che scriverete un nuovo file di deployment.

In questa guida, esamineremo gli errori più frequenti che riscontriamo e, cosa più importante, esattamente come risolverli. Esamineremo tutto, dagli incubi del Role-Based Access Control (RBAC) ai pericoli del namespace predefinito. Alla fine, dovreste avere una chiara roadmap per rafforzare il vostro cluster senza compromettere le vostre applicazioni.

Il Pericolo degli Account di Servizio con Privilegi Eccessivi (RBAC)

Il Role-Based Access Control (RBAC) è il cuore della sicurezza di Kubernetes. Ditta chi può fare cosa e dove. Tuttavia, l'RBAC è dove la maggior parte delle persone inizia a prendere scorciatoie. Quando uno sviluppatore dice: "Non riesco a far distribuire l'app dalla mia pipeline CI/CD", la soluzione più semplice è spesso quella di concedere all'account di servizio i permessi cluster-admin.

Funziona. La pipeline diventa verde. Tutti sono felici. Ma avete appena creato una vulnerabilità enorme. Se il vostro segreto CI/CD viene divulgato, l'attaccante non avrà solo accesso a un'app; avrà le chiavi del vostro intero regno.

La Trappola di "Cluster-Admin"

Il ruolo cluster-admin è un ClusterRole integrato che fornisce accesso illimitato a ogni risorsa nel cluster. Usarlo per gli account di servizio a livello di applicazione è un peccato capitale della sicurezza di K8s.

La Soluzione: Il Principio del Minimo Privilegio (PoLP) Invece di usare ruoli ampi, è necessario definire ruoli specifici che consentano solo le azioni esatte richieste.

Ad esempio, se un pod deve solo leggere le ConfigMaps nel proprio namespace per avviarsi, non dategli un ClusterRole. Dategli un Role (che è namespaced) con solo i verbi get e list per le configmaps.

Esempio di Ruolo Ristretto:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-namespace
  name: config-reader
rules:
- apiGroups: [""] 
  resources: ["configmaps"]
  verbs: ["get", "list"]

Evitare l'Account di Servizio Predefinito

Per impostazione predefinita, ogni namespace ha un account di servizio chiamato default. Se non specificate un account di servizio per un pod, Kubernetes gli assegna questo. Storicamente, l'account di servizio predefinito aveva ampi permessi. Sebbene le versioni moderne siano migliori, molti cluster legacy hanno ancora l'account default legato a ruoli eccessivamente permissivi.

La Soluzione: Account di Servizio Espliciti Non affidarsi mai all'impostazione predefinita. Creare un account di servizio dedicato per ogni singola applicazione.

  1. Creare il ServiceAccount.
  2. Creare un Role con le autorizzazioni minime necessarie.
  3. Creare un RoleBinding per collegare i due.
  4. Impostare esplicitamente serviceAccountName nella specifica del Pod.

Se la tua applicazione non ha affatto bisogno di comunicare con l'API di Kubernetes (il che è vero per la maggior parte delle applicazioni web), fai un ulteriore passo avanti. Imposta automountServiceAccountToken: false nella specifica del tuo pod. Ciò impedisce che il token API venga montato nel pod, il che significa che anche se un attaccante riesce ad entrare, non avrà alcun token da utilizzare per il movimento laterale all'interno del cluster.

Rafforzare il Contesto di Sicurezza del Pod

Quando un container viene eseguito, non si limita a funzionare "all'interno" del cluster; viene eseguito come processo su un nodo Linux. Se tale processo viene eseguito come utente root e c'è una vulnerabilità nel runtime del container o nel kernel, l'attaccante può potenzialmente "fuggire" dal container e ottenere l'accesso root alla macchina host. Questo è noto come container breakout.

Il Problema di "Privileged: True"

Spesso si vedrà privileged: true nei file YAML. Questo essenzialmente dice a Kubernetes di concedere al container quasi tutte le capacità della macchina host. Ciò è raramente necessario per le applicazioni standard. Di solito è necessario solo per strumenti di sistema specializzati (come i plugin CNI o i driver di storage).

La Soluzione: Smettere di Usare la Modalità Privilegiata Se ti trovi a dover usare privileged: true, chiediti perché. Hai solo bisogno di modificare un'impostazione di rete? Hai bisogno di montare un dispositivo specifico?

Invece della modalità privilegiata completa, usa le capabilities. Le `capabilities` di Linux ti permettono di suddividere il potere di "root" in pezzi più piccoli. Ad esempio, se hai solo bisogno di modificare le interfacce di rete, usa CAP_NET_ADMIN invece di dare al pod l'accesso root completo.

Esecuzione come Root

Molte immagini Docker sono costruite per essere eseguite come root per impostazione predefinita. Se le distribuisci così come sono, il tuo processo viene eseguito con UID 0. Questo è un rischio enorme.

La Soluzione: Usare un utente non-root Dovresti imporre l'esecuzione non-root sia nel Dockerfile che nel securityContext di Kubernetes.

Nel tuo YAML di deployment, aggiungi una sezione securityContext:

spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 2000

runAsNonRoot: true indica a Kubernetes di verificare se l'immagine sta tentando di essere eseguita come root e di far fallire l'avvio in tal caso. Questo costringe il tuo team a costruire immagini con un utente dedicato (ad esempio, USER 1000 nel Dockerfile).

Filesystem Root di Sola Lettura

La maggior parte delle applicazioni in realtà non ha bisogno di scrivere sul proprio filesystem root. Scrivono sui log (che dovrebbero andare a stdout/stderr) o su volumi montati. Se un attaccante ottiene l'accesso a un container, la prima cosa che di solito fa è scaricare un toolkit o uno script sul disco locale. Se il filesystem è di sola lettura, quel vettore di attacco è bloccato.

La Soluzione: Impostare readOnlyRootFilesystem su true

securityContext:
  readOnlyRootFilesystem: true

Se la tua applicazione ha bisogno di scrivere file temporanei, non disattivare il filesystem di sola lettura. Invece, monta un volume emptyDir al percorso specifico in cui l'applicazione deve scrivere (come /tmp).

Gestire la Superficie di Attacco: Policy di Rete

Per impostazione predefinita, Kubernetes ha una rete "piatta". Ciò significa che qualsiasi pod in qualsiasi namespace può comunicare con qualsiasi altro pod in qualsiasi altro namespace. Sebbene ciò sia ottimo per la connettività, è un incubo per la sicurezza. Se il tuo server web frontend viene compromesso, l'attaccante può scansionare liberamente la tua rete interna e trovare il tuo database, la tua cache e i tuoi strumenti di amministrazione interni.

La Mancanza di Segmentazione

Immagina una casa senza porte tra le stanze, solo un grande spazio aperto. Se un ladro entra dalla finestra principale, ha accesso immediato alla camera da letto, alla cucina e alla cassaforte. È esattamente così che funziona un cluster K8s predefinito.

La Soluzione: Implementare una Policy di Default-Deny Il modo più sicuro per gestire il traffico di rete è iniziare bloccando tutto e poi consentire esplicitamente solo ciò che è necessario. Questo è l'approccio "Zero Trust".

Per prima cosa, crea una policy che blocchi tutto il traffico in ingresso (ingress) e in uscita (egress) per il namespace:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Una volta che tutto è bloccato, crei regole di "permesso" specifiche. Ad esempio, se il tuo pod frontend deve comunicare con il tuo pod backend sulla porta 8080, scrivi una policy che consenta specificamente il traffico dall'etichetta frontend all'etichetta backend su quella porta.

Controllo del Traffico in Uscita (Egress)

La maggior parte delle persone si concentra su chi può entrare nel proprio cluster, ma dimentica ciò che sta uscendo. Se un pod viene compromesso, l'attaccante cercherà di "telefonare a casa" a un server di comando e controllo (C2) per ricevere istruzioni o esfiltrare dati.

La Soluzione: Restringere l'Egress A meno che il tuo pod non debba comunicare con internet pubblico (il che è raro per un servizio backend), blocca tutto il traffico in uscita. Se ha bisogno di accesso a internet (ad esempio, per chiamare una API di terze parti come Stripe o Twilio), usa una service mesh come Istio o Linkerd, oppure usa un Egress Gateway per whitelisting di domini esterni specifici.

La Trappola del "Point-in-Time" e il Continuous Testing

Una delle più grandi misconfigurazioni non è una riga di codice, ma un processo. Molte aziende eseguono un "audit di sicurezza" una volta al trimestre. Assumono un'azienda, l'azienda trova dieci misconfigurazioni, il team le risolve e tutti tirano un sospiro di sollievo.

Ma gli ambienti Kubernetes sono dinamici. Potresti cambiare una ConfigMap, aggiornare un Helm chart o aggiungere un nuovo container sidecar domani. Quell'audit "pulito" del mese scorso è ora irrilevante. Questo è ciò che chiamiamo sicurezza "point-in-time", e in un mondo cloud-native, è pericoloso.

È qui che diventa necessario un passaggio verso la Continuous Threat Exposure Management (CTEM). Non puoi limitarti a scansionare le vulnerabilità; devi simulare come un attaccante si muove effettivamente all'interno del tuo cluster.

Se hai un pod con un ruolo RBAC eccessivamente permissivo e una Network Policy mal configurata, una semplice scansione delle vulnerabilità potrebbe segnalarli come due rischi "medi" separati. Ma in realtà, insieme creano un percorso "critico": un attaccante sfrutta una vulnerabilità web, usa il ruolo RBAC per elencare i segreti, trova una password del database e usa la rete aperta per scaricare i tuoi dati.

Strumenti come Penetrify aiutano a colmare questa lacuna. Invece di un report statico che accumula polvere, Penetrify offre test di sicurezza on-demand che si adattano al tuo ambiente cloud. Ti aiuta a identificare queste "catene" di errori di configurazione—il modo in cui un piccolo errore RBAC si combina con una lacuna di rete—prima che lo faccia un attore malevolo. Adottando un modello di "Penetration Testing as a Service" (PTaaS), smetti di chiederti se il tuo cluster è sicuro e inizi a saperlo.

Proteggere l'API Server e il Control Plane

L'API server è il cervello del tuo cluster. Tutto—dai comandi kubectl alla logica interna del controller—passa attraverso di esso. Se l'API server è esposto o configurato erroneamente, l'intero cluster è compromesso.

API Server Accessibili Pubblicamente

Nella fretta di avviare un cluster, alcuni team lasciano l'API server aperto all'intera internet. Sebbene sia protetto dall'autenticazione, esporre l'endpoint consente agli attaccanti di tentare attacchi a forza bruta, sfruttare vulnerabilità Zero Day nell'API server stesso o eseguire attacchi denial-of-service.

La Soluzione: Utilizzare Endpoint Privati e Reti Autorizzate Se stai utilizzando un servizio gestito come EKS, GKE o AKS, abilita l'opzione "Private Cluster". Questo assicura che l'API server sia accessibile solo dall'interno del tuo VPC o tramite una VPN/Bastion host. Se devi mantenerlo pubblico, usa "Authorized Networks" (whitelisting IP) per limitare l'accesso solo all'IP del tuo ufficio o agli IP dei tuoi runner CI/CD.

Autenticazione Anonima

Alcuni cluster più vecchi o installazioni personalizzate potrebbero avere l'autenticazione anonima abilitata. Questo permette che le richieste all'API server non autenticate vengano trattate come un utente speciale system:anonymous. A seconda delle tue impostazioni RBAC, questo utente potrebbe accidentalmente avere i permessi per visualizzare pod o nodi.

La Soluzione: Disabilitare l'Autenticazione Anonima Assicurati che il flag --anonymous-auth=false sia impostato sul tuo kube-apiserver. Se non riesci a disabilitarlo per qualche motivo, assicurati che l'utente system:anonymous non sia associato a ruoli che forniscano informazioni sul tuo cluster.

Sicurezza di Etcd

Etcd è il database dove Kubernetes memorizza tutto il suo stato. Se un attaccante ottiene l'accesso a etcd, ha tutto: ogni secret, ogni configurazione e la capacità di modificare lo stato del cluster senza passare attraverso l'API server.

La Soluzione: Crittografare e Isolare etcd

  1. Crittografia a Riposo: Abilita la crittografia per i secret in etcd in modo che, se il disco viene rubato o acceduto, i secret siano inutili.
  2. Mutual TLS (mTLS): Assicurati che l'API server ed etcd comunichino utilizzando certificati. Nessuno dovrebbe essere in grado di comunicare con etcd senza un certificato client valido.
  3. Isolamento di Rete: etcd dovrebbe trovarsi su una rete completamente separata o essere protetto da regole firewall rigorose in modo che solo l'API server possa raggiungerlo.

Gestire i Secret senza il "Secret"

Il nome Secret in Kubernetes è un po' una bugia. Per impostazione predefinita, i secret di Kubernetes sono solo codificati in base64, non crittografati. Chiunque abbia accesso all'API o al backup di etcd può decodificare la password del tuo database in circa due secondi usando un semplice comando da terminale: echo "base64-string" | base64 --decode.

Archiviare i Secret in Git (Il Peccato Ultimo)

Succede più spesso di quanto la gente ammetta. Uno sviluppatore inserisce un file secret.yaml in un repository Git "solo per qualche minuto" per aiutare un collega, e poi si dimentica di eliminarlo. Ora, quella password vive nella cronologia di Git per sempre.

La Soluzione: Gestione Esterna dei Secret Smetti di usare i secret nativi di K8s per i dati sensibili. Utilizza invece un gestore di secret dedicato.

  • HashiCorp Vault: Lo standard del settore. Fornisce segreti dinamici e un controllo degli accessi rigoroso.
  • AWS Secrets Manager / Azure Key Vault / GCP Secret Manager: Ottimo se sei già vincolato a un provider cloud.

Per integrarli con Kubernetes, usa strumenti come External Secrets Operator (ESO) o Secrets Store CSI Driver. Questi strumenti estraggono il segreto dal vault esterno e lo iniettano nel pod come volume o come segreto K8s temporaneo, assicurando che la vera "fonte di verità" non risieda mai nei tuoi file YAML o in Git.

Rotazione dei Segreti

La maggior parte dei team imposta una password e la lascia per tre anni. Se quella password viene divulgata, l'attaccante ha una backdoor permanente.

La Soluzione: Rotazione Automatica Se utilizzi un gestore esterno come Vault, puoi implementare la rotazione automatica. Il gestore dei segreti aggiorna la password nel database e poi aggiorna il valore in Kubernetes. Poiché l'applicazione legge il segreto da un volume o tramite un'API, acquisisce la nuova password senza la necessità di un redeploy completo.

Limiti delle Risorse e il Problema del "Vicino Rumoroso"

Sebbene non sia una misconfigurazione di "sicurezza" nel senso tradizionale, la mancata impostazione dei limiti delle risorse è un rischio per la stabilità e la disponibilità. In Kubernetes, se un pod si comporta in modo anomalo e inizia a consumare tutta la CPU o la RAM su un nodo, può privare altre pod—inclusi componenti di sistema critici—portando a un crash del nodo. Questo è essenzialmente un Denial of Service (DoS) auto-inflitto.

Il Pericolo dei Pod "Illimitati"

Se non definisci resources.limits, un pod può utilizzare tutte le risorse del nodo che desidera. Se hai una perdita di memoria in una delle tue applicazioni, consumerà lentamente tutta la RAM sul nodo finché il killer OOM (Out of Memory) di Linux non inizierà a terminare i processi. Il problema? Il killer OOM potrebbe terminare prima il tuo pod più importante.

La Soluzione: Imposta Richieste e Limiti Ogni container dovrebbe avere una request (ciò di cui ha bisogno per avviarsi) e un limit (il massimo che gli è consentito utilizzare).

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
  • Richieste: Utilizzate dallo scheduler per trovare un nodo con spazio sufficiente.
  • Limiti: Applicati dal runtime del container per impedire al pod di monopolizzare il nodo.

Gestione del Throttling della CPU

Fai attenzione ai limiti della CPU. A differenza della memoria (dove il raggiungimento di un limite termina il pod), il raggiungimento di un limite della CPU si limita ad "applicare un throttling" al pod. La tua applicazione diventerà lenta, ma non si bloccherà. Se riscontri un'elevata latenza nelle tue applicazioni, controlla le metriche di Prometheus per il throttling della CPU. Potrebbe essere necessario aumentare i limiti o ottimizzare il codice.

Sicurezza delle Immagini e Rischi della Supply Chain

Il tuo cluster è sicuro solo quanto le immagini che vi esegui. Se stai scaricando my-app:latest da un registro pubblico, stai essenzialmente eseguendo codice scritto da uno sconosciuto sulla tua infrastruttura di produzione.

Utilizzo del Tag :latest

L'utilizzo di :latest è una ricetta per il disastro. Non hai idea di quale versione del codice sia effettivamente in esecuzione. Quando un pod si riavvia, potrebbe scaricare una nuova versione dell'immagine che contiene una modifica incompatibile o, peggio, un payload malevolo.

La Soluzione: Usa Tag Immutabili o Digest Usa sempre un tag di versione specifico (ad esempio, my-app:v1.2.3) o, per la massima sicurezza, il digest SHA256 dell'immagine. Ciò garantisce che gli stessi identici byte vengano distribuiti ogni singola volta.

Esecuzione di Immagini da Registri Non Affidabili

I registri pubblici sono pieni di immagini "typo-squatted"—immagini che assomigliano a quelle popolari ma contengono malware.

La Soluzione: Registro Privato e Scansione delle Immagini

  1. Usa un Registro Privato: Scarica le immagini pubbliche, scansionalle e poi caricale nel tuo registro privato (come ECR, ACR o Harbor).
  2. Scansione Automatica: Utilizza uno scanner come Trivy o Clair per verificare la presenza di CVE (Common Vulnerabilities and Exposures) note nelle tue immagini.
  3. Admission Controllers: Utilizza uno strumento come Kyverno o OPA (Open Policy Agent) per impedire il deployment di qualsiasi immagine che non sia stata scansionata o che contenga vulnerabilità "Critiche".

Una Checklist Completa per l'Hardening di Kubernetes

Per rendere tutto ciò operativo, ecco una checklist riassuntiva che puoi utilizzare durante il tuo prossimo sprint o la revisione di sicurezza.

RBAC & Accesso

  • Nessun service account concesso con cluster-admin (a meno che non sia assolutamente necessario).
  • Nessuna app che utilizzi il service account default.
  • automountServiceAccountToken: false impostato per i pod che non necessitano di accesso API.
  • L'API Server non è esposto a internet pubblico.
  • L'autenticazione anonima è disabilitata sull'API server.

Sicurezza dei Pod

  • privileged: true è proibito per i pod delle applicazioni.
  • runAsNonRoot: true e runAsUser sono definiti per tutti i container.
  • readOnlyRootFilesystem: true è abilitato ove possibile.
  • limits e requests di CPU e Memoria sono impostati per ogni container.

Sicurezza di Rete

  • Una NetworkPolicy default-deny-all è in atto per ogni namespace.
  • Regole "Allow" esplicite sono utilizzate per il traffico service-to-service necessario.
  • Il traffico in uscita (Egress) è limitato a endpoint noti e richiesti.

Dati & Segreti

  • Nessun segreto archiviato nei repository Git.
  • I segreti sono gestiti tramite un vault esterno (Vault, AWS SM, ecc.).
  • I segreti sono crittografati a riposo in etcd.
  • etcd è isolato e richiede mTLS per la comunicazione.

Catena di Fornitura

  • Le immagini sono scaricate da un registro privato e fidato.
  • Nessuna immagine utilizza il tag :latest in produzione.
  • Tutte le immagini sono scansionate per CVE prima del deployment.
  • Un admission controller blocca le immagini non conformi.

Scenari Comuni di Errata Configurazione: Prima e Dopo

Per darti un quadro più chiaro di come queste soluzioni appaiono in pratica, esaminiamo alcuni scenari "Prima e Dopo".

Scenario 1: Il Deployment "Pigro"

Prima: Uno sviluppatore deploya una semplice API Node.js. Utilizza il service account predefinito, esegue come root, non ha limiti di risorse e nessuna policy di rete.

  • Rischio: Una vulnerabilità in un pacchetto Node consente a un attaccante di ottenere una shell. Poiché sono root e hanno un token predefinito, possono sondare la rete interna, trovare il database e potenzialmente escalare i privilegi al nodo.

Dopo:

  • Usa un ServiceAccount personalizzato senza permessi API.
  • Imposta runAsNonRoot: true.
  • Definisci i limiti di cpu e memory.
  • Applica una NetworkPolicy che consenta il traffico solo dall'Ingress Controller.
  • Risultato: Anche se l'attaccante ottiene una shell, è un utente con privilegi limitati, non può comunicare con altri pod e non può causare il crash del nodo consumando tutta la RAM.

Scenario 2: La fuga di "Secret"

Prima: Il team memorizza la password del database in un Kubernetes Secret creato da un file YAML locale. Il file YAML è stato accidentalmente commesso in un branch di funzionalità.

  • Rischio: Chiunque abbia accesso in lettura alla cronologia Git ora possiede la password del database di produzione.

Dopo:

  • Sposta la password in AWS Secrets Manager.
  • Installa l'External Secrets Operator.
  • Il secret di K8s è ora un "ombra" del secret di AWS e non viene mai memorizzato in Git.
  • Risultato: Il secret è centralizzato, ruotato automaticamente e non tocca mai il disco locale di uno sviluppatore in chiaro.

Domande Frequenti (FAQ)

1. L'impostazione dei limiti di risorse non causerà il crash dei miei pod?

Sì, se imposti il limite di memoria troppo basso, il tuo pod verrà OOMKilled. Questo è in realtà un bene: è meglio che un pod si arresti e si riavvii piuttosto che un pod causi il crash dell'intero nodo fisico. Il trucco è monitorare l'utilizzo effettivo della tua app utilizzando strumenti come Prometheus e Grafana, quindi impostare i limiti leggermente al di sopra dell'utilizzo di picco.

2. È davvero necessario utilizzare una Service Mesh per la sicurezza di rete?

Per cluster di piccole dimensioni, una Service Mesh (come Istio) potrebbe essere eccessiva. Le NetworkPolicies standard di Kubernetes sono solitamente sufficienti per coprire l'80% delle esigenze. Tuttavia, se hai bisogno di funzionalità avanzate come il mutual TLS (mTLS) tra tutti i servizi o la suddivisione complessa del traffico, una service mesh è la scelta giusta.

3. Come posso trovare tutte le mie attuali errate configurazioni senza controllare ogni file YAML?

Fare questo manualmente è impossibile una volta che hai più di poche app. Dovresti usare strumenti automatizzati. Strumenti come kube-bench (che verifica rispetto ai benchmark CIS) e kube-hunter sono ottimi per trovare vulnerabilità. Per una visione più continua, "dal punto di vista dell'attaccante", del tuo cluster, una piattaforma come Penetrify può mappare automaticamente la tua superficie di attacco e trovare i percorsi che un attaccante intraprenderebbe.

4. runAsNonRoot funziona se l'immagine è stata creata come root?

Se imposti runAsNonRoot: true e i metadati dell'immagine indicano che viene eseguita come root (UID 0), Kubernetes si rifiuterà di avviare il pod. Devi tornare al Dockerfile e aggiungere un utente (ad esempio, RUN useradd -u 1000 appuser && USER appuser).

5. Posso applicare queste impostazioni di sicurezza a un cluster esistente senza tempi di inattività?

Sì, ma fallo con attenzione. Non applicare una policy di rete default-deny-all all'intero namespace di produzione in una volta sola, altrimenti metterai offline l'intero sito. Applica le policy un servizio alla volta. Allo stesso modo, testa le modifiche al tuo securityContext in un ambiente di staging per assicurarti che la tua app non necessiti di un permesso di root specifico per scrivere in una cartella.

Passare dalla Sicurezza Reattiva a quella Proattiva

Correggere le errate configurazioni è una battaglia costante. Man mano che aggiungi più servizi, più sviluppatori e integrazioni più complesse, la "superficie di sicurezza" del tuo cluster cresce. Se ti affidi a una checklist manuale o a un audit una volta all'anno, stai essenzialmente giocando a un gioco del tipo whack-a-mole dove la talpa ha un lanciarazzi.

L'obiettivo dovrebbe essere quello di passare da uno stato reattivo—in cui si risolvono i problemi dopo che sono stati segnalati—a uno stato proattivo. Ciò significa integrare la sicurezza nella tua pipeline CI/CD (DevSecOps) e utilizzare il testing continuo.

L'automazione è l'unico modo per tenere il passo con la velocità di Kubernetes. Quando puoi scansionare automaticamente i tuoi manifest per privileged: true prima ancora che raggiungano il cluster, hai vinto metà della battaglia. Quando utilizzi uno strumento come Penetrify per simulare continuamente attacchi sul tuo ambiente, non stai più indovinando se le tue policy di rete funzionano—hai la prova.

Ricorda, la sicurezza non è una destinazione; è un processo di riduzione del rischio. Non avrai mai un cluster "sicuro al 100%", ma risolvendo queste comuni misconfigurazioni, lo rendi così costoso e difficile per un attaccante che probabilmente si sposterà su un obiettivo più facile.

Pronto a smettere di fare supposizioni sulla sicurezza del tuo cluster? Non aspettare una violazione per scoprire che il tuo RBAC è troppo aperto o che le tue policy di rete hanno delle falle. Visita Penetrify per scoprire come il testing di sicurezza automatizzato e on-demand può aiutarti a trovare e risolvere le vulnerabilità in tempo reale, mantenendo la tua infrastruttura cloud-native veramente sicura.

Torna al Blog