Sécuriser nginx
Que faut-il sécuriser ?
Mises à jour régulières
- Assurez-vous que nginx, ainsi que le système d'exploitation, sont régulièrement mis à jour avec les derniers correctifs de sécurité.
- Utilisez des outils comme
unattended-upgrades
pour automatiser les mises à jour de sécurité sur les systèmes basés sur Ubuntu/Debian.
Firewall
- Configurez un firewall pour limiter les connexions entrantes à votre serveur web.
- Autorisez uniquement les ports nécessaires (généralement 80 pour HTTP et 443 pour HTTPS). Les autres ports doivent être bloqués, sauf si des services spécifiques les nécessitent.
- Vous pouvez utiliser
ufw
(Uncomplicated Firewall) ouiptables
pour configurer votre firewall sur Ubuntu/Debian.
HTTPS
- Activez HTTPS en utilisant un certificat TLS valide pour garantir la confidentialité des données échangées.
- Let's Encrypt permet d'obtenir des certificats TLS gratuits et offre des outils comme Certbot pour automatiser le processus de renouvellement.
-
Configurez nginx pour rediriger automatiquement le trafic HTTP vers HTTPS avec une règle de redirection 301 permanente :
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Configuration des en-têtes HTTP de sécurité
-
Ajoutez des en-têtes de sécurité pour protéger votre serveur contre diverses attaques :
Content-Security-Policy
(CSP) : Définit les règles sur les sources de contenu autorisées pour éviter l'exécution de scripts non sécurisés ou malveillants. Cette politique permet d'atténuer les attaques XSS en limitant les sources de scripts, feuilles de style, etc.Strict-Transport-Security
(HSTS) : Oblige les navigateurs à utiliser uniquement HTTPS pour accéder à votre site, en interdisant les connexions HTTP. Cela protège contre les attaques de type "downgrade" (passage forcé de HTTPS à HTTP).X-Frame-Options
: Empêche les attaques de clickjacking en interdisant l'intégration de votre site dans des iframes d'autres sites. UtilisezDENY
pour bloquer complètement ouSAMEORIGIN
pour autoriser uniquement l'intégration dans des iframes provenant du même domaine.X-Content-Type-Options
: Empêche les navigateurs d'interpréter les types MIME de manière incorrecte, réduisant les risques d'attaque par injection de contenu. Utiliseznosniff
pour bloquer tout changement de type MIME.Referrer-Policy
: Contrôle les informations envoyées via l'en-têteReferer
lors des requêtes HTTP. Vous pouvez utiliserno-referrer
,same-origin
, oustrict-origin-when-cross-origin
selon le niveau de confidentialité souhaité.X-XSS-Protection
: Active le filtre XSS intégré dans certains navigateurs pour protéger contre les attaques par injection de scripts (XSS). L'option1; mode=block
empêche l'exécution des scripts malveillants détectés.Permissions-Policy
: Anciennement appeléeFeature-Policy
, cette en-tête permet de limiter ou de désactiver certaines fonctionnalités du navigateur pour des raisons de sécurité, telles que la géolocalisation, l'accès à la caméra ou au microphone.
Exemple de configuration nginx pour ces en-têtes :
add_header Content-Security-Policy "default-src 'self'"; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; add_header X-Frame-Options "DENY"; add_header X-Content-Type-Options "nosniff"; add_header Referrer-Policy "same-origin"; add_header X-Xss-Protection "1; mode=block" always; add_header Permissions-Policy "geolocation=(), camera=(), microphone=()";
Masquer les informations de version du serveur
- Par défaut, nginx inclut la version du serveur dans les en-têtes HTTP (
Server
), ce qui peut exposer des informations sensibles aux attaquants. -
Pour masquer ces informations, vous pouvez commencer par désactiver l'affichage de la version du serveur en utilisant la directive
server_tokens
dans votre configuration principale :server_tokens off;
-
Cela empêchera nginx d'afficher la version dans les pages d'erreur et dans l'en-tête
Server
des réponses HTTP, mais l'en-têteServer
restera visible sans la version.
Supprimer complètement l'en-tête Server
avec nginx-extras
- Si vous souhaitez supprimer complètement l'en-tête
Server
des réponses HTTP, vous pouvez utiliser le moduleheaders_more
. Ce module est inclus dans le packagenginx-extras
, disponible sur les systèmes Ubuntu/Debian. -
Pour installer
nginx-extras
, exécutez la commande suivante sur votre système Ubuntu/Debian :sudo apt-get install nginx-extras
-
Après avoir installé
nginx-extras
, ajoutez la directive suivante dans votre fichier de configurationnginx.conf
(dans le blochttp
ouserver
) pour supprimer complètement l'en-têteServer
des réponses HTTP :http { more_clear_headers 'Server'; server_tokens off; ... }
-
La directive
more_clear_headers 'Server'
supprime entièrement l'en-têteServer
des réponses, renforçant ainsi la sécurité en ne laissant aucune information sur le type ou la version du serveur web.
Limitation des méthodes HTTP
-
Désactivez les méthodes HTTP non nécessaires (DELETE, PATCH, PUT, CONNECT, etc.) en utilisant la directive
limit_except
dans votre configuration. Cela permet de limiter les méthodes autorisées sur certaines URL :location / { limit_except GET POST { deny all; } }
-
Limiter les méthodes HTTP disponibles renforce la sécurité en réduisant la surface d'attaque.
Surveillance et journalisation
- Configurez des outils de surveillance pour suivre l'état de votre serveur en temps réel (comme Nagios, Zabbix ou Prometheus).
-
Activez et examinez régulièrement les fichiers de journalisation (logs) pour diagnostiquer rapidement les problèmes de sécurité. Vous pouvez également utiliser des outils d'analyse de logs pour détecter des comportements anormaux.
- Fichiers de logs par défaut :
- Access logs :
/var/log/nginx/access.log
- Error logs :
/var/log/nginx/error.log
- Access logs :
- Fichiers de logs par défaut :
Tip
Les serveurs web sont une des premières cibles des attaquants !
Sur nginx, les informations de version du serveur se trouvent dans le pied de page des pages d'erreur par défaut et dans l'en-tête Server
des réponses HTTP. Masquer ces informations est une bonne pratique pour limiter les informations accessibles aux attaquants.
Attention !
Les modifications dans la configuration du serveur peuvent affecter le bon fonctionnement de vos sites web.
✅ Réfléchissez à ce que vous faites !
✅ Comprenez bien chaque modification !
✅ Documentez-vous avant de changer des paramètres critiques !
✅ Notez les modifications que vous appliquez !
Liens utiles
Pour configurer les en-têtes HTTP :
Pour vérifier les en-têtes HTTP :