Meilleures pratiques de sécurité pour Nginx.
Nginx est le serveur web qui connaît la croissance la plus rapide dans l’industrie, et il occupe actuellement la deuxième place en termes de parts de marché.
Il a été lancé en 2004 et, depuis, il s’est forgé une excellente réputation et est utilisé dans les millions de sites les plus fréquentés.
Il y a une raison à cela : Nginx est extrêmement rapide.
Dans cet article, je vais parler de certains des guides essentiels pour sécuriser Nginx dans un environnement de production. Commençons donc.
SSL/TLS
Implémenter un certificat SSL
La première étape de la sécurité sur le web consiste à mettre en place le protocole SSL afin que vous puissiez accéder aux applications web avec https et ajouter une couche de cryptage dans la communication.
- Utilisez OpenSSL pour générer une CSR avec 2048 bit et sha-2
openssl req -nodes -new -sha256 -newkey rsa:2048 -keyout bestflare.key -out bestflare.csr
- La commande ci-dessus générera les fichiers CSR et clé directement sur le poste de travail actuel. N’oubliez pas de changer le nom des fichiers .csr et .key.
Faites signer la CSR par une autorité de certification et une fois que vous avez le certificat signé, vous pouvez l’implémenter dans Nginx comme ci-dessous.
- Connectez-vous au serveur Nginx
- Allez dans le dossier conf où se trouve le fichier ssl.conf.
Note : Dans l’installation par défaut sous Linux, ce fichier se trouve sous /etc/nginx/conf.d.
- Modifiez le fichier et ajoutez les éléments suivants, qui permettront à Nginx d’écouter sur le port 443
server {
listen 443 ssl ;
nom_du_serveur bestflare.com ;
ssl on ;
ssl_certificate /opt/cert/bestflare.pem ;
ssl_certificate_key /opt/cert/bestflare.key ;
}
Note : n’oubliez pas de modifier le chemin d’accès au certificat et à la clé.
- Sauvegardez la configuration et redémarrez Nginx. Un certificat SSL est implémenté avec succès.
Optimisation SSL/TLS
Le fait d’avoir SSL ne signifie pas qu’il est entièrement sécurisé et c’est là qu’en tant qu’expert en sécurité web, vous devez appliquer une configuration pour sécuriser le serveur web.
Pour commencer, je vous recommande d’effectuer une analyse SSL du site web afin de déterminer le score et la vulnérabilité essentielle.
Ainsi, la note actuelle de SSL Labs est de “C” et l’objectif est de la porter à “A”
Désactiver les protocoles SSL/TLS faibles
SSL 3, TLS 1.0 et TLS 1.1 sont vulnérables, et nous n’autoriserons qu’un protocole TLS 1.2 fort.
- Editez le fichier ssl.conf et ajoutez ce qui suit dans le bloc serveur
ssl_protocols TLSv1.2 ;
- Sauvegardez le fichier ssl.conf et redémarrez Nginx
Désactivez les suites de chiffrement faibles
Les suites de chiffrement faibles peuvent entraîner des vulnérabilités telles qu’un blocage, et c’est pourquoi nous devons autoriser uniquement les suites de chiffrement fortes.
- Ajoutez ce qui suit au bloc serveur dans le fichier ssl.conf
ssl_ciphers "EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA384 EECDH ECDSA SHA256 EECDH aRSA SHA384 EECDH aRSA SHA256 EECDH aRSA RC4 EECDH EDH aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS" ;
- Sauvegardez le fichier et redémarrez Nginx
Installez le certificat de chaîne
L’absence de certificat de chaîne affecte également l’évaluation globale et peut entraîner une erreur lors de la navigation dans un navigateur moderne tel que Chrome. Vous devez obtenir un certificat de chaîne auprès d’une autorité. La plupart du temps, vous le trouverez sur leur site web ou sur Google.
- Ajoutez le contenu du certificat de chaîne dans le certificat du site web comme ci-dessous. Dans mon exemple, ce serait /opt/cert/bestflare.pem
- Enregistrez le fichier et redémarrez Nginx
Sécuriser Diffie-Hellman pour TLS
Diffie-Hellman est moins sûr qu’on ne le pensait. L’une des meilleures pratiques récemment ajoutées à une liste est de sécuriser Diffie-Hellman. La génération d’un GROUPE DH unique et l’ajout de ssl_dhparam dans le fichier ssl.conf permettent de le faire.
- Générer un groupe DH unique en utilisant OpenSSL
openssl dhparam -out dhparams.pem 4096
- Cela prendra quelques minutes et générera un fichier dhparams.pem dans le répertoire de travail actuel
- Copiez dhparams.pem dans le dossier cert
- Modifiez ssl.conf et ajoutez ce qui suit dans le bloc serveur
ssl_dhparam /opt/cert/dhparams.pem ;
- Enregistrez le fichier et redémarrez Nginx
Cela devrait suffire pour l’optimisation SSL/TLS et testons à nouveau l’URL pour voir le résultat.
Woo ho ! Vous pouvez maintenant voir la note “A” attribuée par SSLLabs. C’est très bien !
Voici le fichier ssl.conf complet
# Configuration du serveur HTTPS
serveur {
listen 443 ssl ;
nom_du_serveur bestflare.com ;
ssl on ;
ssl_certificate /opt/cert/bestflare.pem ;
ssl_certificate_key /opt/cert/bestflare.key ;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ;
ssl_prefer_server_ciphers on ;
ssl_ciphers "EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA384 EECDH ECDSA SHA256 EECDH aRSA SHA384 EECDH aRSA SHA256 EECDH aRSA RC4 EECDH EDH aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS" ;
ssl_dhparam /opt/cert/dhparams.pem ;
}
Fuite d’informations
Dans l’installation par défaut de Nginx, de nombreuses informations sensibles sont révélées, ce qui peut aider les pirates à préparer une attaque.
Si vous travaillez dans un environnement conforme à la norme PCI, cette vulnérabilité est considérée comme une fuite d’informations et doit être corrigée.
Vous devez utiliser server_tokens off pour désactiver la fuite d’informations. J’ai expliqué cela dans mon article précédent. Supprimer la version de la bannière d’en-tête du serveur dans Nginx
Sécurité des applications web
La configuration par défaut de Nginx n’est pas parfaite et peut présenter de nombreuses vulnérabilités, c’est pourquoi nous la renforçons pour la rendre sûre.
Désactivez les méthodes HTTP indésirables
La plupart du temps, vous n’avez besoin que des requêtes HTTP GET, HEAD et POST dans votre application web. Autoriser TRACE ou DELETE est risqué car cela peut permettre une attaque Cross-Site Tracking et potentiellement permettre à un hacker de voler les informations du cookie.
- Modifiez nginx.conf et ajoutez ce qui suit dans le bloc serveur
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
retournez 405 ;
}
Sauvegardez le fichier et redémarrez Nginx. Ceci affichera maintenant 405 Not Allowed si quelqu’un essaie d’utiliser TRACE, DELETE, PUT, OPTIONS.
Chandans-iMac:~ chandan$ telnet bestflare.com 80
Essai sur 128.199.100.162...
Connecté à bestflare.com.
Le caractère d'échappement est '^]'.
TRACE / HTTP/1.1
Hôte : testing
HTTP/1.1 405 Non autorisé
Serveur : nginx
Date : Sat, 11 Jul 2015 06:04:34 GMT
Content-Type : text/html
Content-Length : 166
Connexion : close
Attaque par détournement de clics
Vous pouvez injecter X-FRAME-OPTIONS dans l’en-tête HTTP pour empêcher une attaque par détournement de clic.
Pour ce faire, ajoutez ce qui suit dans le fichier nginx.conf
add_header X-Frame-Options "SAMEORIGIN" ;
L’en-tête ci-dessus demandera au navigateur de charger les ressources UNIQUEMENT à partir de la même origine.
Protection contre les X-XSS
Injectez une protection X-XSS dans l’en-tête HTTP afin de limiter les attaques de type Cross-Site Scripting.
- Modifiez le fichier nginx.conf pour ajouter ce qui suit
add_header X-XSS-Protection "1 ; mode=block" ;
- Enregistrez le fichier de configuration et redémarrez Nginx. Vous pouvez utiliser l’outil Headers Test pour vérifier la mise en œuvre.
Vous pouvez également être intéressé par l’implémentation des en-têtes sécurisés recommandés par l’OWASP, qui sont expliqués ici.
Implémenter le Mod Security WAF
Ajoutez une couche supplémentaire de sécurité en implémentant le Web Application Firewall ModSecurity avec l’OWASP Core Rule Set.
Alternativement, vous pouvez envisager d’utiliser une sécurité basée sur le cloud comme SUCURI devant le serveur Nginx.
Maintenez Nginx à jour
Enfin, vous devez maintenir votre Nginx à jour, car de nombreuses améliorations des performances, des correctifs de sécurité et de nouvelles fonctionnalités sont en cours d’ajout.
J’espère que cela vous aidera à garder votre Nginx sécurisé.
Ensuite, vous pourriez être intéressé par l’apprentissage de la construction de Nginx pour de hautes performances à partir de zéro.