Aller au contenu

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) ou iptables 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. Utilisez DENY pour bloquer complètement ou SAMEORIGIN 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. Utilisez nosniff pour bloquer tout changement de type MIME.
    • Referrer-Policy : Contrôle les informations envoyées via l'en-tête Referer lors des requêtes HTTP. Vous pouvez utiliser no-referrer, same-origin, ou strict-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'option 1; mode=block empêche l'exécution des scripts malveillants détectés.
    • Permissions-Policy : Anciennement appelée Feature-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ête Server 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 module headers_more. Ce module est inclus dans le package nginx-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 configuration nginx.conf (dans le bloc http ou server) pour supprimer complètement l'en-tête Server des réponses HTTP :

    http {
        more_clear_headers 'Server';
        server_tokens off;
        ...
    }
    
  • La directive more_clear_headers 'Server' supprime entièrement l'en-tête Server 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

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 :