Un serveur web tout neuf est scanné quelques minutes après sa mise en ligne. L’essentiel de ce trafic est automatisé et sans danger si vous avez fait le nécessaire. Ce guide va un cran plus loin que le durcissement en 15 minutes et couvre un pare-feu, la protection contre la force brute avec fail2ban et une configuration Nginx plus sûre.
Étape 1 : un pare-feu en refus par défaut avec UFW
N’autorisez que le nécessaire et bloquez le reste. Ajoutez SSH en premier pour ne pas vous enfermer dehors.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Si vous utilisez un port SSH non standard, autorisez ce port à la place de OpenSSH.
Étape 2 : fail2ban pour les échecs répétés
fail2ban surveille les journaux et bannit les adresses IP qui échouent de façon répétée à se connecter.
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Utilisez aussi des clés SSH et désactivez la connexion par mot de passe. Voir les clés SSH expliquées.
Étape 3 : masquer la version de Nginx et ajouter des en-têtes sûrs
Dans /etc/nginx/nginx.conf, à l’intérieur du bloc http :
server_tokens off;
Dans le bloc server de votre site :
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
N’ajoutez l’en-tête HSTS que lorsque HTTPS fonctionne pour votre domaine et pour tous les sous-domaines que vous utilisez.
Étape 4 : limiter les requêtes abusives
La limitation de débit ralentit les tentatives de force brute sur les pages de connexion :
# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# in your server block
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
# ...your usual PHP handling
}
Testez et appliquez avec sudo nginx -t && sudo systemctl reload nginx.
Étape 5 : le garder à jour
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Les mises à jour de sécurité automatiques comblent les failles connues sans que vous ayez rien à faire.
Ce qu’il faut surveiller
- Vérifiez les bannissements avec
sudo fail2ban-client status sshd. - Consultez
/var/log/nginx/error.logde temps en temps. - Si vous êtes derrière un proxy ou un CDN, assurez-vous que fail2ban lit l’IP réelle du client, sinon vous risquez de bannir votre propre proxy.