Con la pandemia COVID si è assistita a una crescita esponenziale del cloud: molte aziende hanno portato i loro software sulla nuvola per offrire agli impiegati funzionalità avanzate di condivisione e di accesso remoto alle applicazioni.
Con il tempo, però, l’operatività in cloud ha iniziato a mostrare alcune limitazioni. Alcune applicazioni legacy, adattate frettolosamente per le infrastrutture SaaS, hanno dato preoccupanti segni di debolezza dal punto di vista della sicurezza. In certi casi, i budget per l’operatività in cloud sono stati sottostimati e, a causa dell’opacità dei piani tariffari, alcune aziende hanno speso più del previsto.
Inoltre, alcune imprese, data la natura delicata delle informazioni che gestiscono, hanno dovuto confrontarsi con il GDPR Europeo e stabilire quale tipo di infrastruttura fosse più appropriato.
Le sfide dell’infrastruttura On Premise
Riportare un’applicazione SAAS su un’infrastruttura On Premise potrebbe presentare sfide non indifferenti. L’installazione e la manutenzione di un’applicazione On Premise richiede che vengano dedicate risorse e tempo alla gestione di componenti che nei servizi SaaS sono trasparenti, essendo totalmente a carico del provider che gestisce l’infrastruttura. Perciò, occorre analizzare le caratteristiche dell’applicazione, e trovare un giusto equilibrio tra complessità di manutenzione e necessità di condivisione e portabilità.
Occorre tenere presente che la maggior parte delle applicazioni moderne sono gestite a microservizi, ossia software caratterizzati da un’architettura che separa le parti di un’applicazione in piccoli componenti installati separatamente (le cosiddette API). Se l’applicazione è gestita a microservizi, la sua installazione On Premise potrebbe richiedere più istanze, ossia più di una macchina virtuale per bilanciare correttamente tutti i servizi necessari. Occorre così affrontare anche le sfide legate alla gestione della scalabilità dell’applicazione.
Container o macchina virtuale
Sebbene sia possibile installare multiple macchine virtuali, e specializzare ognuna di essa per il servizio richiesto, impiegare la tecnologia dei container permette di ottimizzare i tempi e i costi di installazione e manutenzione.
La differenza principale tra una macchina virtuale e un container è che una macchina virtuale astrae il sistema operativo rispetto all’hardware, mentre il container astrae l’applicazione dal sistema operativo sottostante, permettendo di eseguire differenti istanze virtuali in un unico sistema operativo.
I container, per funzionare, vengono installati tramite immagini su un gestore, che crea un ambiente protetto (la cosiddetta sandbox) in cui fare il deployment dell’applicazione con la sua configurazione e i componenti accessori.
Per quanto concerne il gestore dei container, abbiamo scelto di focalizzarci sul gestore Docker, perché è una delle soluzioni più consolidate e ha una diffusa community in cui è possibile trovare supporto e di documentazione.
Una volta installata su Docker, l’istanza ha accesso alle risorse del sistema operativo sottostante, e può usufruire di un proprio file system e funzionalità di rete complete.
Questa separazione tra applicazioni e infrastruttura permette di ottimizzare la manutenzione e la distribuzione, e offre una soluzione facilmente scalabile.
Docker su Linux
L’utilizzo di Docker su sistema operativo Linux offre un veloce sistema di installazione e permette di mantenere la dimensione delle immagini compatta. Docker possiede una propria sintassi di scripting con cui è possibile realizzare file di configurazione che si possono riutilizzare per il deploy di istanze simili.
L’utilizzo dei container è perciò particolarmente consigliato non solo per lo sviluppo di nuovi software, ma anche per il refactoring di applicazioni già esistenti, o per la gestione di microservizi utilizzabili da applicazioni remote tramite VPN.
Docker supporta anche le pipeline CI/CD di DevOps, che permettono tramite il sistema del Continuous Integration and Deployment di effettuare creazione, test e distribuzione semplificati dalle stesse immagini.
Docker si rivela perciò un’alternativa interessante rispetto alle classiche macchine virtuali per le sue maggiori performance e possibilità di integrazione.
Docker e cybersecurity
Uno dei principali vantaggi di Docker è che i contenitori sono isolati tra loro e dal sistema host, e questa astrazione delle risorse limita la superficie per un possibile attacco. Tuttavia, questo isolamento non è assoluto e possono verificarsi situazioni in cui la vulnerabilità di un contenitore può influenzare altri contenitori o addirittura il sistema host: è necessario perciò implementare efficaci politiche di sicurezza.
Tra le best practice da segnalare, la prima riguarda sicuramente la scansione dell’immagine Docker da cui si sta eseguendo il deploy dell’applicazione. Se si è utilizzato un template per sviluppare il container, questa verifica permette di verificare la presenza di vulnerabilità, codice dannoso o software obsoleto al suo interno, che potrebbe contenere bug sfruttabili da bot malevoli.
Inoltre, è consigliabile limitare il traffico di rete, che per impostazione predefinita Docker consente tra i contenitori sullo stesso host: questo traffico illimitato può infatti potenzialmente esporre dati sensibili o consentire attività dannose se un contenitore viene compromesso.
La comunicazione tra i container e le applicazioni può poi essere crittografata utilizzando TLS, in modo da offrire una robusta protezione alla riservatezza del traffico di rete.
Oltre a mantenere costantemente aggiornati Docker, il sistema operativo dell’host e le applicazioni, è necessario fare attenzione anche ai servizi che Docker esegue con i privilegi di Root (il Super Administrator del mondo Linux) e valutare se esporre o meno questi servizi all’accesso esterno. Un servizio particolarmente critico è il socket di Docker, che permette di accedere ai container in modalità remota: è necessario valutare se questa funzionalità sia effettivamente richiesta per l’amministrazione della vostra infrastruttura, e valutare i suoi impatti a livello di sicurezza.