sábado, 1 de septiembre de 2018

Docker y sus grandes problemas de seguridad

Ya dije ayer que tenía que hablar sobre este tema de Docker hoy, y es que no entiendo cómo hay gente que utiliza una VPN en Docker cuando, si lo que quieres es tenerlo en una máquina independiente, lo mejor es la virtualización con sistemas KVM (KVM porque somos linuxeros, nunca lo olvidéis).


Os voy a contar cómo se puede montar este entorno con Docker, ya que las cosas como son, es realmente sencillo de realizar y además os comentaré algunos tips que hacen que Docker, para entornos de PROD tal y como dije en el post de ayer, no sea una buena decisión.

Lo primero será decir que voy a hacer todo esto desde una VM de Debian 9.5.0. Ya sabéis que amo Debian, por lo que no podía ser otro el sistema operativo a escoger. Aquí os dejo la ISO por si queréis probar un poco el sistema operativo o incluso seguir los pasos que voy a realizar para instalar la VPN en Docker. Lo que no entraré es en la instalación de Debian ya que es sencilla.

Voy a empezar teniendo en cuenta que ya tenemos instalado Debian y Docker. Si hay alguna duda sobre cómo instalar Docker en el post de ayer dejé un enlace de un tutorial donde se explica muy bien.


Cuando lo tenemos instalado, probamos que todo vaya bien ejecutando el mítico Hello World. Así pues, al comprobar que todo está bien, lo que vamos a hacer es cargar una imagen de BusyBox para preparar nuestra VPN. Le daremos un nombre, en mi caso como soy muy original lo llamaré vpn-server. Lo sé, no me aplaudáis todos a la vez por este derroche de originalidad.


Aquí hay dos opciones, una es la de ejecutar cosas cual descerebrados o entender un poco qué estamos haciendo. Tenemos que tener algo en cuenta y es que Docker, por defecto, todos los archivos creados dentro de un container, los almacena en una capa contenedora de escritura, lo que significa:

  1. Los datos no persisten cuando el container no está corriendo
  2. Esa capa contenedora de escritura se une al host y los datos no serán fáciles de mover.
  3. Escribir dentro de esta capa requiere de un medio de almacenamiento para manejar el sistema de archivos.
Para que los datos persistan, podemos utilizar la memoria o bien la opción de Bind mount o la de crear Volumes. Si decidimos crear volúmenes (esto es importante), éstos se almacenarán dentro del sistema en el directorio /var/lib/docker/volumes. Esto es muy importante y después lo demostraré.

Así que en este caso creamos un volumen con -v y seguimos para Bingo. Ahora lo que nos tocaría sería ejecutar la imagen de la VPN, ejecutar un script de configuración de la vpn (ovp_genconfig) y agregaremos nuestra IP para que resuelva hacía nuestra máquina (esto también es un tema, ya que tendremos que garantizar que esa máquina esté bien fortificada). También nos pedirá una passphrase, ojito porque hay que recordarla.


root@docker:~# docker run --volumes-from vpn-server --rm -it kylemanna/openvpn ovpn_initpki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki

Generating a 2048 bit RSA private key
.............................................................................................................+++
............+++
writing new private key to '/etc/openvpn/pki/private/ca.key.XXXXgnleDe'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:ManuTest

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt

Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
............+..............+........................................................................................................................................................................................................................................................................+....................+.....................................................................................................+............+........................................................................+.................................................................+................................................................+...............+......+............+...........................................................................................................................................................................................................+..............+.........+.........................................................................................................................................+..........................................................................................................+....................................................................................+..................................+..........................................................+.....................................+..........................................................................................................................................................................................................................+..............+..........................................................................+.......+..........................+........................................................................................................................................................+..............+...............................................................................................................................................+..............................................................+.............................................................................+...................................................................................................................................................................................................................................................+...........................................................+............................................+.........................................+................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................+...................................+.........................................................................................................................................................................+..............................+....+.............................................................................................................................................+.....................+.....+................................................+....................................+.....................................................................................................................................................................................................................................................+.........................................................................+.........................................................+...........................................................+.....................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............+..........................+......+..............................................................................................................................+.............................................................................................+.................................................................................................................................+....+............................+.........................................+......................................................................................................................................................................+....................................................+.......+.......................................................................................................+...........................................................................................................................................+..........................................................................................................................................................................................................................................................+..........................................................................................+......................+...............................................................................................................................+...........................................................................................................................................+..................................+............................................+...................................................+.......+...............+.....................+.............................................................................................................................................................................+.....................+.................+....................................................................................................................................................................................................................................................................................................................+...................+...............................++*++*

DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem

Generating a 2048 bit RSA private key
.................+++
.........................+++
writing new private key to '/etc/openvpn/pki/private/192.168.1.99.key.XXXXINDaNI'
-----
Using configuration from /usr/share/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'192.168.1.99'
Certificate is to be certified until Aug 12 15:34:41 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
Using configuration from /usr/share/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/pki/private/ca.key:

An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem

El siguiente paso es generar la PKI de la que va a ser nuestra autoridad de certificación. Esto que tiene un nombre que quedaría de puta madre para Hollywood, hacerlo es una tontería en la que no tardaremos mucho.

root@docker:~# docker run --volumes-from vpn-server --rm -it kylemanna/openvpn ovpn_initpki


Pues ya está, ya tenemos nuestra VPN configurada, lo que nos queda es crear el servicio. Esto lo vamos a hacer creando un ficherito en /lib/systemd/system/docker-openvpn.service. Lo podéis abrir con el editor que más os guste, eso sí, yo aconsejo que si os mola la informática y los servers, que aprendáis a utilizar VI, ya que es el que siempre está por defecto en cualquier servidor, el nano lo tendréis que instalar casi siempre y gedit si no es sistema de Escritorio no os va a servir. Bueno, por eso y porque si ni muchos informáticos saben usar VI, la seguridad es mucho mayor ya que no sabrán escribir en nuestro archivo de configuración.


Esto no os lo pongo en texto para que si usáis VI, no os pase lo que suele pasar y es que las 3 primeras letras muchas veces cuando vas a pegar un texto, no las pega, de todas formas el fichero no es muy largo.


Lo que nos queda ya es poco, hacemos que nuestraVPN arranque siempre hasta cuando reiniciemos la máquina, la arrancamos y comprobamos que está UP.

Ahora sí que tenemos el server, lo que nos quedan son los clientes, por lo que cada cliente require de un archivo de configuración. Generar los ficheros de configuración es muy sencillo, lo que pasa es que si vas a tener pocos usuarios vale, pero si vas a tener muchos, lo mejor es que automatices esta tarea con un script.


Lo que le quedaría a este cliente es su archivo de configuración en formato .ovp, algo que es muy sencillo también.


Ahora se lo pasamos por SSH (a ser posible con clave pública) y ya sí que lo tenemos. Vale, ahora el problema es el siguiente.

Como dije ayer, basta con una vuln en el Kernel de Linux y ya escalamos privilegios y controlamos tanto Docker como el Host, ya que Docker utiliza el mismo Kernel de Linux. Imaginemos entonces que se ha encontrado esa vuln y ahora un atacante va a ese directorio que os he mencionado antes donde se almacenan los volúmenes.


Ya está, ya tendría acceso a las llaves, los certificados y todo lo que hemos generado y creado, por lo que se podría hacer un spoofing sin problemas y redirigir, hasta con los certificados del server a las víctimas al ordenador del atacante para que sea por su ordenador por el que pase todo el tráfico.


Pero por si esto no fuese suficiente, ahora tenemos el siguiente caso. Nos hacemos un pull de la imagen de Nginx para crear nuestro contenedor y guardamos ese archivo nginx-original, que no es más que la última versión de Nginx. (Lo siento Apache, pero es que sino la gente se enfada si te pongo siempre a ti, pero tranquilo, que sabes que tú eres mi favorito).


Pues bien, imaginemos ahora que el atacante consigue troyanizar la imagen de nginx-original generando el output nginx-malware y se lo deja a la víctima. Si ahora la víctima hiciese un load de nginx-malware ¿qué pasa? Pues nada, que Docker pasa de verificaciones y lo sustituye y te lo carga sin problema, si ya tenías uno antes, lo sustituye por el nuevo, por lo que el atacante con dejar abierto un netcat en su máquina ya tendría acceso a los directorios de Docker, y si escala privilegios estará en la host, así de simple.

A ver, yo entiendo que Docker es muy llamativo hoy en día y que queda muy guay en tu CV, y la verdad es que tiene cosas muy buenas y que me llaman la atención, eso sí, para pruebas y poco más. Me parece interesante lo simple que es montar una VPN en Docker, pero si hago esto, lo haría para pruebas en mi casa, no para una empresa y mucho menos le daría un dominio, ni muerto. Docker es muy útil para lo que sirve, para lanzar muchas imágenes muy rápido y tenerlo todo bastante ordenador, ya que Docker no es más que un tar, es un contenedor y sí que te lo guarda todo de formamuy ordenada, pero tiene matices en el apartado de seguridad que usarlo en PROD, me parece un ejercicio de insensatez tremendo y ya habéis visto por qué.

¿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...