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

Le guide ultime pour sécuriser, durcir et améliorer les performances du serveur Web Nginx
Conseils de durcissement de la sécurité Nginx

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

Si oui, je suis sûr que vous accueillerez ce guide à bras ouverts car nous allons couvrir 12 conseils pour augmenter la sécurité de votre nginx Serveurs (allant de la maintenance à Nginx à jour jusqu'à l'utilisation de TLS et de rediriger HTTP vers HTTP.

Ne manque pas:

13 Conseils de sécurité et de durcissement du serveur Web Apache

25 astuces Apache Htaccess pour sécuriser le serveur Web Apache

Environnement de test Nginx

Nous utiliserons l'environnement suivant dans ce guide:

  1. Debian GNU / Linux 8.1 (Jessie).
  2. Adresse IP: 192.168.0.25 (tecmintlovesnginx.com) et 192.168.0.26 (nginxmeanspower.com), comme décrit dans la section des hôtes virtuels basés sur IP à
    1. "Comment configurer des hôtes virtuels basés sur le nom et basés sur IP (blocs de serveurs) avec Nginx"
  3. Version Nginx: Nginx / 1.6.2.
  4. Pour votre commodité, voici le fichier de configuration final (lien pastebin).

Dans cet esprit, commençons.

Astuce n ° 1: Gardez Nginx à jour

Au moment d'écrire ces lignes, les dernières versions Nginx du Centos (en Epel) et les référentiels Debian sont 1.6.3 et 1.6.2-5, respectivement.

Ne manquez pas: Installez la dernière version stable de Nginx à partir de référentiels et de source

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) il vous permet de créer des modules supplémentaires dans Nginx (tels que mod_security), et 2) il fournira toujours une version plus récente que les référentiels (1.9.9 à ce jour). Les notes de version sont toujours disponibles sur le site Web de Nginx.

Ne manque pas:

Protégez Apache contre la force brute et les attaques DDOS en utilisant MOD_SECURITY et MOD_EVASIV

Astuce n ° 2: supprimez les modules inutiles dans Nginx

Pour supprimer explicitement les modules de Nginx lors de l'installation à partir de la source, faites:

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

Par exemple:

# ./ Configurer --without-http_dav_module --withtttp_spdy_module 

Comme vous le supposerez probablement, la suppression des modules d'une installation Nginx précédente de Source nécessite de réactiver la compilation.

Un mot d'avertissement: Les directives de configuration sont fournies par des modules. Assurez-vous de ne pas désactiver un module qui contient une directive dont vous aurez besoin sur la route! Vous devez vérifier les documents Nginx pour la liste des directives disponibles dans chaque module avant de prendre une décision sur les modules de désactivation.

Astuce n ° 3: Désactiver la directive Server_Tokens dans Nginx

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

Pour désactiver le server_tokens Directive, réglez si vous éteignez dans un bloc de serveur:

serveur écouter 192.168.0.25:80; server_tokens off; server_name tecmintlovesnginx.com www.tecmintlovesnginx.com; Access_log / var / www / logs / tecmintlovesnginx.accès.enregistrer; error_log / var / www / logs / tecmintlovesnginx.erreur.erreur de journal; root / var / www / tecmintlovesnginx.com / public_html; Index index.index html.htm;  

Redémarrez Nginx et vérifiez les modifications:

Masquer les informations de la version Nginx

Astuce n ° 4: refuser les agents utilisateur HTTP dans Nginx

Un agent utilisateur HTTP est un logiciel utilisé pour la négociation de contenu contre un serveur Web. Cela comprend également des robots et des robots de logiciels malveillants qui peuvent finir par avoir un impact sur les performances de votre serveur Web en gaspillant les ressources système.

Afin de maintenir plus facilement la liste des agents utilisateur indésirables, créez un fichier (/ etc / nginx / blockUserAgents.règles par exemple) avec le contenu suivant:

map $ http_user_agent $ blokedagent default 0; ~ * malveillant 1; ~ * bot 1; ~ * Backdoor 1; ~ * Crawler 1; ~ * Bandit 1;  

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

inclure / etc / nginx / blockUserAgents.règles; 

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

Désactiver les agents des utilisateurs dans Nginx

Redémarrez Nginx, et tous les agents utilisateur dont la chaîne correspond à ce qui précède sera empêché d'accès à votre serveur Web. Remplacer 192.168.0.25 avec IP de votre serveur et n'hésitez pas à choisir une chaîne différente pour le --agent utilisateur commutation de wget:

# wget http: // 192.168.0.25 / index.html # wget --User-agent "Je suis un bandit haha" http: // 192.168.0.25 / index.html 
Bloquer les agents des utilisateurs dans Nginx

Astuce n ° 5: désactiver les méthodes HTTP indésirables dans Nginx

Également connue sous le nom de verbes, les méthodes HTTP indiquent que les mesures souhaitées doivent être prises sur une ressource desservie par Nginx. Pour les sites Web et les applications communs, vous ne devriez autoriser que OBTENIR, POSTE, et DIRIGER et désactiver tous les autres.

Pour ce faire, placez les lignes suivantes dans un bloc de serveur. UN 444 La réponse HTTP 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, utiliser boucle Pour envoyer un SUPPRIMER demander et comparer la sortie lorsque vous envoyez un régulier OBTENIR:

# curl -x supprimer http: // 192.168.0.25 / index.html # curl -x post http: // 192.168.0.25 / index.html 
Désactiver les demandes HTTP indésirables dans Nginx

Astuce n ° 6: Définissez les limitations de la taille du tampon dans Nginx

Pour éviter les attaques de débordement de tampon contre votre serveur Web Nginx, définissez les directives suivantes dans un fichier séparé (créer un nouveau fichier nommé / etc / nginx / confre.d / tampon.confli, Par exemple):

client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1K; Large_client_header_buffer 2 1k; 

Les directives ci-dessus garantiront que les demandes faites à votre serveur Web ne provoqueront pas de débordement de tampon dans votre système. Encore une fois, reportez-vous aux documents pour plus de détails sur ce que chacun d'eux fait.

Puis ajoutez une directive inclue dans le fichier de configuration:

inclure / etc / nginx / confre.d/*.conf; 
Définir la taille du tampon dans Nginx

Astuce n ° 7: Limitez le nombre de connexions par IP dans Nginx

Afin de limiter les connexions par IP, utilisez le limit_conn_zone (dans un contexte HTTP ou du moins en dehors du bloc serveur) et limite_conn (dans un HTTP, un bloc de serveur ou un contexte de localisation).

Cependant, gardez à l'esprit que toutes les connexions ne sont pas comptées - mais seules celles qui ont une demande traitée par le serveur et l'ensemble de son demande ont été lues.

Par exemple, définissons le nombre maximum de connexions à 1 (Oui, c'est une exagération, mais cela fera très bien le travail dans ce cas) dans une zone nommée Addr (vous pouvez définir ceci sur le nom que vous souhaitez):

limit_conn_zone $ binary_remote_addr zone = addr: 5m; limit_connd addr 1; 
Limiter le nombre de demandes HTTP dans Nginx

Un test simple avec une référence Apache (effectuer une charge Nginx) où dix Les connexions totales sont établies avec 2 Les demandes simultanées nous aideront à démontrer notre point:

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

Voir le prochain conseil pour plus de détails.

Astuce n ° 8: Configuration des journaux du moniteur pour Nginx

Une fois que vous avez effectué le test décrit dans la pointe précédente, vérifiez le journal d'erreur défini pour le bloc serveur:

Journal d'erreur Nginx

Vous voudrez peut-être utiliser grep Pour filtrer les journaux pour les demandes échouées faites au ajouterZone R définie dans Astuce n ° 7:

# grep addr / var / www / logs / tecmintlovesnginx.erreur.journal --color = auto 
Surveillance du journal Nginx

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

  1. IP du client
  2. Type de navigateur
  3. Type de demande HTTP
  4. Ressource demandée
  5. Block de serveur répondant à la demande (utile si plusieurs hôtes virtuels se sont enregistrés dans le même fichier).

Et prenez les mesures appropriées si vous détectez une activité inhabituelle ou indésirable.

Astuce n ° 9: Empêchez l'image de Hotlinking dans Nginx

Image Hotlinking se produit lorsqu'une personne affiche dans un autre site Une image hébergée sur la vôtre. Cela provoque une augmentation de votre utilisation de la bande passante (que vous payez) tandis que l'autre personne affiche heureusement l'image comme si c'était sa propriété. En d'autres termes, c'est une double perte pour vous.

Par exemple, disons que vous avez un sous-répertoire nommé IMG À l'intérieur de votre bloc de 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 devrez insérer le bloc d'emplacement suivant dans votre définition de l'hôte virtuel:

emplacement / img / valid_referers aucun n'a bloqué 192.168.0.25 if ($ invalid_referer) return 403;  

Puis modifiez le indice.html Fichier dans chaque hôte virtuel comme suit:

192.168.0.26

192.168.0.25





Nginx signifie puissance


Nginx signifie puissance!








Tecmint aime Nginx


Tecmint aime Nginx!




Maintenant, parcourez chaque site et comme vous pouvez le voir, l'image est correctement affichée dans 192.168.0.25 mais est remplacé par un 403 réponse dans 192.168.0.26:

Désactiver l'image nginx hotlinking

Notez que cette astuce dépend du navigateur distant qui envoie le champ référent.

Astuce n ° 10: Désactiver SSL et activer uniquement TLS dans Nginx

Dans la mesure du possible, faites tout ce qu'il faut pour éviter SSL dans l'une de ses versions et utilisation TLS plutôt. Ce qui suit ssl_protocols doit être placé dans un contexte de serveur ou HTTP dans votre fichier hôte virtuel ou est un fichier séparé via une directive inclue (certaines personnes utilisent un fichier nommé SSL.confli, Mais c'est entièrement à vous):

SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2; 

Par exemple:

Désactiver SSL et activer TLS dans Nginx

Astuce n ° 11: créer des certificats en 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 le souhaitez:

# OpenSSL Genrsa -AES256 -out Tecmintlovesnginx.Key 1024 # OpenSSL REQ -NEW -KEY TECMINTLOVESNGINX.Key -out tecmintlovesnginx.CSR # cp tecmintlovesnginx.clé tecmintlovesnginx.clé.org # openssl rsa -in tecmintlovesnginx.clé.org -out tecmintlovesnginx.Clé # OpenSSL X509 -req -Days 365 -in Tecmintlovesnginx.CSR -SIGNKEY Tecmintlovesnginx.Key -out tecmintlovesnginx.CRT 

Ajoutez ensuite les lignes suivantes à l'intérieur d'un bloc de serveur séparé en préparation pour la pointe suivante (http -> https Redirection) et déplacez également les directives liées au SSL vers le nouveau bloc:

serveur écouter 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 compatible / certs / tecmintlovesnginx.CRT; ssl_certificate_key / etc / nginx / sites compatible / certs / tecmintlovesnginx.clé; SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2;  

Dans le prochain conseil, nous vérifierons comment notre site utilise maintenant un certificat auto-signé et TLS.

Astuce n ° 12: Rediriger le trafic HTTP vers HTTPS dans Nginx

Ajoutez la ligne suivante au premier bloc de serveur:

retour 301 https: // $ server_name $ request_uri; 
Rediriger HTTP vers HTTPS dans Nginx

La directive ci-dessus renvoie un 301 Réponse (déplacée en permanence), qui est utilisée pour la redirection de l'URL permanente chaque fois qu'une demande est faite au port 80 de votre hôte virtuel, et redirigera la demande vers le bloc de serveur que nous avons ajouté dans la pointe 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:

Vérifiez le cryptage TLS Nginx

Résumé

Dans cet article, nous avons partagé quelques conseils pour sécuriser votre serveur Web Nginx. Nous aimerions entendre ce que vous pensez et, si vous avez d'autres conseils que vous souhaitez partager avec le reste de la communauté, n'hésitez pas à nous le faire savoir en nous envoyant une note en utilisant le formulaire de commentaire ci-dessous.