Docker y UFW pueden ser amigos

Si has intentado hacer funcionar docker junto a un firewall, te habrás dado cuenta de que todo falla estrepisomante. Docker juega con iptables y no le gusta que nadie se meta en medio.

Así pues vamos a ver como podemos configurar docker desde el principio hasta arreglar nuestros problemas con el firewall (UFW). Realmente este es el punto importante del post así que puedes ir directo si es lo que buscas

Nuevamente esto lo realizaremos en un servidor debian, pero a parte de este paso concreto en el que añadimos los repositorios concretos y usamos apt para la instalación, los demás pasos son iguales.

En cualquier caso, la guía ofcial es un buen punto de referencia.

Nota*: Este post pretende ser una referencia rápida para asegurarnos de que disponemos de un firewall a la para que podemos usar docker en nuestro servidor.

Instalación

Lo primero es asegurarnos de tener los paquetes necesarios para poder añadir el repositorio

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Una vez hecho eso añadimos la clave GPG oficial (os recomiendo comprobarlo en la web de docker, añadir repositorios externos puede abrir la puerta al malware en nuestro sistema. No os fies de un cualquiera en internet)

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
Ejecutando el siguiente comando podremos comprobar  que la clave del repositorio coincide con la indicada en la guía oficial de Docker (9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88), y que el servidor es auténtico
$ sudo apt-key fingerprint 0EBFCD88


pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

Una vez hecho eso añadimos finalmente el repositorio e instalamos docker engine

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

En distros con systemd habilitamos docker para iniciarse con el sistema

$ sudo systemctl enable docker

Convenciendo a Docker y a UFW para llevarse bien.

En nuestro caso como firewall usamos UFW, para asegurarnos de que no existan conflictos y todos los puertos que nadie fuera de nuestra red debe acceder queden efectivamente bloqueados.

Hasta donde yo se hay otras dos soluciones a este problema:

  • Evitar que Docker añada reglas iptables
  • Añadir reglas concretas en el firewall para permitir que una red concreta pueda accederse desde el exterior

Sin embargo, la primera acaba con la función de administración de red de Docker, y la segunda requiere añadir manualmente una regla cada vez que creamos una nueva red.

Sin embargo, con la siguiente aproximación, no encontramos ninguno de estos problemas. Bastaría con añadir lo siguiente al final del archivo /etc/ufw/after.rules (antes de COMMIT) 
# BEGIN UFW AND DOCKER

:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

Si estás interesado, he encontrado un post (en inglés) que explica esta configuración más en detalle.

Bueno, pues eso, en una burbuja a prueba de paquetes malvados, vivieron felices y comieron perdices…

WordPress-fpm nginx reverse proxy

Aviso para navegantes: ¿muy dificil no puede ser verdad? Bueno, la cuestión es ¿cúantos fallos puedes cometer?

Usando de ejemplo wordpress-fpm vamos a ver cómo configurar un programa fpm corriendo en un contenedor y usando nginx como reverse proxy.

En cuánto a por qué fpm, la idea es consumir menos recursos. Además, cusando nginx como proxy, tener una instancia de apache corriendo solo para docker, no es de mi agrado.

Aclarar que antes de seguir este tutorial debes tener docker instalado y configurado para evitar colisiones con el firewall.

En este caso contaremos con NGINX funcionando en el servidor como reverse proxy para múltiples apps. NGINX NO estará funcionando en ningún container.

(Si vas a levantar múltiples programas/webs/apps que usen mysql, puede ser más conveniente levantar una sola instancia y conectar los demás contenedores a ella)

version: '3.1'

services:

  db-blog:
    image: mariadb
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: blogdb
      MYSQL_USER: MySqlU
      MYSQL_PASSWORD: contraseña
      MYSQL_ROOT_PASSWORD: contraseña
    volumes:
      - ./db-data:/var/lib/mysql


  wordpress:
    image: wordpress:5.4.2-php7.2-fpm
    restart: unless-stopped
    ports:
      - "127.0.0.1:8082:9000"
    depends_on: 
      - db-blog

    environment:
      WORDPRESS_DB_HOST: db-blog
      WORDPRESS_DB_USER: MySqlU
      WORDPRESS_DB_NAME: blogdb
      WORDPRESS_DB_PASSWORD: contraseña
    
    user: www-data

    volumes:
      - /var/www/html/blog/wp-content:/var/www/html/blog/wp-content
    links: 
      - db-blog


volumes:
  wordpress:
  db-data:

Debemos tener en cuenta que si cambiamos el directorio local de /var/www/html a otro en la carpeta de un usuario, por ejemplo, los permisos pueden ser problemáticos. Pues aunque concedamos permisos al directorio concreto nginx necesita acceso a los directorios superiores, para funcionar correctamente.

Actualizar wordpress gracias a docker

Quiero llamar aún más la atención sobre este punto:

 volumes:    
  - /var/www/html/blog/wp-content:/var/www/html/blog/wp-content

es muy importante añadir el wp-content, pues queremos delegar en docker las actualizaciones de wordpress. De esta forma, al recrear el contenedor con la nueva versión, actualizará todo lo necesario. Y simplemente al acceder al panel de administración de la web nos notificará de que es necesario actualizar la base de datos.

En caso contrario, nos encontraremos con problemas al intentar actualizar desde el panel de wordpress, pues este no cuenta con permisos para hacerlo.

Realmente esa es la parte complicada. Lo siguiente sería configurar nginx como reverse proxy.

Un ejemplo del archivo de configuración de nginx sería:

server {

    
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.php;

        server_name example.es;
        root /var/www/html/example.es;

        access_log /var/log/nginx/example-access.log;
        error_log /var/log/nginxexample-error.log;


    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;



location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:8082;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }


    listen [::]:443 ssl; 
    listen 443 ssl; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot



    ssl_certificate /etc/letsencrypt/live/example.es/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.es/privkey.pem; # managed by Certbot
}


server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;

        server_name example.com;
    return 404; # managed by Certbot


}

No tengo nada que ocultar

Este argumento tan repetido, me asusta y me choca, porque si bien se dice alegremente, confiados no pensamos en las implicaciones.

Aunque no es nada nuevo, el escrito que sigue intenta tener un enfoque ligeramente distinto al habitual. Pretende ser un apoyo más para aquellos ya concienciados. Y una introducción para quienes aún no entienden los peligros del «YO no tengo nada que ocultar»

Cuando alguien dice esta frase, incluso si es alguien cercano, no necesitamos preguntar, ¿te parece dejarme el móvil y el ordenador un momentito? Según vaya necesitando dime las contraseñas ¿ de acuerdo?

No necesitamos realizar esas preguntas para saber que la respuesta es un firme NO. ¿Por qué es NO, si efectivamente no tienes nada que ocultar?

Quizá en ese momento nos damos cuenta de qué nos resulta vergonzoso aquello que buscamos en cierto momento. No tiene que ser malo ni escandaloso. Dependiendo de nuestro contexto social, que se conozca nuestra enfermedad, o nuestros gustos por cierta actividad pueden estar mal vistos. ¿Acaso nunca nos hemos guardado información sobre nuestros gustos / ideas ante la posible reacción de otra persona?

Aquel que no haya ocultado nunca nada a algún ser querido o cercano, que dé un paso al frente. Ten en cuenta que incluso para organizar una fiesta sorpresa estas ocultando información.

Ahora bien esto han es un caso muy tonto ¿no?, sin embargo creo que plantean la base de lo que significa privacidad.

La definición de la RAE, es la siguiente :

Ámbito de la vida privada que se tiene derecho a proteger de cualquier intromisión.

https://dle.rae.es/privacidad

Como esta parca definición, no parece resolver mucho, vamos a intentar adentrarnos más en las implicaciones. Probemos con unas cuántas preguntas, de Sí o No.

¿Es una situación que atañe a nuestra privacidad?

  • ¿Con quien hablas?
  • ¿De qué hablas?
  • ¿Cuánto tiempo hablas con cada persona? ¿Con qué frecuencia?
  • ¿Dónde estas?
  • ¿Qué sitios frecuentas?
  • Tus gustos

Si se te ocurre al menos una persona que no quieres que tenga acceso a esa información, ya sea porque te puede causar un problema o simplemente no quieres, la respuesta es un rotundo. Sin embargo cedemos voluntariamente toda esa información.

Algún compatriota me ha dicho, que si estuviera en posición de robar o adquirir alguna ventaja, que le facilitase la vida, como por ejemplo un título universitario, gratis y sin estudiar, no dudaría en aprovechar esa oportunidad.

Estoy hablando de gente común, como tú y como yo. ¿En serio, teniendo nosotros mismos esa convicción, no tomamos ciertas precauciones?

Es decir, estamos cediendo toda nuestra información privada, información que no saben aquellos que conocemos, que queremos. Le estamos dejando toda esa información a unos desconocidos en cualquier parte del planeta. Una información que existirá para el resto de nuestra vida.

No te discuto que esa información no la vea una persona, pero no necesita verla directamente, para conseguir una zona concreta dónde centrarse si quiere acabar con cierta oposición. O a lo mejor alguien ha decidido que soy un drogadicto, pues al fin y al cabo en esa foto que salgo ¿ no es eso un porro?

No nos damos cuenta de que no tenemos control sobre qué de entre todo aquello que otros saben de nosotros, va a usarse para definirnos. Una imagen no es toda la verdad. 360 caracteres no definen lo que somos. Sin embargo tanto lo uno como lo otro pueden acabar con tu vida.

No tienes que haber escrito tu esas palabras, no tienes que haber hecho tu esa foto. Ese video que grabaste en tu adolescencia y al que no diste más importancia, pues era una tontería de críos, puede seguirte toda la vida.

Si pudiéramos saber qué piensa, qué hace y con quien, cada persona que conocemos nos llevemos bien o mal con ella… Seria muy tentador echar solo un vistazo. Además nadie se va a enterar. Luego, pensamos cómo podemos utilizarlo. Quizá alguna estafa, o acabar con ese compañero molesto del trabajo. Decidir si esa persona es fiable como para concederle un crédito bancario, o permitirle contratar un seguro a un precio u otro. Obviamente estos datos son muy fiables. Las personas no tanto ¿no?

A lo mejor no tenemos nada que ocultar. Pero tenemos mucho que proteger.

De la misma forma que no permitimos a un extraño entrar en nuestra casa grabar audio y video. No debemos dejar que lo haga un aparato. Hay extraños al otro lado.

La privacidad es una herramienta, que nos permite protegernos a nosotros y a nuestros seres queridos. Es una herramienta que permite proteger nuestra intimidad.

Actuamos diferente, cuando estamos siendo observados y cuando no. No porque sea malo, sino porque no hay nadie que nos juzgue. Tenemos libertad para experimentar y conocernos a nosotros mismos.

No sé vosotros, pero yo quiero poder salir a un parque, con mis amigos o mi pareja, sin que una cámara con reconocimiento facial analice todo lo que hago. Sin que todos esos datos se usen para venderme algo. Nos estamos convirtiendo en meros animales y productos que analizar. De los cuales sacar un beneficio.

Hay una cita de Edward Snowden que quiero mostraros. Traducida al español, dice lo siguiente:

Argumentar que la privacidad no te importa , porque no tienes nada que ocultar, es equivalente a decir que no te importa la libertad de expresión porque no tienes nada que decir.

Incluso si no estas usando un derecho, otras personas sí. Decir que no te importa un derecho porque no lo usas personalmente, es lo más antisocial que puedes decir. Lo que estas diciendo es que no te importan las demás personas.

No conocemos todas las leyes de nuestro propio país. Mucho menos las de aquellos países que visitamos. Además es prácticamente imposible no cometer algún delito aún sin percatarnos, pues que algo sea ilicito no implica que sea malo. Por ejemplo, ser homosexual y acabar detenido en el extranjero, por esas fotos que publicaste en tus redes sociales, no es tan extraordinario.

En occidente cuánto más te alejas de ser un hombre blanco, más probable es que exista algún tipo de discriminación en tu contra. Que se te presenten más dificultades y que una acción insignificante se convierta en un gran problema para ti.

Sí te encuentras en una minoría y quieres defender tus derechos vas a ser atacado y amenazado. Y la protección con la que cuentas, es la existencia de la privacidad y la intimidad. Ceder toda esa información a un tercero que no sabemos quien es y qué va a hacer con ella es cuanto menos imprudente.

Ese tercero puede ser una empresa que persiga únicamente lucrarse financieramente, una persona común que quiere ambiciona algo de ti, o un gobierno, que promete seguridad a cambio de ceder nuestra privacidad. Sin embargo, no es muy difícil deducir que puede pasar con aquellos que se opongan a este gobiero, capaz de saber dónde están, cómo se organizan o cuándo van a actuar aquellos que tienen ideas contrarias.

Los intereses de un gobierno nunca coinciden con la totalidad de la población que representa. En las democracias se intenta representar a todo el mundo, hacer que quien ostenta el poder rinda cuentas. No obstante, si les otorgamos las herramientas para escapar de ese control, de esa necesidad de rendir cuentas, el resultado puede ser desastroso.

El activismo no es terrorismo, aún así los activistas son sometidos a vigilancia y detenidos. Mientras tanto, las bombas siguen explotando en las calles. Aquellos que directamente ponen bombas, no son los únicos beneficiados por el miedo.

Siempre será más fácil y tentador seguir a un ciudadano que pacífica y públicamente defiende sus ideas contrarias al régimen, pues es un objetivo concreto que vigilar. Por el contrario, un terrorista de esos que ponen bombas, no sabes que lo es hasta que ha actuado. Incluso teniendo toda la información posible y con la última tecnología siempre habrá grupos con los medios para evadir la vigilancia y poner bombas. Incluso para las máquinas resulta imposible predecir al 100% la culpabilidad o las intenciones de alguien. Por ello en un escenario sin privacidad, el ciudadano común es el que pierde. Estará indefenso ante unos y otros.