11 - Le firewall : contrôler qui entre et qui sort
Ce que tu vas apprendre
- Pourquoi un firewall est indispensable meme derrière un reverse proxy
- Configurer ufw rapidement et efficacement
- Comprendre les bases d'iptables (chaînes, regles, politique par défaut)
- Ouvrir les bons ports pour tes services sans tout laisser passer
Prerequisites
Connaitre les bases du réseau Linux, notamment les ports et ss. Avoir un acces sudo.
Ma première mise en prod, j'avais un VPS tout neuf avec PostgreSQL qui ecoutait sur le port 5432... ouvert au monde entier. Il m'a fallu trois jours pour remarquer des connexions suspectes dans les logs. Depuis, la première chose que je fais sur un nouveau serveur, c'est configurer le firewall.
Pourquoi un firewall
Par défaut, un serveur Linux accepte les connexions sur tous les ports ou un service écoûte. Si tu lances PostgreSQL, il est accessible depuis Internet. Si tu lances Redis, pareil. Meme si ces services demandent une authentification, les exposer inutilement augmente la surface d'attaque.
Le principe est simple : tout bloquer par défaut, puis ouvrir uniquement ce qui est nécessaire.
ufw : le firewall pour les humains
ufw (Uncomplicated Firewall) est une surcouche a iptables qui rend la configuration lisible. C'est l'outil par défaut sur Ubuntu et Debian.
bash# Installer si necessaire
sudo apt install ufw
# Voir le statut actuel
sudo ufw status verbose
# Regle numero un : autoriser SSH AVANT d'activer le firewall
# Sinon tu te coupes l'acces a ton serveur
sudo ufw allow 22/tcp
# Activer le firewall
sudo ufw enable
# Politique par defaut : bloquer tout ce qui entre, autoriser ce qui sort
sudo ufw default deny incoming
sudo ufw default allow outgoing
Je ne peux pas insister assez : autorise SSH avant d'activer ufw. Je connais des gens qui se sont retrouves enfermes dehors sur un serveur a l'autre bout du monde. C'est un classique.
Ouvrir les ports pour tes services
bash# HTTP et HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Un port specifique pour ton app
sudo ufw allow 3000/tcp
# PostgreSQL depuis une IP precise uniquement
sudo ufw allow from 10.0.0.5 to any port 5432
# Autoriser un sous-reseau
sudo ufw allow from 10.0.0.0/24 to any port 5432
# Supprimer une regle
sudo ufw delete allow 3000/tcp
# Voir les regles numerotees (utile pour supprimer)
sudo ufw status numbered
# Supprimer par numero
sudo ufw delete 3
Sur paltemps.fr, ma config est minimaliste : SSH, HTTP, HTTPS. PostgreSQL n'écoûte que sur localhost, donc pas besoin d'ouvrir le port 5432.
Les profils d'application ufw
Certaines applications installent des profils ufw :
bash# Voir les profils disponibles
sudo ufw app list
# Autoriser un profil
sudo ufw allow "Nginx Full"
# Voir ce qu'un profil autorise
sudo ufw app info "Nginx Full"
Les profils Nginx courants : Nginx HTTP (port 80), Nginx HTTPS (port 443), Nginx Full (les deux). OpenSSH a aussi son profil.
iptables : comprendre ce qui se passe en dessous
ufw généré des regles iptables. Connaitre les bases d'iptables est utile pour debugger et pour comprendre les tutoriels que tu trouveras en ligne.
iptables organise les regles en chaînes :
- INPUT : trafic entrant destine a la machine
- OUTPUT : trafic sortant de la machine
- FORWARD : trafic qui transite (routage, conteneurs Docker)
Chaque regle a une cible : ACCEPT, DROP (silencieux), ou REJECT (envoie une erreur).
bash# Voir toutes les regles
sudo iptables -L -n -v
# Voir les regles avec les numeros de ligne
sudo iptables -L --line-numbers
# Autoriser SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Autoriser HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Autoriser HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Autoriser les connexions deja etablies (indispensable)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Autoriser le loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Bloquer tout le reste en entree
sudo iptables -P INPUT DROP
# Supprimer une regle par numero
sudo iptables -D INPUT 3
L'ordre des regles compte. iptables parcourt les regles de haut en bas et s'arrêté a la première qui matche. Si tu mets DROP tout en haut, plus rien ne passe.
La politique "deny by default"
La bonne approche, c'est toujours :
- Politique par défaut : tout bloquer
- Autoriser explicitement ce qui doit passer
- Documenter chaque regle
bash# Avec ufw, c'est simple
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Ne tombe pas dans le piège de "j'ouvre temporairement le port 5432 pour tester" et oublier de le refermer. Ce "temporaire" a une facheuse tendance a devenir permanent.
Verifier que ca marche
bash# Voir les regles actives
sudo ufw status verbose
# Depuis une autre machine, scanner les ports ouverts
nmap -Pn ton-serveur.com
# Verifier qu'un port precis est ferme
nc -zv ton-serveur.com 5432
# Connection refused = bien, le port est ferme
Résumé
- Toujours autoriser SSH avant d'activer le firewall
ufwest l'outil a utiliser au quotidien, iptables pour comprendre- Politique "deny by default" : bloquer tout, ouvrir le minimum
- Ne jamais exposer les bases de donnees directement sur Internet
- Verifier avec
ss -tlnpetnmapque seuls les bons ports sont ouverts
Article précédent : Le réseau Article suivant : SSH