Le guide ultime pour sécuriser, renforcer et améliorer les performances du serveur Web Nginx


En vous basant sur les merveilleuses choses dont vous avez entendu parler sur Nginx , vous avez peut-être décidé de l'essayer. Vous avez peut-être tellement aimé que vous envisagiez de remplacer vos installations Apache par Nginx après avoir lu certains des articles sur le sujet que nous avons publiés sur ce site.

Si tel est le cas, je suis certain que vous accueillerez ce guide à bras ouverts, car nous allons présenter 12 conseils pour accroître la sécurité de vos serveurs Nginx (allant de la mise à jour à Nginx jusqu'à en utilisant TLS et en redirigeant HTTP vers HTTPS), et vous remarquerez que certaines ressemblent beaucoup à ce que vous feriez avec Apache.

rouge

Nous allons utiliser l'environnement suivant dans ce guide:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP address: 192.168.0.25 (tecmintlovesnginx.com) and 192.168.0.26 (nginxmeanspower.com), as described in the IP-based virtual hosts section at
    1. “How to Setup Name-based and IP-based Virtual Hosts (Server Blocks) with Nginx“

    Dans cet esprit, commençons.

    CONSEIL N ° 1: Gardez Nginx à jour

    Au moment de la rédaction de ce document, les dernières versions de Nginx des référentiels CentOS (dans EPEL ) et Debian sont 1.6.3 et 1.6.2-5 , respectivement.

    Bien que l’installation de logiciels à partir des référentiels soit plus facile que la compilation du programme à partir du code source, cette dernière option présente deux avantages: 1) elle vous permet de créer des modules supplémentaires dans Nginx (tels que mod_security) et 2) elle fournira toujours une version plus récente. que les référentiels ( 1.9.9 à compter d'aujourd'hui). Les notes de publication sont toujours disponibles sur le site Web de Nginx.

    rouge

    CONSEIL N ° 2: Suppression des modules inutiles dans Nginx

    Pour supprimer explicitement les modules de Nginx lors de l'installation à partir du source, procédez comme suit:

    # ./configure --without-module1 --without-module2 --without-module3
    

    Par exemple:

    # ./configure  --without-http_dav_module --withouthttp_spdy_module 
    

    Comme vous l'aurez probablement deviné, la suppression des modules d'une installation précédente de Nginx à partir de la source nécessite de relancer la compilation.

    rouge

    CONSEIL N ° 3: Désactiver la directive server_tokens dans Nginx

    La directive server_tokens indique à Nginx d'afficher sa version actuelle sur les pages d'erreur. Cela n’est pas souhaitable car vous ne souhaitez pas partager ces informations avec le monde entier afin de prévenir les attaques de votre serveur Web causées par des vulnérabilités connues de cette version spécifique.

    Pour désactiver la directive server_tokens , définissez si désactivé dans un bloc de serveur:

    server {
        listen       192.168.0.25:80;
        Server_tokens        off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        access_log  /var/www/logs/tecmintlovesnginx.access.log;
        error_log  /var/www/logs/tecmintlovesnginx.error.log error;
            root   /var/www/tecmintlovesnginx.com/public_html;
            index  index.html index.htm;
    }
    

    Redémarrez nginx et vérifiez les modifications:

    CONSEIL N ° 4: Refuser les agents d'utilisateur HTTP dans Nginx

    Un agent d'utilisateur HTTP est un logiciel utilisé pour la négociation de contenu sur un serveur Web. Cela inclut également les robots malveillants et les robots qui risquent d’avoir une incidence sur les performances de votre serveur Web en gaspillant des ressources système.

    Afin de gérer plus facilement la liste des agents utilisateurs indésirables, créez un fichier ( /etc/nginx/blockuseragents.rules par exemple) avec le contenu suivant:

    map $http_user_agent $blockedagent {
            default         0;
            ~*malicious     1;
            ~*bot           1;
            ~*backdoor      1;
            ~*crawler       1;
            ~*bandit        1;
    }
    

    Ensuite, placez la ligne suivante avant la définition de bloc du serveur:

    include /etc/nginx/blockuseragents.rules;
    

    Et une instruction if pour renvoyer une réponse 403 si la chaîne de l'agent d'utilisateur est dans la liste noire définie ci-dessus:

    Redémarrez nginx et tous les agents utilisateurs dont la chaîne correspond à celle ci-dessus ne pourront pas accéder à votre serveur Web. Remplacez 192.168.0.25 par l'adresse IP de votre serveur et n'hésitez pas à choisir une autre chaîne pour le commutateur - user-agent de wget :

    # wget http://192.168.0.25/index.html
    # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 
    

    CONSEIL N ° 5: Désactivez les méthodes HTTP indésirables dans Nginx

    Également appelées verbes, les méthodes HTTP indiquent l'action à entreprendre sur une ressource servie par Nginx. Pour les sites et applications Web courants, vous devez uniquement autoriser GET , POST et HEAD , ainsi que désactiver tous les autres.

    Pour ce faire, placez les lignes suivantes dans un bloc de serveur. Une réponse HTTP 444 signifie une réponse vide et est souvent utilisée dans Nginx pour tromper les attaques de logiciels malveillants:

    if ($request_method !~ ^(GET|HEAD|POST)$) {
       return 444;
    }
    

    Pour tester, utilisez curl pour envoyer une demande SUPPRIMER et comparez le résultat obtenu lorsque vous envoyez un GET normal:

    # curl -X DELETE http://192.168.0.25/index.html
    # curl -X POST http://192.168.0.25/index.html 
    

    CONSEIL N ° 6: Définir les limites de la taille de la mémoire tampon dans Nginx

    Pour empêcher les attaques de dépassement de tampon sur votre serveur Web Nginx, définissez les directives suivantes dans un fichier séparé (créez un nouveau fichier nommé /etc/nginx/conf.d/buffer.conf , par exemple):

    client_body_buffer_size  1k;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
    

    Les directives ci-dessus garantissent que les requêtes adressées à votre serveur Web ne provoqueront pas de dépassement de tampon dans votre système. Encore une fois, référez-vous à la documentation pour plus de détails sur ce que chacun fait.

    Ajoutez ensuite une directive include dans le fichier de configuration:

    include /etc/nginx/conf.d/*.conf;
    

    CONSEIL N ° 7: Limitez le nombre de connexions par IP dans Nginx

    Pour limiter les connexions par IP, utilisez les directives limit_conn_zone (dans un contexte http ou du moins en dehors du bloc serveur) et limit_conn (dans un contexte http, un bloc serveur ou un emplacement).

    Cependant, gardez à l'esprit que toutes les connexions ne sont pas comptées, mais uniquement celles pour lesquelles une requête a été traitée par le serveur et dont l'intégralité de l'en-tête de requête a été lue.

    Par exemple, définissons le nombre maximal de connexions sur 1 (oui, c’est une exagération, mais cela suffira dans ce cas) dans une zone nommée addr (vous pouvez le définir comme nom que vous souhaitez):

    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 1;
    

    Un simple test avec Apache Benchmark (Perform Nginx Load) où 10 total de connexions est établi avec 2 requêtes simultanées nous aidera à démontrer notre argument:

    # ab -n 10 -c 2 http://192.168.0.25/index.html
    

    Voir le prochain conseil pour plus de détails.

    CONSEIL N ° 8: Setup Monitor Logs for Nginx

    Une fois que vous avez effectué le test décrit dans le conseil précédent, consultez le journal des erreurs défini pour le bloc de serveur:

    Vous pouvez utiliser grep pour filtrer les journaux des demandes ayant échoué dans la zone add définie dans TIP # 7 :

    # grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
    

    De même, vous pouvez filtrer le journal des accès pour les informations d’intérêt, telles que:

    1. Client IP
    2. Browser type
    3. HTTP request type
    4. Resource requested
    5. Server block answering the request (useful if several virtual hosts are logging to the same file).

    Et prenez les mesures qui s'imposent si vous détectez une activité inhabituelle ou indésirable.

    CONSEIL N ° 9: Empêcher la création de liens d’image avec Nginx

    Le lien direct entre les images se produit lorsqu'une personne affiche sur un autre site une image hébergée sur le vôtre. Cela entraîne une augmentation de votre utilisation de la bande passante (que vous payez) alors que l'autre personne affiche joyeusement l'image comme si elle lui appartenait. En d’autres termes, c’est une double perte pour vous.

    Par exemple, disons que vous avez un sous-répertoire nommé img dans votre bloc serveur où vous stockez toutes les images utilisées dans cet hôte virtuel. Pour empêcher d'autres sites d'utiliser vos images, vous devez insérer le bloc d'emplacement suivant dans votre définition d'hôte virtuel:

    location /img/ {
      valid_referers none blocked 192.168.0.25;
       if ($invalid_referer) {
         return   403;
       }
    }
    

    Modifiez ensuite le fichier index.html dans chaque hôte virtuel comme suit:

    Parcourez maintenant chaque site et, comme vous pouvez le constater, l’image est correctement affichée dans 192.168.0.25 mais est remplacée par une réponse 403 dans 192.168.0.26 :

    Notez que cette astuce dépend du navigateur distant qui envoie le champ Referer.

    CONSEIL N ° 10: Désactivez SSL et activez seulement TLS dans Nginx

    Autant que possible, faites tout ce qui est en votre pouvoir pour éviter d'utiliser SSL dans l'une de ses versions, mais utilisez TLS . Le ssl_protocols suivant doit être placé dans un contexte serveur ou http dans votre fichier d’hôte virtuel ou constitue un fichier séparé via une directive include (certaines personnes utilisent un fichier nommé ssl.conf , mais c'est à vous de décider):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Par exemple:

    CONSEIL N ° 11: Créer des certificats dans Nginx

    Tout d'abord, générez une clé et un certificat. N'hésitez pas à utiliser un type de cryptage différent si vous voulez:

    # openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
    # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
    # cp tecmintlovesnginx.key tecmintlovesnginx.key.org
    # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
    # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt
    

    Ajoutez ensuite les lignes suivantes dans un bloc serveur distinct en vue du prochain conseil (redirection http - & gt; https ), puis déplacez les directives relatives à SSL dans le nouveau bloc:

    server {
        listen 192.168.0.25:443 ssl;
        server_tokens off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        root   /var/www/tecmintlovesnginx.com/public_html;
        ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
        ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    }
    

    Dans le prochain conseil, nous verrons comment notre site utilise désormais un cert et un TLS auto-signés.

    CONSEIL N ° 12: Rediriger le trafic HTTP vers HTTPS dans Nginx

    Ajoutez la ligne suivante au premier bloc de serveur:

    return 301 https://$server_name$request_uri;
    

    La directive ci-dessus renvoie une réponse 301 (déplacée de manière permanente), utilisée pour la redirection permanente des URL à chaque demande adressée au port 80 de votre hôte virtuel. ajouté dans l'astuce précédente.

    L'image ci-dessous montre la redirection et confirme le fait que nous utilisons TLS 1.2 et AES-256 pour le cryptage:

    Résumé

    Dans cet article, nous avons partagé quelques astuces pour sécuriser votre serveur Web Nginx. Nous aimerions connaître votre opinion et, si vous souhaitez partager d'autres astuces avec le reste de la communauté, n'hésitez pas à nous le faire savoir en nous envoyant une note à l'aide du formulaire ci-dessous.

Tous les droits sont réservés. © Linux-Console.net • 2019-2020