Capítulo 6 · 6.3
Docker y el cortafuegos: publicar puertos de forma segura
Esta es la trampa en la que cae la mayoría de la gente. Un puerto que usted publica en Docker con ports: es accesible desde internet, aunque ufw lo tenga cerrado. Docker crea sus propias reglas de cortafuegos y estas tienen prioridad sobre las reglas de ufw.
Un ejemplo de lo que sale mal
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Su cortafuegos indica que solo están abiertos el 22, el 80 y el 443. Sin embargo, su base de datos ahora es accesible desde todo el mundo en el puerto 3306.
Tres reglas para mantenerlo seguro
- Publique solo lo que deba ser accesible desde fuera. En este manual, eso es únicamente Caddy, en el 80 y el 443. Las aplicaciones se comunican con Caddy a través de la red interna de compose. No necesitan
ports:. - ¿Un puerto solo debe ser accesible desde el propio servidor? Anteponga
127.0.0.1:. Así solo podrá acceder el propio servidor, o usted mediante un túnel SSH (consulte Una configuración SSH: iniciar sesión con un nombre corto). - Una base de datos nunca recibe
ports:. La aplicación la encuentra por el nombre del servicio, comodb.
ports:
- "127.0.0.1:3001:3001"
Comprobar desde fuera
Compruebe en el servidor qué puertos están abiertos para todo el mundo:
anna@web1:~$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 4096 127.0.0.1:3001 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",...))
Todo lo que tenga 0.0.0.0 o [::] es accesible desde fuera. Todo lo que tenga 127.0.0.1, solo desde dentro. Si quiere verlo desde fuera, utilice desde su propio ordenador un escáner de puertos como nmap sobre su propia dirección IP.
Atención: No monte /var/run/docker.sock en un contenedor a menos que sepa exactamente por qué. Quien se haga con ese contenedor, tendrá con ello todo su servidor.
