No, i contenitori Docker non sono più sicuri di una VM.
Citando Daniel Shapira :
In 2017 alone, 434 linux kernel exploits where found, and as you have seen in this post, kernel exploits can be devastating for containerized environments. This is because containers share the same kernel as the host, thus trusting the built-in protection mechanisms alone isn’t sufficient.
1. Exploit del kernel da un contenitore
Se qualcuno sfrutta un bug del kernel all'interno di un contenitore, lo ha sfruttato sul sistema operativo host. Se questo exploit consente l'esecuzione di codice, verrà eseguito sul sistema operativo host, non all'interno del contenitore.
Se questo exploit consente l'accesso arbitrario alla memoria, l'utente malintenzionato può modificare o leggere qualsiasi dato per qualsiasi altro contenitore.
Su una VM, il processo è più lungo: l'utente malintenzionato dovrebbe sfruttare sia il kernel VM, l'hypervisor e il kernel host (e questo potrebbe non essere lo stesso del kernel VM).
2. Inattività di risorse
Poiché tutti i contenitori condividono lo stesso kernel e le stesse risorse, se l'accesso ad alcune risorse non è limitato, un contenitore può usarlo tutto e affamare il sistema operativo host e gli altri contenitori.
Su una VM, le risorse sono definite dall'hypervisor, quindi nessuna VM può negare il SO host da alcuna risorsa, poiché l'hypervisor stesso può essere configurato per fare un uso limitato delle risorse.
3. Scomposizione contenitore
Se un utente all'interno di un contenitore è in grado di uscire dal contenitore utilizzando qualche exploit o configurazione errata, avrà accesso a tutti i contenitori in esecuzione sull'host. Ciò accade perché lo stesso utente che esegue il motore della finestra mobile è l'utente che esegue i contenitori. Se un exploit esegue codice sull'host, verrà eseguito sotto i privilegi del motore di finestra mobile, in modo che possa accedere a qualsiasi contenitore.
4. Separazione dei dati
In un contenitore finestra mobile, ci sono alcune risorse che non sono namespace:
- SELinux
- Cgroups
- file system sotto
/sys
, /proc/sys
,
-
/proc/sysrq-trigger
, /proc/irq
, /proc/bus
-
/dev/mem
, /dev/sd*
file system
- Moduli kernel
Se un utente malintenzionato può sfruttare uno di questi elementi, sarà il proprietario del sistema operativo host.
Un sistema operativo VM non avrà accesso diretto a nessuno di questi elementi. Parlerà con l'hypervisor e l'hypervisor effettuerà le chiamate di sistema appropriate al sistema operativo host. Filtrerà le chiamate non valide, aggiungendo un livello di sicurezza.
5. Socket non elaborati
Il socket Unix docker predefinito ( /var/run/docker.sock
) può essere montato da qualsiasi contenitore, se non adeguatamente protetto. Se un contenitore monta questo socket, può arrestare, avviare o creare nuove immagini.
Se correttamente configurato e protetto, è possibile raggiungere un elevato livello di sicurezza con un contenitore docker, ma sarà inferiore a una VM configurata correttamente. Indipendentemente da quanti strumenti di protezione siano impiegati, una VM sarà sempre più sicura. L'isolamento del metallo nudo è ancora più sicuro di una VM. Alcune implementazioni bare metal (IBM PR / SM per esempio) possono garantire che le partizioni siano separate come se fossero su hardware separato. Per quanto ne so, non c'è modo di sfuggire a una virtualizzazione PR / SM.