Chapitre 6 · 6.3
Docker et le pare-feu : publier des ports en toute sécurité
C'est le piège dans lequel tombent la plupart des utilisateurs. Un port que vous publiez dans Docker avec ports: est accessible depuis Internet, même si ufw ferme ce port. Docker définit ses propres règles de pare-feu, et celles-ci passent avant les règles d'ufw.
Un exemple de ce qui tourne mal
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Votre pare-feu indique que seuls les ports 22, 80 et 443 sont ouverts. Pourtant, votre base de données est désormais accessible depuis le monde entier sur le port 3306.
Trois règles pour rester en sécurité
- Ne publiez que ce qui doit être accessible depuis l'extérieur. Dans ce manuel, il s'agit uniquement de Caddy, sur les ports 80 et 443. Les applications communiquent avec Caddy via le réseau interne de compose. Elles n'ont pas besoin de
ports:. - Un port doit-il être accessible uniquement sur le serveur lui-même ? Placez
127.0.0.1:devant. Seul le serveur lui-même peut alors y accéder, ou vous-même via un tunnel SSH (voir Un fichier de configuration SSH : se connecter avec un nom court). - Une base de données ne reçoit jamais
ports:. L'application la trouve par le nom du service, par exempledb.
ports:
- "127.0.0.1:3001:3001"
Vérifier depuis l'extérieur
Vérifiez sur le serveur quels ports sont ouverts à tous :
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",...))
Tout ce qui indique 0.0.0.0 ou [::] est accessible depuis l'extérieur. Tout ce qui indique 127.0.0.1 ne l'est que depuis l'intérieur. Pour le voir depuis l'extérieur, utilisez depuis votre propre ordinateur un scanner de ports tel que nmap sur votre propre adresse IP.
Attention : Ne montez pas /var/run/docker.sock dans un conteneur, sauf si vous savez exactement pourquoi. Quiconque prend le contrôle de ce conteneur obtient ainsi l'accès à l'ensemble de votre serveur.
