Protezione del motore Kubernetes
Questo argomento fornisce suggerimenti sulla sicurezza per l'utilizzo del motore Kubernetes di Oracle Cloud Infrastructure (noto anche come OKE).
Cluster multi-tenant
Carichi di lavoro che si sfidano reciprocamente
Al momento, si sconsiglia di eseguire carichi di lavoro non attendibili reciprocamente nello stesso cluster. Ad esempio, non eseguire i seguenti carichi di lavoro nello stesso cluster:
- Carichi di lavoro di sviluppo e di produzione
- Piano di controllo e piano dati
- Carichi di lavoro che eseguono codice cliente arbitrario
Carichi di lavoro con diversi livelli di affidabilità
Prendere in considerazione la possibilità di avere cluster separati se si dispone di più tenant, team o utenti che accedono allo stesso cluster con livelli di attendibilità diversi. Come indicato nelle sezioni successive, Kubernetes e OKE offrono metodi per isolare i carichi di lavoro. Tuttavia, questi metodi non sono attualmente sufficienti per la multi-tenancy disco rigido.
Kubelet ha accesso in lettura alle risorse
Un kubelet in esecuzione su un nodo di lavoro in un cluster creato da OKE non può modificare le risorse che non appartengono al nodo del kubelet. Per ulteriori informazioni, consulta i dettagli sul controller di ammissione NodeRestriction nella documentazione di Kubernetes.
Si noti, in particolare quando si eseguono carichi di lavoro multi-tenant, che anche se un kubelet non può modificare le risorse che non appartengono al suo nodo, il kubelet può comunque leggere tali risorse. Tali risorse possono includere:
- servizi
- endpoint
- nodi
- pod
- segreti, configmap e volumi persistenti associati al nodo del kubelet
Per ulteriori informazioni, consulta la sezione relativa all'uso dell'autorizzazione nodo nella documentazione di Kubernetes.
Cifra segreti a riposo in eccd
Per informazioni sulla configurazione della cifratura segreta, vedere Cifratura dei segreti Kubernetes in archivio.
Controllo dell'accesso basato su ruoli (RBAC)
Kubernetes include un componente Role-Based Access Control (RBAC) integrato che abbina un utente o un gruppo in entrata a un set di autorizzazioni raggruppate in ruoli. Queste autorizzazioni combinano i verbi (ottenere, creare, eliminare) con le risorse (pod, servizi, nodi) e possono essere definite come spazio di nomi o cluster. Viene fornito un set di ruoli preconfigurati che offrono una ragionevole separazione di responsabilità predefinita, a seconda delle azioni che un client potrebbe voler eseguire.
È importante capire come gli aggiornamenti su un oggetto possono causare azioni in altre posizioni. Ad esempio, un utente potrebbe non essere in grado di creare pod direttamente, ma consentire loro di creare una distribuzione, che crea pod per loro conto, consentirà loro di creare tali pod indirettamente. Allo stesso modo, l'eliminazione di un nodo dall'API comporterà l'arresto e la ricreazione dei pod pianificati in tale nodo su altri nodi. I ruoli preconfigurati rappresentano un equilibrio tra flessibilità e casi d'uso comuni, ma i ruoli più limitati devono essere esaminati attentamente per evitare l'escalation accidentale dei privilegi. È possibile rendere i ruoli specifici per il proprio caso d'uso se i ruoli preconfigurati non soddisfano le proprie esigenze.
Dovresti sempre seguire il principio del privilegio minimo per garantire che gli utenti e gli account di servizio Kubernetes dispongano del set minimo di privilegi necessari. Per impostazione predefinita, qualsiasi utente con accesso USE CLUSTER in IAM di Oracle Cloud Infrastructure o in un account di servizio Kubernetes non avrà accesso all'API Kubernetes, ad eccezione dei ruoli di rilevamento. Per informazioni sull'integrazione di IAM con OKE, vedere Informazioni sul controllo dell'accesso e sul motore Kubernetes (OKE).
È necessario utilizzare l'OCID del principal durante la creazione delle associazioni RBAC (ad esempio, OCID utente, OCID istanza e nome servizio).
Sicurezza cluster
Puoi controllare le operazioni che i pod possono eseguire su un cluster creato con Kubernetes Engine impostando i criteri di sicurezza dei pod per il cluster. I criteri di sicurezza dei pod sono un modo per garantire che i pod soddisfino le condizioni relative alla sicurezza prima che possano essere accettati da un cluster. Ad esempio, è possibile utilizzare i criteri di sicurezza pod per:
- limitare le scelte di storage disponibili per i pod
- limitare la rete dell'host e le porte a cui i pod possono accedere
- impedire l'esecuzione dei pod come utente root
- impedire l'esecuzione dei pod in modalità privilegiata
Dopo aver definito un criterio di sicurezza pod per un cluster, è necessario autorizzare l'utente o il pod richiedente a utilizzare il criterio creando ruoli e associazioni. È quindi possibile specificare se un cluster applica i criteri di sicurezza pod definiti per tale cluster abilitando il controller di ammissione PodSecurityPolicy del cluster.
Per ulteriori informazioni, vedere Utilizzo dei criteri di sicurezza pod con Kubernetes Engine (OKE).
I criteri di sicurezza dei pod non più validi del progetto Kubernetes a monte in Kubernetes versione 1.21 e hanno rimosso la funzione in Kubernetes versione 1.25. Di conseguenza, Kubernetes Engine non supporta i criteri di sicurezza dei pod e il controller di ammissione PodSecurityPolicy nei cluster su cui è in esecuzione Kubernetes versione 1.25 e successive.
Se hai bisogno di funzionalità simili, prendi in considerazione l'utilizzo degli standard di sicurezza dei pod Kubernetes e del controller di ammissione PodSecurity (insieme ai criteri Privileged, Baseline e Restricted). Per impostazione predefinita, Kubernetes Engine abilita il controller di ammissione PodSecurity nei cluster su cui è in esecuzione Kubernetes versione 1.23 e successive, al fine di supportare gli standard di sicurezza dei pod. Per ulteriori informazioni sugli standard di sicurezza dei pod Kubernetes e sul controller di ammissione PodSecurity, vedere Pod Security Standards nella documentazione di Kubernetes.
In alternativa, prendi in considerazione l'utilizzo di altre alternative in fase di sviluppo nell'ecosistema Kubernetes per applicare i criteri.
Se si decide di passare dall'utilizzo dei criteri di sicurezza dei pod e del controller di ammissione PodSecurityPolicy all'utilizzo degli standard di sicurezza dei pod e del controller di ammissione PodSecurity, vedere Eseguire la migrazione da PodSecurityPolicy al controller di ammissione PodSecurity integrato nella documentazione Kubernetes. Tenere presente che è importante completare la migrazione prima di creare un nuovo cluster su cui è in esecuzione Kubernetes versione 1.25 o prima di eseguire l'upgrade di un cluster Kubernetes versione 1.24 esistente per eseguire Kubernetes versione 1.25. Tenere inoltre presente che la console fornisce un modo conveniente per disabilitare l'uso del controller di ammissione PodSecurityPolicy nei cluster Kubernetes esistenti creati e gestiti da Kubernetes Engine (vedere Uso della console per disabilitare il controller di ammissione PodSecurityPolicy).
Sicurezza pool di nodi
Compartimenti pool di nodi
I pool di nodi in un cluster possono estendersi su compartimenti. Tuttavia, sebbene l'uso di più compartimenti offra un modo conveniente per raggruppare e gestire i nodi di lavoro, non fornisce alcun isolamento tra i nodi di lavoro nel cluster. È possibile pianificare qualsiasi carico di lavoro in qualsiasi pool di nodi, indipendentemente dal compartimento. Un caso d'uso valido per l'uso di più compartimenti per un pool di nodi consiste nel creare facilmente gruppi dinamici e criteri IAM per i nodi di lavoro. Un caso d'uso non valido per più compartimenti potrebbe consistere nel mettere ogni pool di nodi in cui è in esecuzione un carico di lavoro del cliente in un compartimento separato presupponendo che i compartimenti forniscano un certo tipo di limite o isolamento di sicurezza.
Subnet pool di nodi
Si consiglia di utilizzare solo subnet private per i pool di nodi. È necessario configurare un service gateway per fornire l'accesso ai servizi Oracle Cloud Infrastructure. Non è possibile utilizzare un gateway di servizi se le subnet sono pubbliche con un gateway Internet . Se le subnet private richiedono l'accesso a Internet, utilizzare un gateway NAT .
Controllo dell'accesso ai pod dei nodi
Per impostazione predefinita, è possibile pianificare un pod in qualsiasi nodo del cluster. Kubernetes offre un rich set di criteri per il controllo del posizionamento dei pod sui nodi e il posizionamento e la rimozione dei pod basati sui tint disponibili per gli utenti finali. Per molti cluster, l'uso di questi criteri per separare i carichi di lavoro può essere una convenzione che gli autori adottano o applicano tramite gli strumenti. Questi controlli di posizionamento non sono adeguati in un ambiente multi-tenant quando gli utenti con funzionalità di distribuzione non sono attendibili. Se si dispone di utenti non attendibili che distribuiscono il codice, è necessario considerare un cluster per gruppo non attendibile.
Limita accesso fornito ai principal delle istanze
Per impostazione predefinita, tutti i pod su un nodo sono in grado di accedere ai certificati dei principal dell'istanza utilizzando l'endpoint dei metadati dell'istanza. Per evitare l'escalation dei privilegi tramite i principal delle istanze, è necessario isolare i carichi di lavoro tra pool di nodi con gruppi dinamici diversi in modo che i pod in un determinato pool di nodi abbiano il set minimo di privilegi necessari per funzionare.
Ad esempio, si supponga di disporre dei due carichi di lavoro seguenti, che richiedono entrambi un accesso diverso:
- LogArchiver: richiede l'accesso per gestire i bucket e gli oggetti nello storage degli oggetti
- HostMonitor: richiede l'accesso all'API di computazione per gestire le istanze
L'approccio più semplice consiste nel pianificarle nello stesso pool di nodi e fornire al principal dell'istanza tutto l'accesso necessario. Tuttavia, ciò aumenta l'impatto nel caso in cui uno dei carichi di lavoro venga compromesso. Un approccio migliore sarebbe quello di pianificare i carichi di lavoro su pool di nodi separati con il set limitato di accesso richiesto dai principal dell'istanza per il carico di lavoro applicabile.
Blocca accesso contenitore a metadati istanza
Il modo preferito per bloccare l'accesso è utilizzare un plugin dei criteri di rete con un criterio predefinito "nega tutto". Successivamente, concederesti esplicitamente l'accesso a pod e reti utilizzando le risorse NetworkPolicy in Kubernetes tramite i selettori di etichette. Se non si dispone di un plugin dei criteri di rete installato, è possibile utilizzare una regola IPTables per limitare l'accesso da tutti i pod sull'host. Si consiglia di non utilizzare questo approccio per bloccare un sottoinsieme di pod su un host.
Importante: la regola NetworkPolicys e la seguente regola IPTable si applicano solo ai contenitori nella rete di overlay pod. I contenitori e i servizi in esecuzione nella rete host non sono interessati da nessuna delle due opzioni:
iptables --insert FORWARD 1 --in-interface veth+ --destination 169.254.0.0/16 --jump DROPSicurezza della rete
I pod in esecuzione nel cluster OKE spesso devono comunicare con altri pod nel cluster o con servizi esterni al cluster. Il motore Kubernetes offre più opzioni per proteggere la comunicazione da e verso i carichi di lavoro nel cluster. Per ottimizzare le impostazioni di sicurezza di rete, è necessario valutare utilizzando una combinazione di criteri di rete (per proteggere la comunicazione di rete a livello di pod) e di elenchi di sicurezza (per proteggere la comunicazione di rete a livello di host).
Criteri di rete
I criteri di rete in Kubernetes consentono agli amministratori di definire in che modo i gruppi di pod sono in grado di comunicare con altri pod nel cluster. Inoltre, i criteri di rete consentono di definire il modo in cui i gruppi di pod sono in grado di comunicare con i servizi esterni al cluster (ad esempio, i servizi Oracle Cloud Infrastructure).
Per limitare l'accesso mediante criteri di rete, è necessario installare un plugin di rete. I plugin di rete configurano e applicano i criteri di rete definiti in Kubernetes. Sono disponibili numerose opzioni di plugin di rete. Puoi seguire le nostre istruzioni qui per installare e configurare Calico nel tuo cluster. I plugin dei criteri di rete funzionano limitando l'accesso all'host. Per informazioni sull'installazione di Calico in OKE, vedere Esempio: installazione di Calico e configurazione dei criteri di rete.
Liste di sicurezza del pool di nodi
Gli amministratori di rete possono definire le regole della lista di sicurezza nelle subnet del pool di nodi per limitare l'accesso ai nodi di lavoro e da essi. La definizione delle regole della lista di sicurezza consente agli amministratori di applicare limitazioni di rete che non possono essere sostituite sugli host nel cluster.
Poiché tutte le comunicazioni da pod a pod si verificano in una rete di overlay VXLAN sui nodi di lavoro, non è possibile utilizzare le regole della lista di sicurezza per limitare la comunicazione da pod a pod. Tuttavia, è possibile utilizzare le liste di sicurezza per limitare l'accesso ai nodi di lavoro e da essi.
Importante: è necessario che nelle subnet del pool di nodi esista un set minimo di regole della lista di sicurezza per garantire il funzionamento del cluster. Per informazioni sul set minimo di regole della lista di sicurezza prima di modificare le regole della lista di sicurezza, vedere Esempio di configurazioni delle risorse di rete.
Procedure ottimali di sicurezza dei carichi di lavoro
Usa digest immagine anziché tag
Si consiglia di estrarre solo le immagini utilizzando i digest di immagine e di non estrarre le immagini utilizzando i tag (perché i tag di immagine sono modificabili). I digest immagine sono il digest sha256 dell'immagine, che consente al docker di verificare che l'immagine scaricata sia quella prevista.
Esempio di ID digest immagine:
sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
Trascinare l'immagine come mostrato nell'esempio riportato di seguito.
docker pull acme@sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
È possibile utilizzare il seguente comando per visualizzare tutti i digest per le immagini locali:
docker images --digestsLimita utilizzo risorse
La quota risorsa limita il numero o la capacità delle risorse concesse a uno spazio di nomi. Questo viene spesso utilizzato per limitare la quantità di CPU, memoria o disco persistente che uno spazio di nomi può allocare, ma può anche controllare quanti pod, servizi o volumi esistono in ogni spazio di nomi.
Limita intervalli limita la dimensione massima o minima di alcune delle risorse precedenti, per evitare che gli utenti richiedano valori irragionevolmente alti o bassi per risorse comunemente riservate come la memoria o per fornire limiti predefiniti quando non ne viene specificata alcuna.
L'accesso alle quote delle risorse può essere limitato tramite i criteri RBAC in Kubernetes. Ciò può aiutare un amministratore a garantire che gli utenti di un cluster non siano in grado di utilizzare risorse a cui non dovrebbero avere accesso. Per ulteriori informazioni, consulta la sezione Limitazione dell'uso delle risorse in un cluster nella documentazione di Kubernetes.
Disabilitazione del componente aggiuntivo Tiller
OKE offre un componente aggiuntivo opzionale Tiller. Ciò fornisce un modo semplice per installare e utilizzare Helm+Tiller, consentendo di eseguire rapidamente il provisioning e l'esecuzione di Kubernetes. Si sconsiglia di utilizzare questo componente aggiuntivo per i cluster di produzione a causa dei rischi per la sicurezza associati a Tiller. I cluster di cui è stato eseguito il provisioning con Tiller non dispongono dell'autenticazione o dell'autorizzazione per le chiamate API effettuate a Tiller, il che significa che non possono fornire l'attribuzione per le richieste. Pertanto, qualsiasi operatore o servizio in grado di raggiungere Tiller può richiamare le proprie API con accesso Tiller.
Per risolvere i problemi di sicurezza associati a Tiller, è stato sviluppato Helm V3. La release V3 di Helm Tiller è stato completamente rimosso da Helm. Si consiglia di utilizzare Helm V3 se si desidera utilizzare le funzionalità offerte da Helm+Tiller.
Per disabilitare il componente aggiuntivo Tiller in un cluster esistente, contattare il Supporto Oracle.
Disabilitazione del componente aggiuntivo dashboard Kubernetes
OKE offre un componente aggiuntivo facoltativo del dashboard Kubernetes, che fornisce un modo semplice per installare il dashboard Kubernetes. Il dashboard Kubernetes viene installato da OKE con il set minimo di privilegi necessari per l'esecuzione. Non sarà possibile utilizzare il dashboard senza fornire credenziali aggiuntive. Per ulteriori informazioni, vedere Accesso a un cluster mediante il dashboard Kubernetes.
Il dashboard è particolarmente utile per i nuovi utenti Kubernetes. Tuttavia, si sconsiglia di installare questo componente aggiuntivo sui cluster di produzione a causa della mancanza di supporto per l'autenticazione estensibile. Di conseguenza, non è possibile specificare che si desidera installare il dashboard Kubernetes quando si crea un cluster utilizzando la console. Se si decide di installare il dashboard Kubernetes, creare il cluster utilizzando l'API e impostare l'attributo isKubernetesDashboardEnabled su true.
Se installi il dashboard Kubernetes, ti consigliamo di limitare l'accesso all'interno del cluster invece di esporlo esternamente tramite un load balancer o un controller in entrata. Il dashboard Kubernetes è un vettore di attacco comune utilizzato per accedere a un cluster Kubernetes.
Per disabilitare il componente aggiuntivo del dashboard Kubernetes in un cluster esistente, contattare il Supporto Oracle.