fwcloud & docker

En el apartado Docker de la sección de instalación de FWCloud ya vimos como instalar de forma sencilla FWCloud utilizando contenedores Docker. Ahora vamos a describir detalladamente como gestionar desde FWCloud la política de seguridad de un servidor en el cual se esté utilizando Docker evitando los conflictos que pueden surgir como consecuencia de las reglas IPTables que Docker genera automáticamente.

Por defecto Docker genera un conjunto de reglas IPTables adecuadas a los contenedores que ejecuta y las configuraciones definidas para los mismos. Si utilizamos FWCloud para gestionar la política de seguridad del servidor en donde ejecutamos nuestros contenedores Docker, las reglas generadas automáticamente por Docker son eliminadas al cargar la política FWCloud. Y viceversa, Docker generará reglas IPTables que no están contempladas en la política de seguridad definida a través de nuestra consola FWCloud.

La mejor opción para evitar estos conflictos es deshabilitar la generación automática de reglas IPTables por porte de Docker y generar la política de seguridad adecuada a nuestras necesidades desde FWCloud.

La compatibilidad FWCloud & Docker consiste en deshabilitar IPTables en Docker y gestionar la política de seguridad de nuestro servidor Docker desde FWCloud

Ejemplo

A continuación vamos a ver un ejemplo sencillo de como hacer esto ejecutando varias contenedores en un servidor Docker, generando las reglas necesarias para permitir las comunicaciones deseadas.

Lo primero que tenemos que hacer es deshabilitar la generación automática de reglas IPTables en nuestra instalación Docker. Para ello tenemos que modificar (o crear si no existe) el siguiente fichero:

/etc/docker/daemon.json

Y verificar que la opción iptables está a false o bien añadirla si no existe previamente.

{
  "iptables": false
}

A continuación reiniciamos el servicio Docker para limpiar las reglas que pudiera haber creadas previamente.

sudo systemctl restart docker

Nos aseguramos de que ya no existen reglas generadas por Docker mediante el siguiente comando que nos debería generar una salida similar a la que vemos a continuación.

 

# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination 

Si vemos que aún existen reglas generadas por Docker lo mejor es reiniciar el servidor para limpiar estas.

A continuación vamos a utilizar dos contenedores Docker uno basado en la imagen de Ubuntu en el cual ejecutaremos un bash y otro con la imagen de Nginx, exponiendo un puerto TCP para accede al mismo,  de ese modo veremos como permitir el acceso al mismo mediante la política FWCloud.

 

docker run -ti ubuntu /bin/bash

docker run -d -p 8080:80 nginx

Si intentamos hacer un ping a la ip 8.8.8.8 desde el bash que hemos lanzado en el contenedor con imagen ubuntu veremos que no responde. Esto es consecuencia de que hemos deshabilitado el que Docker genere automáticamente las reglas IPTables que permiten dicha comunicación. Por lo tanto, tenemos que generar mediante FWCloud la política necesaria para permitir esto y cualquier otro flujo de comunicación que nos interese.

 

Integración

Veamos a continuación como generar en FWCloud la política de seguridad para permitir que nuestros contenedores Docker puedan acceder a Internet, así como para habilitar el acceso al servicio del contenedor con imagen Nginx.

Para permitir que desde nuestro contenedor con imagen Ubuntu podamos hacer un ping hacia IPs de Internet como la 8.8.8.8 tenemos que añadir dos reglas en la política gestionada a través de nuestra consola FWCloud. La primera de ellas tiene que hacer un SNAT de la IP de nuestro contenedor Docker a la IP de salida del equipo en el cual se está ejecutando el mismo, para que así podamos acceder a Internet desde dicho contenedor.

 

Ahora necesitamos permitir el tráfico en la política de forward, entrando por la interfaz virtual asignada a nuestro contenedor y saliendo por la interfaz de acceso a Internet del servidor en el cual estamos ejecutando el contenedor. 

 

Con estas dos reglas ya deberíamos de poder hacer ping a internet desde el bash que estamos ejecutando desde nuestro contenedor Docker con imagen ubuntu.

 

A continuación, para permitir acceso al servicio Nginx del otro contenedor Docker, expuesto a través del puerto 8080, lo único que tenemos que hacer es permitir dicho servicio en la política de INPUT de nuestro firewall tal y como se muestra en la siguiente captura de pantalla.

 

Como se puede apreciar a través del ejemplo que acabamos de ver, es muy sencillo definir a través de FWCloud la política necesaria para los contenedores Docker ejecutados en nuestro servidor. Además, gestionar la política desde FWCloud en vez de permitir que Docker la genere automáticamente nos proporciona mayor control acerca de los servicios y comunicaciones que nos interesa permitir.