viernes, 31 de agosto de 2018

Matemos a la puta ballena que no es más que un contenedor de basura para la seguridad

*******************   DISCLAIMER *******************

Con este post no pretendo ridiculiazar ni meterme con nadie en concreto, solamente es que se están considerando algunas cuestiones que no son muy positivas para la seguridad. Como siempre que se dice que algo es "muy bueno" hay que decir para qué y/o para quién, y en este caso no se está diciendo, lo que está provocando el problema que vengo a comentar hoy en día. 

Si a pesar de este Disclaimer aún quieres tirar hate, de acuerdo, pero no te voy a escuchar, así que tú verás que haces con tu tiempo.

*****************************************************


El título es llamativo porque el tema lo requiere. A ver, vamos a ir poco a poco porque hay mucha confusión sobre este tema y esa confusión puede ocasionar graves problemas para la seguridad de muchos usuarios. Aprender algo nuevo está guay, pero hay que aprenderlo bien. Imaginad por un momento que un niño de Bachillerato aprende formulación en clase y con las 2 tonterías que ha aprendido decide crear cristales al estilo Breaking Bad, lo que provocará será una explosión guapa. Pues en la Informática pasa lo mismo, y en este caso está pasando con Docker. De ahí lo de "matar a la ballena".




Docker es un contendor de imágenes, lo que nos va a permitir poder lanzar muchas imágenes de Nginx, Apache, OpenVPN y todo lo que esté en los repositorios de Docker. Muchos dicen que Docker es como el Hypervisor en la virtualización, pero es que el problema es que Docker no tiene nada que ver con virtualización, pero bueno, supongamos para mejorar el entendimiento que lo que hace Docker es crear varios contenedores cuando antes con la virtualización creabas varias máquinas virtuales con su sistema operativo. Con Docker, las imágenes para los contenedores que tienes no tienen sistema operativo, lo que ya es una diferencia brutal.


Aquí una imagen bastante explicativa. Esta imagen trae consigo otra diferencia fundamental.



Docker lo que hace es montarse sobre el propio Kernel de Linux basado en Namespaces y C Groups. Esto quiere decir que en cada contenedor hace una abstracción al usuario para que si, por ejemplo, hace un ps -aux, vea los procesos de ese contenedor y no  de la máquina Host. Es esto lo que hace creer al usuario que está en un entorno de virtualización, pero no tiene nada que ver.

Para ser didácticos, cuando virtualizamos, lo que hace el Hypervisor, sea del tipo que sea, es crear una muralla para que el sistema operativo Host y el virtualizado sean como 2 ordenadores distintos, es más, hasta tienen distinta MAC Address. Docker no, Docker se limita a ponerse una mano a la espalda y ahí guarda los procesos que están corriendo en el Host mientras al usuario, con la otra mano, le enseña los procesos del Contenedor en cuestión.

Esto tiene importantes implicaciones y es que imaginemos que tenemos una máquina virtualizada de verdad. Un atacante tiene acceso a dicha máquina pero no a la Host. Esto es cocharse con esa muralla de la que hemos hablado antes. Para ello, lo que tendrá que hacer es escalar privilegios dentro de la máquina virtualizada para "estar en lo alto de la muralla". Una vez ahí, ya se va a los drives para accerder a la máquina Host. Ha pegado el salto al otro lado de la muralla. Finalmente realizará otra escalada de privilegios y ya será root en la máquina Host.

Ahora, en Docker, un atacante entra al contenedor en cuestión, escala privilegios...and that's all. Recordemos que Docker utiliza el mismo Kernel de Linux y no crea esa muralla. Es decir, si cuando estamos dentro de nuestro contenedor hacemos un ps -aux, vemos los procesos del contenedor y no de la máquina por lo comentado con las namespaces, pero al hacer escalada de privilegios, ya somos root, le hemos obligado a que enseñe las dos manos.

Como podéis apreciar es mucho más fácil vulnerar en Docker environment que en sistemas virtualizados por la simple cuestión de que tengo que dar menos pasos, un simple bug en el Kernel de Linux y ya estoy dentro tras la escalada.

Alguno me dirá: "Pero Manu, si yo esto lo hago desde mi server de pruebas ¿qué más da? Que me entran, sí, pero es en el server de pruebas, no pasa nada".

Sí y no, porque si ese server de pruebas está en la misma red que el de PROD y se pasan datos, ni te digo el problema que eso puede suponer, y si está en otra red se puede hacer pivoting, pero bueno, para no enrollarnos mucho, vale,  "no pasa nada".

Vale, si ese es tu caso, de acuerdo, no pasa nada, pero el problema no eres tú, el problema es la gente que hace esto en PROD. Porque vale, entiendo que en el server de pruebas utilices Docker para, por ejemplo, probar balanceadores de carga tal y como yo apliqué con HaProxy. Ahora que lo pruebes en el de PROD y encima con Docker, eso ya es doble motivo para matarte NUNCA SE PRUEBA ALGO EN PROD. NUNCA.

Pero venga, te puedo llegar a pasar eso con el suficiente alcohol y drogas en el cuerpo (y eso que no bebo ni fumo), ahora por lo que no paso es por esa gente que se está creando una VPN con OpenVPN en Docker y que encima se lo pasa a un dominio para que sea accesible desde cualquier lugar. NO, ESO NO.

Es cierto que con Docker todo esto es fácil y rápido, lo haces en un momento. Por ejemplo, para instalar Docker en Debian 9.5.0 te basta con seguir el mismo manual que tiene Docker en su web. Siguiéndolo no hay problema, es más, yo he seguido ese manual para instalar Docker.

Lo más seguro es que en el post de mañana enseñe lo fácil que es instalar una VPN utilizando Docker y seguiré comentando esos pequeños issues en seguridad que tiene. Pero eso ya es para el post de mañana casi con total seguridad.

¿Hackeamos el Mundo?


No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...

Entrada destacada

El server me sabe a poco.

Soy un fanático del Rock y de Debian . (Creo que voy a inventar Rockbian, que suena bien y todo xD) Llevaba tiempo queriendo unir estos 2 c...