Kapitel 6 · 6.3
Docker och brandväggen: publicera portar säkert
Det här är fällan som de flesta går i. En port som du publicerar i Docker med ports: går att nå från internet, även om ufw stänger den porten. Docker sätter sina egna brandväggsregler och de går före reglerna i ufw.
Ett exempel på vad som går fel
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Din brandvägg säger att bara 22, 80 och 443 är öppna. Ändå går din databas nu att nå från hela världen på port 3306.
Tre regler som håller det säkert
- Publicera bara det som måste gå att nå utifrån. I den här handboken är det bara Caddy, på 80 och 443. Apparna pratar med Caddy över det interna nätverket i compose. De behöver ingen
ports:. - Ska en port bara gå att nå på själva servern? Sätt
127.0.0.1:framför. Då kommer bara servern själv åt den, eller du via en SSH-tunnel (se En SSH-config: logga in med ett kort namn). - En databas får aldrig
ports:. Appen hittar den via tjänstens namn, till exempeldb.
ports:
- "127.0.0.1:3001:3001"
Kontrollera utifrån
Se efter på servern vilka portar som är öppna för alla:
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",...))
Allt med 0.0.0.0 eller [::] går att nå utifrån. Allt med 127.0.0.1 bara inifrån. Vill du se det utifrån använder du en portskanner som nmap från din egen dator mot ditt eget IP-adress.
Obs: Montera inte /var/run/docker.sock i en container om du inte vet exakt varför. Den som tar över den containern får därmed hela din server.
