Chapter 6 · 6.3
Docker en de firewall: poorten veilig publiceren
This article hasn't been translated yet. You're reading the Dutch version.
Dit is de valkuil waar de meeste mensen in lopen. Een poort die je in Docker publiceert met ports:, is bereikbaar vanaf internet, ook als ufw die poort dichtzet. Docker zet zijn eigen firewallregels en die gaan vóór de regels van ufw.
Een voorbeeld van wat er misgaat
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Je firewall zegt dat alleen 22, 80 en 443 open zijn. Toch is je database nu vanaf de hele wereld bereikbaar op poort 3306.
Drie regels die het veilig houden
- Publiceer alleen wat van buiten bereikbaar moet zijn. In deze handleiding is dat alleen Caddy, op 80 en 443. Apps praten met Caddy over het interne netwerk van compose. Die hebben geen
ports:nodig. - Moet een poort alleen op de server zelf bereikbaar zijn? Zet er
127.0.0.1:voor. Dan kan alleen de server zelf erbij, of jij via een SSH-tunnel (zie Een SSH-config: inloggen met een korte naam). - Een database krijgt nooit
ports:. De app vindt hem op de naam van de service, zoalsdb.
ports:
- "127.0.0.1:3001:3001"
Controleren van buitenaf
Kijk op de server welke poorten openstaan voor iedereen:
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",...))
Alles met 0.0.0.0 of [::] is van buiten bereikbaar. Alles met 127.0.0.1 alleen van binnen. Wil je het van buiten zien, gebruik dan vanaf je eigen computer een poortscanner zoals nmap op je eigen IP-adres.
Let op: Koppel /var/run/docker.sock niet in een container tenzij je precies weet waarom. Wie die container overneemt, heeft daarmee je hele server.
