Consigli su come mettere in sicurezza i propri container di Docker e monitorare il loro status.

Nell’ambito dello sviluppo di applicazioni web based a micro servizi spesso si fa ricorso ad un popolare software chiamato Docker, che permette di gestire molteplici contenitori in un unico ambiente, piuttosto che ricorrere a molteplici macchine virtuali. Vista la sua popolarità e comodità per lo sviluppo software, uno degli argomenti più importanti è sempre legato alla sicurezza dei suoi contenitori, poiché sono una fonte preziosa di processi informatici che potrebbero avere serie ripercussioni sia su chi sviluppa l’applicazione, che su chi ne è un semplice utente.

Ma andiamo con ordine e affrontiamo per gradi l’argomento.

docker security container
  1. Origini e principi di funzionamento di Docker
  2. Definizione di Container security
  3. Rischi nella sicurezza dei container e possibili soluzioni
  4. Traffico senza restrizioni e comunicazione con canali non sicuri
  5. Immagini di container vulnerabili e infettate da malware
  6. Accesso senza restrizioni
  7. Vulnerabilità nel kernel dell’host
  8. Alcune soluzioni per il monitoraggio per container

Origini e principi di funzionamento di Docker

Docker emerse nel 2013 come una sottocomponente di dotCloud, confluendo nelle visioni innovative di Solomon Hykes, Andrea Luzzardi, Francois-Xavier Bourlet e Jeff Lindsey. Hykes capì per primo le implicazioni rivoluzionarie di una soluzione PaaS (Platform as a Service), una piattaforma completamente disaccoppiata dall’hardware fisico e implementata su infrastrutture cloud.

In quanto piattaforma di sviluppo avanzata, Docker è concepita per facilitare l’orchestrazione di processi computazionali all’interno di container isolati e distribuibili con agilità. La piattaforma sfrutta meccanismi di isolamento di risorse intrinseci al kernel Linux, quali cgroup e namespace, per garantire che container multipli possano coesistere e operare simultaneamente su un’unica istanza di sistema operativo Linux, ottimizzando così il deployment delle applicazioni e la gestione delle risorse.

Questo lascia libere più risorse al sistema, in quanto viene virtualizzata una singola macchina con sopra una distribuzione Linux, anziché molteplici al tempo stesso. Inoltre, ciascun container di Docker non include al suo interno un sistema operativo a sé stante, ma si appoggia all’isolamento delle singole risorse, sfruttandole in maniera limitata per la singola istanza contenuta al suo interno.

Ciascun container è avviato in maniera indipendente e permette di avere una prospettiva molto più privata del sistema operativo in uso, in quanto ognuno di essi possiede:

  • un proprio ID
  • un file system
  • una differente interfaccia di rete

Il vantaggio del suo utilizzo risiede nel deployment di ogni singolo nodo dell’applicazione, che avviene solo quando è necessario, facilitando la gestione del codice in caso di lavori in sistemi distribuiti.

Definizione di Container security

I container devono essere messi in sicurezza, poiché ciascuno di essi ospita funzionalità e risorse diverse per l’applicazione. Tale processo è detto Container security ed è integrato nativamente all’interno del processo di sviluppo su Docker.
In genere questo prevede da parte dello sviluppatore la preoccupazione circa:

  • La sicurezza dell’host del singolo container;
  • Il traffico di rete di ogni container;
  • La sicurezza dell’applicazione in sviluppo contenuta nel container;
  • Comportamenti malevoli intrinsechi all’applicazione stessa;
  • La messa in sicurezza dei propri tool di sviluppo e della management stack;
  • Le basi della struttura portante dell’applicazione in sviluppo;
  • L’integrità della propria pipeline di build.

Quando uno dei container di Docker è in esecuzione, processa i dati dell’applicazione e genera di conseguenza file di log e di cache.
I controlli di sicurezza in tempo reale della piattaforma si assicurano che queste attività siano normali e non legate ad una possibile infezione malware esterna.

Rischi nella sicurezza dei container e possibili soluzioni

Come tutti i software anche Docker non è esente a falle nella propria sicurezza.
Di seguito sono elencate alcune delle sue vulnerabilità più note.

Traffico senza restrizioni e comunicazione con canali non sicuri

Alcune versioni di Docker permettono un traffico illimitato sullo stesso host come propria impostazione di default.
Ciò si traduce in un’involontaria esposizione dei dati ai container errati.

Soluzioni

  • È necessario assegnare un accesso ristretto ai container desiderati. In questo modo una possibilità di attacco viene ridotta, in quanto si stabiliscono solo le comunicazioni necessarie e desiderate tra specifici container.
  • Si deve criptare il registro di comunicazione di Docker mediante il protocollo TLS, in modo da proteggere l’integrità del traffico di rete e le proprie credenziali di accesso.
  • Va valutata l’efficace dei controlli di sicurezza già esistenti e in vigore nella propria rete. A questi ne vanno aggiunti di specifici su Docker stesso, in modo da mitigare possibili danni economici alla propria azienda, o ai clienti che usano l’applicazione in sviluppo.

Immagini di container vulnerabili e infettate da malware

Attualmente si contano oltre 100,000 open-source container repository in host sul registro di Docker Hub.

Oltre alle classiche distribuzioni Linux ufficiali create ad-hoc per andare in contro alle esigenze degli sviluppatori, ne esistono altre modificate in via non ufficiale. Poiché non si conosce la loro provenienza diretta, sono una possibile fonte di infezione per i propri sistemi. Questo perché Docker Hub è una piattaforma aperta a tutti, per cui bisogna sempre informarsi bene su chi pubblica le proprie repo.

Soluzioni

  • Evitare a tutti i costi build non testate, con un bassissimo feedback, o su cui non si ripone piena fiducia. Questa soluzione impedisce l’intromissione di codice malevolo e il sorgere di serie vulnerabilità all’interno della propria applicazione.
  • Usare pacchetti Docker Certified e Docker Store, in quanto elementi approvati e testati direttamente da Docker.
  • Impiegare un piano in abbonamento di Docker Hub che integra un toolset completo per scansioni di sicurezza. Questo permette l’individuazione immediata di vulnerabilità nelle immagini prima ancora che vengano scaricate per i propri progetti.

Accesso senza restrizioni

Ormai è un dato di fatto che hackers e cybercriminali sfruttano l’accesso illimitato per attaccare il sistema bersaglio. Docker non fa eccezione in questo caso, in quanto un accesso senza restrizioni si traduce in malintenzionati che riescono a prendere il controllo non solo dell’host, ma anche dei container presenti su esso.

Soluzione

  • Applicare il principio dei privilegi di accesso minimo ed eliminare l’accesso alla root dell’host laddove è possibile. Per una singola istanza è possibile applicare lo user namespace di Linux per permettere l’accesso ad account utente separati a container isolati, in modo da limitare l’accesso tra container

Vulnerabilità nel kernel dell’host

Il kernel è la parte più importante di qualsiasi programma, poiché costituisce il nucleo dello stesso e ha un controllo completo del sistema. All’interno di Docker questo è esposto sia all’host, che ai container, in quanto deve garantire il loro corretto funzionamento. Per cui le sue vulnerabilità sono estremamente critiche.
Se uno dei container causa un kernel panic, un errore fatale interno, può causare una reazione a catena che porta inesorabilmente alla caduta dell’host.

Soluzioni

  • Assicurarsi sempre che i sistemi operativi sull’host siano sempre aggiornati e che siano applicate le ultime patch di sicurezza.
  • Usare sempre un sistema operativo quanto più minimale possibile, ma con una forte componente di sicurezza.
  • Per prevenire possibili sfruttamenti delle falle nel kernel, è consigliabile l’uso di macchine virtuali localizzate, in quanto ogni attacco esterno deve essere instradato sia dall’Hypervisor, che dal kernel della macchina virtuale stessa, prima di raggiungere l’host.

Alcune soluzioni per il monitoraggio per container

Gli strumenti di monitoraggio forniti da Docker e da terzi sono in grado di acquisire parametri e offrire funzionalità di visualizzazione e analitiche per tracciare le attività sui container. Questi includono:

  • Monitoraggio dell’uso della CPU
  • Uso della memoria e limiti imposti
  • Registri dello streaming di dati in tempo reale

Bisogna tenere conto che una soluzione di monitoraggio completa richiede determinate risorse di sistema aggiuntive per ciascun livello della propria infrastruttura, richiedendo di fatto

Di seguito sono elencate alcune soluzioni per ovviare ai problemi di risorse insufficienti.

  • Semplificare le metriche dei singoli container. Ciò permette di tenere conto solo delle metriche inerenti al container effettivamente in uso, piuttosto che di tutta l’infrastruttura, host incluso.
  • Automatizzare la scoperta dei servizi. Questa soluzione si realizza un software di tipo APM (Application Performance Management) che permette l’identificazione di ciascun container in esecuzione e i cambiamenti che occorrono in tempo reale durante il deployment.
  • Fare leva sugli strumenti di monitoraggio in tempo reale. Questi strumenti godono di una comoda interfaccia grafica e quelli più avanzati perfino di soluzioni basate su machine learning. Così è possibile accorgersi di qualsiasi anomalia presente nei container, riportandolo anticipatamente a tutte le parti interessate ed evitando incidenti legati a codice perso.

In conclusione

Docker è un’ottima piattaforma per lo sviluppo e il deployment delle proprie applicazioni, ma come tale è soggetta a vulnerabilità e a possibili intromissioni esterne se non correttamente monitorate. Le soluzioni suggerite sono in grado di mitigare questi rischi, ma a ciò deve essere sempre aggiunto il proprio buon senso e un’attenzione scrupolosa aggiuntiva.