OffshoreVps
Sécurité27 sept. 20266 min de lecturePar l’équipe OffshoreVps

Durcir un serveur web : paramètres UFW, fail2ban et Nginx

Un pare-feu en refus par défaut, des jails fail2ban, des en-têtes Nginx plus sûrs, la limitation de débit et des mises à jour automatiques pour un VPS qui héberge un site web.

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.

Fenêtre de terminal sur un VPS montrant les commandes utilisées pour durcir un serveur web avec UFW, fail2ban et Nginx, à commencer par « sudo ufw default deny incoming »
Le type de commandes que vous exécuterez sur votre serveur dans ce guide.

É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.

Les étapes de ce guide dans l’ordre : 1. un pare-feu en refus par défaut avec UFW ; 2. fail2ban pour les échecs répétés ; 3. masquer la version de Nginx et ajouter des en-têtes sûrs ; 4. limiter les requêtes abusives ; 5. le garder à jour ; 6. Ce qu’il faut surveiller
Les étapes de ce guide, dans l’ordre.

É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.log de 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.