No, los contenedores Docker no son más seguros que una máquina virtual.
Cotizando Daniel Shapira :
Solo en 2017, 434 vulnerabilidades del núcleo de Linux donde se encontró , y como ha visto en esta publicación, las vulnerabilidades del kernel pueden ser devastadoras para entornos de contenedores. Esto se debe a que los contenedores comparten el mismo kernel que el host, por lo que confiar en los mecanismos de protección integrados por sí solos no es suficiente.
1. Explotaciones del núcleo de un contenedor
Si alguien explota un error del kernel dentro de un contenedor, lo explota en el sistema operativo host. Si esta vulnerabilidad permite la ejecución de código, se ejecutará en el sistema operativo host, no dentro del contenedor.
Si esta vulnerabilidad permite el acceso arbitrario a la memoria, el atacante puede cambiar o leer cualquier dato de cualquier otro contenedor.
En una VM, el proceso es más largo: el atacante tendría que explotar tanto el kernel de la VM como el hipervisor y el kernel del host (y esto podría no ser lo mismo que el kernel de la VM).
2. Hambre de recursos
Como todos los contenedores comparten el mismo kernel y los mismos recursos, si el acceso a algún recurso no está restringido, un contenedor puede usarlo todo y matar de hambre al sistema operativo host y los otros contenedores.
En una máquina virtual, los recursos están definidos por el hipervisor, por lo que ninguna máquina virtual puede negar el sistema operativo host de ningún recurso, ya que el propio hipervisor puede configurarse para hacer un uso restringido de los recursos.
3. Desglose de contenedores
Si cualquier usuario dentro de un contenedor puede escapar del contenedor utilizando algún exploit o configuración incorrecta, tendrá acceso a todos los contenedores que se ejecutan en el host. Esto sucede porque el mismo usuario que ejecuta el motor de la ventana acoplable es el usuario que ejecuta los contenedores. Si algún exploit ejecuta código en el host, se ejecutará bajo los privilegios del motor de la ventana acoplable, de modo que pueda acceder a cualquier contenedor.
4. Separación de datos
En un contenedor docker, hay algunos recursos que no tienen espacio de nombre:
- SELinux
- Cgroups
- sistemas de archivos bajo
/sys
, /proc/sys
,
-
/proc/sysrq-trigger
, /proc/irq
, /proc/bus
-
/dev/mem
, /dev/sd*
sistema de archivos
- Módulos de núcleo
Si cualquier atacante puede explotar cualquiera de esos elementos, será el propietario del sistema operativo host.
Un sistema operativo de VM no tendrá acceso directo a ninguno de esos elementos. Hablará con el hipervisor, y el hipervisor hará las llamadas al sistema apropiadas al sistema operativo host. Filtrará las llamadas inválidas, agregando un nivel de seguridad.
5. Enchufes crudos
El contenedor Unix docker predeterminado ( /var/run/docker.sock
) puede ser montado por cualquier contenedor si no está asegurado adecuadamente. Si algún contenedor monta este zócalo, puede cerrar, iniciar o crear nuevas imágenes.
Si está correctamente configurado y asegurado, puede lograr un alto nivel de seguridad con un contenedor docker, pero será menos que una VM correctamente configurada. No importa la cantidad de herramientas de endurecimiento que se empleen, una máquina virtual siempre será más segura. El aislamiento de metal desnudo es incluso más seguro que una máquina virtual. Algunas implementaciones simples (IBM PR / SM, por ejemplo) pueden garantizar que las particiones estén tan separadas como si estuvieran en un hardware separado. Que yo sepa, no hay forma de escapar de una virtualización PR / SM.