Capitolo 6 · 6.3
Docker e il firewall: pubblicare le porte in modo sicuro
Questa è la trappola in cui cade la maggior parte delle persone. Una porta che Lei pubblica in Docker con ports: è raggiungibile da internet, anche se ufw la chiude. Docker imposta le proprie regole del firewall, che hanno la precedenza sulle regole di ufw.
Un esempio di ciò che va storto
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Il Suo firewall indica che sono aperte solo le porte 22, 80 e 443. Eppure il Suo database è ora raggiungibile da tutto il mondo sulla porta 3306.
Tre regole per restare al sicuro
- Pubblichi solo ciò che deve essere raggiungibile dall'esterno. In questa guida si tratta solo di Caddy, sulle porte 80 e 443. Le app comunicano con Caddy tramite la rete interna di compose. Non hanno bisogno di
ports:. - Una porta deve essere raggiungibile solo sul server stesso? Anteponga
127.0.0.1:. In questo modo vi può accedere solo il server stesso, oppure Lei tramite un tunnel SSH (vedere Una configurazione SSH: accedere con un nome breve). - Un database non riceve mai
ports:. L'app lo trova tramite il nome del servizio, comedb.
ports:
- "127.0.0.1:3001:3001"
Verificare dall'esterno
Controlli sul server quali porte sono aperte a tutti:
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",...))
Tutto ciò che riporta 0.0.0.0 o [::] è raggiungibile dall'esterno. Tutto ciò che riporta 127.0.0.1 solo dall'interno. Se desidera verificarlo dall'esterno, utilizzi dal Suo computer uno scanner di porte come nmap sul Suo indirizzo IP.
Attenzione: Non colleghi /var/run/docker.sock in un container a meno che non sappia esattamente perché. Chi prende il controllo di quel container ottiene così l'intero server.
