Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Protezione dell'infrastruttura (host)
Per quanto sia importante proteggere le immagini dei container, è altrettanto importante salvaguardare l'infrastruttura che le gestisce. Questa sezione esplora diversi modi per mitigare i rischi derivanti dagli attacchi lanciati direttamente contro l'host. Queste linee guida devono essere utilizzate insieme a quelle descritte nella sezione Runtime Security.
Raccomandazioni
Utilizza un sistema operativo ottimizzato per l'esecuzione di contenitori
Prendi in considerazione l'utilizzo di Flatcar Linux, Project Atomic, RancherOS e Bottlerocket
In alternativa, utilizza l'AMI ottimizzata EKS per i nodi di lavoro Kubernetes. L'AMI ottimizzata per EKS viene rilasciata regolarmente e contiene un set minimo di pacchetti e binari del sistema operativo necessari per eseguire i carichi di lavoro containerizzati.
Consulta la specifica di build Amazon EKS AMI RHEL
Mantieni aggiornato il tuo sistema operativo Worker Node
Indipendentemente dal fatto che utilizzi un sistema operativo host ottimizzato per contenitori come Bottlerocket o un Amazon Machine Image più grande, ma comunque minimalista, come EKS ottimizzato AMIs, è consigliabile mantenere queste immagini del sistema operativo host aggiornate con le ultime patch di sicurezza.
Per l'ottimizzazione per EKS AMIs, controlla regolarmente il canale CHANGELOG
Trattate la vostra infrastruttura come immutabile e automatizzate la sostituzione dei nodi di lavoro
Anziché eseguire aggiornamenti sul posto, sostituisci i tuoi dipendenti quando diventa disponibile una nuova patch o un aggiornamento. Questo può essere affrontato in un paio di modi. Puoi aggiungere istanze a un gruppo di scalabilità automatica esistente utilizzando l'AMI più recente mentre cordoni e dreni i nodi in sequenza fino a quando tutti i nodi del gruppo non siano stati sostituiti con l'AMI più recente. In alternativa, puoi aggiungere istanze a un nuovo gruppo di nodi mentre cordoni e svuoti in sequenza i nodi del vecchio gruppo di nodi fino alla sostituzione di tutti i nodi. I gruppi di nodi gestiti da EKS utilizzano il primo approccio e visualizzeranno un messaggio nella console per aggiornare i lavoratori quando sarà disponibile una nuova AMI. eksctl
ha anche un meccanismo per creare gruppi di nodi con l'AMI più recente e per isolare e drenare con eleganza i pod dai gruppi di nodi prima che le istanze vengano terminate. Se si decide di utilizzare un metodo diverso per sostituire i nodi di lavoro, si consiglia vivamente di automatizzare il processo per ridurre al minimo la supervisione umana, poiché probabilmente sarà necessario sostituire i lavoratori regolarmente man mano che ne vengono rilasciati di nuovi updates/patches e quando il piano di controllo viene aggiornato.
Con EKS Fargate, AWS aggiornerà automaticamente l'infrastruttura sottostante non appena gli aggiornamenti saranno disponibili. Spesso questa operazione può essere eseguita senza problemi, ma a volte un aggiornamento può causare la riprogrammazione del pod. Pertanto, ti consigliamo di creare distribuzioni con più repliche quando esegui l'applicazione come pod Fargate.
Esegui periodicamente kube-bench per verificare la conformità ai benchmark CIS per Kubernetes
kube-bench è un progetto open source di Aqua che valuta il cluster rispetto ai benchmark CIS per Kubernetes. Il benchmark descrive le migliori pratiche per proteggere i cluster Kubernetes non gestiti. Il benchmark CIS Kubernetes comprende il piano di controllo e il piano dati. Poiché Amazon EKS fornisce un piano di controllo completamente gestito, non tutti i consigli del benchmark CIS Kubernetes sono applicabili. Per garantire che questo ambito rifletta il modo in cui viene implementato Amazon EKS, AWS ha creato il benchmark CIS Amazon EKS. Il benchmark EKS eredita da CIS Kubernetes Benchmark con input aggiuntivi dalla community con considerazioni specifiche sulla configurazione per i cluster EKS.
Quando esegui kube-bench
Riduci al minimo l'accesso ai nodi di lavoro
Invece di abilitare l'accesso SSH, usa SSM Session Manager quando devi accedere in remoto a un host. A differenza delle chiavi SSH che possono essere perse, copiate o condivise, Session Manager consente di controllare l'accesso alle EC2 istanze utilizzando IAM. Inoltre, fornisce un audit trail e un registro dei comandi eseguiti sull'istanza.
A partire dal 19 agosto 2020, i gruppi di nodi gestiti supportano modelli personalizzati AMIs e di EC2 lancio. Ciò consente di incorporare l'agente SSM nell'AMI o installarlo mentre il nodo di lavoro viene avviato. Se preferisci non modificare l'AMI ottimizzata o il modello di avvio di ASG, puoi installare l'agente SSM con un DaemonSet as in questo
Policy IAM minima per l'accesso SSH basato su SSM
La policy gestita da AmazonSSMManagedInstanceCore
AWS contiene una serie di autorizzazioni che non sono necessarie per SSM Session Manager/SSM RunCommand se stai solo cercando di evitare l'accesso SSH. In particolare, sono preoccupanti *
le autorizzazioni ssm:GetParameter(s)
che consentirebbero al ruolo di accedere a tutti i parametri in Parameter Store (inclusa SecureStrings la chiave AWS managed KMS configurata).
La seguente policy IAM contiene il set minimo di autorizzazioni per abilitare l'accesso ai nodi tramite SSM Systems Manager.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableAccessViaSSMSessionManager", "Effect": "Allow", "Action": [ "ssmmessages:OpenDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:CreateControlChannel", "ssm:UpdateInstanceInformation" ], "Resource": "*" }, { "Sid": "EnableSSMRunCommand", "Effect": "Allow", "Action": [ "ssm:UpdateInstanceInformation", "ec2messages:SendReply", "ec2messages:GetMessages", "ec2messages:GetEndpoint", "ec2messages:FailMessage", "ec2messages:DeleteMessage", "ec2messages:AcknowledgeMessage" ], "Resource": "*" } ] }
Una volta implementata questa politica e installato il plug-in Session Manager, è possibile eseguire
aws ssm start-session --target [INSTANCE_ID_OF_EKS_NODE]
per accedere al nodo.
Nota
Potresti anche prendere in considerazione l'aggiunta di autorizzazioni per abilitare la registrazione di Session Manager.
Distribuisci i lavoratori su sottoreti private
Impiegando i lavoratori su sottoreti private, si riduce al minimo la loro esposizione a Internet, dove spesso hanno origine gli attacchi. A partire dal 22 aprile 2020, l'assegnazione di indirizzi IP pubblici ai nodi di un gruppo di nodi gestiti sarà controllata dalla sottorete in cui vengono distribuiti. In precedenza, ai nodi di un gruppo di nodi gestiti veniva assegnato automaticamente un IP pubblico. Se scegli di distribuire i nodi di lavoro su sottoreti pubbliche, implementa regole restrittive dei gruppi di sicurezza AWS per limitarne l'esposizione.
Esegui Amazon Inspector per valutare gli host in termini di esposizione, vulnerabilità e deviazioni dalle best practice
Puoi utilizzare Amazon Inspector per verificare eventuali accessi di rete non intenzionali ai tuoi nodi e le vulnerabilità nelle istanze Amazon sottostanti. EC2
Amazon Inspector può fornire dati CVE (Common Vulnerabilities and Exposures) per le tue istanze Amazon solo se EC2 l'agente Amazon EC2 Systems Manager (SSM) è installato e abilitato. Questo agente è preinstallato su diverse Amazon Machine Images (AMIs), incluso Amazon Linux AMIs ottimizzato per EKS. Indipendentemente dallo stato dell'agente SSM, tutte le EC2 istanze Amazon vengono analizzate per individuare eventuali problemi di raggiungibilità della rete. Per ulteriori informazioni sulla configurazione delle scansioni per Amazon EC2, consulta Scansione delle istanze Amazon EC2 .
Importante
Inspector non può essere eseguito sull'infrastruttura utilizzata per eseguire i pod Fargate.
Alternative
Corri SELinux
Nota
Disponibile su Red Hat Enterprise Linux (RHEL), CentOS, Bottlerocket e Amazon Linux 2023
SELinux fornisce un ulteriore livello di sicurezza per mantenere i container isolati l'uno dall'altro e dall'host. SELinux consente agli amministratori di applicare i controlli di accesso obbligatori (MAC) per ogni utente, applicazione, processo e file. Immaginatelo come un backstop che limita le operazioni che possono essere eseguite a risorse specifiche sulla base di una serie di etichette. Su EKS, SELinux può essere usato per impedire ai container di accedere alle rispettive risorse.
Le SELinux politiche relative ai container sono definite nel pacchetto container-selinuxcontainer_t
etichetta che è un alias di. svirt_lxc_net_t
Queste politiche impediscono efficacemente ai container di accedere a determinate funzionalità dell'host.
Quando SELinux configuri per Docker, Docker etichetta automaticamente i carichi di lavoro container_t
in base al tipo e assegna a ciascun contenitore un livello MCS univoco. Questo isolerà i contenitori l'uno dall'altro. Se hai bisogno di restrizioni più flessibili, puoi creare il tuo profilo in SElinux cui concedere a un contenitore le autorizzazioni per aree specifiche del file system. Questo è simile al PSPs fatto che è possibile creare profili diversi per contenitori/pod diversi. Ad esempio, puoi avere un profilo per i carichi di lavoro generali con una serie di controlli restrittivi e un altro per gli elementi che richiedono un accesso privilegiato.
SELinux for Containers dispone di una serie di opzioni che possono essere configurate per modificare le restrizioni predefinite. I seguenti valori SELinux booleani possono essere abilitati o disabilitati in base alle esigenze:
Booleano | Predefinito | Descrizione |
---|---|---|
|
|
Consenti ai container di accedere alle porte privilegiate sull'host. Ad esempio, se disponi di un contenitore che deve mappare le porte su 443 o 80 sull'host. |
|
|
Consenti ai contenitori di gestire la configurazione di cgroup. Ad esempio, un contenitore che esegue systemd avrà bisogno che questo sia abilitato. |
|
|
Consenti ai contenitori di utilizzare un file system ceph. |
Per impostazione predefinita, i contenitori possono visualizzare /usr
e read/execute leggere la maggior parte dei contenuti. /etc
I file /var/lib/docker
sottostanti /var/lib/containers
hanno l'etichettacontainer_var_lib_t
. Per visualizzare un elenco completo delle etichette predefinite, consulta il file container.fc
docker container run -it \ -v /var/lib/docker/image/overlay2/repositories.json:/host/repositories.json \ centos:7 cat /host/repositories.json # cat: /host/repositories.json: Permission denied docker container run -it \ -v /etc/passwd:/host/etc/passwd \ centos:7 cat /host/etc/passwd # cat: /host/etc/passwd: Permission denied
I file etichettati con container_file_t
sono gli unici file scrivibili dai contenitori. Se si desidera che un volume mount sia scrivibile, è necessario specificare :z
o alla :Z
fine.
-
:z
rietichetterà i file in modo che il contenitore possa leggere/scrivere -
:Z
rietichetterà i file in modo che solo il contenitore possa leggere/scrivere
ls -Z /var/lib/misc # -rw-r--r--. root root system_u:object_r:var_lib_t:s0 postfix.aliasesdb-stamp docker container run -it \ -v /var/lib/misc:/host/var/lib/misc:z \ centos:7 echo "Relabeled!" ls -Z /var/lib/misc #-rw-r--r--. root root system_u:object_r:container_file_t:s0 postfix.aliasesdb-stamp
docker container run -it \ -v /var/log:/host/var/log:Z \ fluentbit:latest
In Kubernetes, la rietichettatura è leggermente diversa. Invece di far rietichettare automaticamente i file da Docker, puoi specificare un'etichetta MCS personalizzata per eseguire il pod. I volumi che supportano la rietichettatura verranno automaticamente rietichettati in modo da essere accessibili. I pod con un'etichetta MCS corrispondente potranno accedere al volume. Se hai bisogno di un isolamento rigoroso, imposta un'etichetta MCS diversa per ogni pod.
securityContext: seLinuxOptions: # Provide a unique MCS label per container # You can specify user, role, and type also # enforcement based on type and level (svert) level: s0:c144:c154
In questo esempio s0:c144:c154
corrisponde a un'etichetta MCS assegnata a un file a cui il contenitore può accedere.
Su EKS è possibile creare politiche che consentano l'esecuzione di contenitori privilegiati, come FluentD e creare SELinux una politica per consentirgli di leggere da /var/log sull'host senza dover rietichettare la directory host. I pod con la stessa etichetta saranno in grado di accedere agli stessi volumi host.
Abbiamo implementato esempi AMIs per Amazon EKS
avvertimento
SELinux ignorerà i contenitori in cui il tipo non è limitato.
Strumenti e risorse
-
SELinuxKubernetes RBAC e politiche di sicurezza delle spedizioni per applicazioni on-premise
-
Genera SELinux politiche per contenitori con Udica
descrive uno strumento che esamina i file delle specifiche dei container per le funzionalità, le porte e i punti di montaggio di Linux e genera una serie di SELinux regole che consentono al contenitore di funzionare correttamente -
Playbook AMI Hardening
per rafforzare il sistema operativo per soddisfare diversi requisiti normativi -
Keiko Upgrade Manager
è un progetto open source di Intuit che orchestra la rotazione dei nodi di lavoro.