Aller au contenu

Sécuriser nginx

nginx est l'un des serveurs web les plus utilisés au monde. Comme il est souvent exposé directement à Internet, il représente une cible privilégiée pour les attaquants. Sécuriser correctement sa configuration est donc une étape cruciale pour protéger ses applications et ses données.

Bonnes pratiques de sécurité

Mises à jour régulières

  • Maintenez nginx et l'OS à jour avec les derniers correctifs de sécurité.
  • Utilisez des outils comme unattended-upgrades (Ubuntu/Debian) pour automatiser les mises à jour critiques.

Firewall

  • N'autorisez que les ports nécessaires :
    • 80 (HTTP) et 443 (HTTPS).
    • Bloquez les autres ports sauf si un service en dépend.
  • Outils : ufw (simple) ou iptables/nftables (avancé).

HTTPS obligatoire

  • Activez HTTPS avec un certificat TLS valide.
  • Obtenez des certificats gratuits via Let's Encrypt avec Certbot.
  • Redirigez automatiquement HTTP → HTTPS :

    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;
    }
    

En-têtes HTTP de sécurité

Ajoutez des en-têtes pour limiter la surface d'attaque :

add_header Content-Security-Policy "default-src 'self'" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "same-origin" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
  • CSP : limite les sources de contenu (anti-XSS).
  • HSTS : impose HTTPS uniquement.
  • X-Frame-Options : empêche le clickjacking.
  • X-Content-Type-Options : empêche le MIME sniffing.
  • Referrer-Policy : contrôle l'envoi de l'URL référente.
  • X-XSS-Protection : filtre XSS (compatibilité).
  • Permissions-Policy : désactive des API navigateur sensibles.

Masquer la version du serveur

Désactivez l'affichage par défaut avec :

server_tokens off;

Pour supprimer complètement l'en-tête Server, installez nginx-extras puis utilisez :

http {
    more_clear_headers 'Server';
    server_tokens off;
}

Limiter les méthodes HTTP

Autorisez uniquement les méthodes nécessaires (HEAD, GET et POST) :

location / {
    limit_except HEAD GET POST {
        deny all;
    }
}

Journalisation et surveillance

  • Consultez régulièrement les logs pour détecter des anomalies :
    • Access logs : /var/log/nginx/access.log
    • Error logs : /var/log/nginx/error.log

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.

nginx-error-page.png

nginx-header-info.png

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 :