Comment sécuriser Nginx avec NAXSI sur Ubuntu 16.04
L'auteur a sélectionné The OWASP Foundation pour recevoir un don dans le cadre du programme Write for DOnations.
Introduction
Nginx est un serveur HTTP open source populaire et un proxy inverse connu pour sa stabilité, sa configuration simple et ses besoins en ressources frugaux. Vous pouvez augmenter considérablement la sécurité de votre serveur Nginx en utilisant un module comme NAXSI. NAXSI ( Nginx Anti XSS & Injection SQL ) est un module Nginx tiers gratuit qui fournit des fonctionnalités de pare-feu d'application Web. NAXSI analyse, filtre et sécurise le trafic qui arrive sur votre application Web et agit comme un pare-feu DROP par défaut, ce qui signifie qu'il bloque tout le trafic qui lui parvient, sauf instruction spécifique d'autoriser l'accès.
La simplicité avec laquelle un utilisateur peut manipuler l'accès est une caractéristique clé qui différencie NAXSI des autres pare-feu d'applications Web (WAF) avec des fonctionnalités similaires comme ModSecurity. Bien que ModSecurity soit livré avec un riche ensemble de fonctionnalités, il est plus difficile à maintenir que NAXSI. Cela fait de NAXSI un choix simple et adaptable qui fournit des règles facilement disponibles qui fonctionnent bien avec les applications Web populaires telles que WordPress.
Dans ce tutoriel, vous utiliserez NAXSI pour sécuriser Nginx sur votre serveur Ubuntu 16.04. Étant donné que le module NAXSI n'est pas fourni avec le package Nginx par défaut, vous devrez compiler Nginx à partir de la source avec NAXSI. À la fin de ce didacticiel, vous saurez quels types d'attaques NAXSI peut bloquer et comment configurer les règles NAXSI.
Conditions préalables
Pour terminer ce tutoriel, vous aurez besoin de :
- Un serveur Ubuntu 16.04 configuré en suivant le guide de configuration initiale du serveur Ubuntu 16.04, y compris un utilisateur sudo non root et un pare-feu.
Étape 1 - Installation de Nginx et NAXSI
La plupart des modules Nginx ne sont pas disponibles via des référentiels, et NAXSI ne fait pas exception. Pour cette raison, vous devrez télécharger et compiler manuellement Nginx à partir de la source avec NAXSI.
Tout d'abord, téléchargez Nginx à l'aide de la commande suivante.
Remarque : Ce didacticiel utilise la version 1.14 de Nginx. Pour utiliser une version plus récente, vous pouvez visiter la page de téléchargement et remplacer le texte en surbrillance dans la commande précédente par un numéro de version mis à jour. Il est recommandé d'utiliser la dernière version stable.
wget http://nginx.org/download/nginx-1.14.0.tar.gz
Ensuite, téléchargez NAXSI à partir de la version stable 0.56 sur Github.
Remarque : Ce didacticiel utilise la version 0.56 de NAXSI. Vous pouvez trouver des versions plus récentes sur la page NAXSI Github. Il est recommandé d'utiliser la dernière version stable.
wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi
Comme vous l'avez peut-être remarqué, le dépôt Nginx est une archive tar
. Vous devez d'abord l'extraire pour pouvoir le compiler et l'installer, ce que vous pouvez faire en utilisant la commande tar
.
tar -xvf nginx-1.14.0.tar.gz
Dans la commande précédente, -x
spécifie l'utilitaire d'extraction, -v
exécute l'utilitaire en mode détaillé et -f
indique le nom du fichier d'archive à extraire.
Maintenant que vous avez extrait les fichiers Nginx, vous pouvez passer à l'extraction des fichiers NAXSI à l'aide de la commande suivante :
tar -xvf naxsi
Vous avez maintenant les dossiers naxsi-0.56
et nginx-1.14.0
dans votre répertoire personnel. À l'aide des fichiers que vous venez de télécharger et d'extraire, vous pouvez compiler le serveur Nginx avec NAXSI. Déplacez-vous dans votre répertoire nginx-1.14.0
cd nginx-1.14.0
Pour compiler Nginx à partir des sources, vous aurez besoin du compilateur C gcc
, de la bibliothèque Perl Compatible Regular Expressions libpcre3-dev
et libssl-dev
, qui implémente les protocoles cryptographiques SSL et TLD . Ces dépendances peuvent être ajoutées avec la commande apt-get
.
Tout d'abord, exécutez la commande suivante pour vous assurer que vous disposez d'une liste de packages à jour.
sudo apt-get update
Installez ensuite les dépendances :
sudo apt-get install build-essential libpcre3-dev libssl-dev
Maintenant que vous avez toutes vos dépendances, vous pouvez compiler Nginx à partir de la source. Afin de préparer Nginx à être compilé à partir de la source sur votre système, exécutez le script suivant, qui créera le Makefile
qui montre où trouver toutes les dépendances nécessaires.
./configure \ --conf-path=/etc/nginx/nginx.conf \ --add-module=../naxsi-0.56/naxsi_src/ \ --error-log-path=/var/log/nginx/error.log \ --http-client-body-temp-path=/var/lib/nginx/body \ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ --http-log-path=/var/log/nginx/access.log \ --http-proxy-temp-path=/var/lib/nginx/proxy \ --lock-path=/var/lock/nginx.lock \ --pid-path=/var/run/nginx.pid \ --user=www-data \ --group=www-data \ --with-http_ssl_module \ --without-mail_pop3_module \ --without-mail_smtp_module \ --without-mail_imap_module \ --without-http_uwsgi_module \ --without-http_scgi_module \ --prefix=/usr
Chacune des lignes de la commande précédente définit un paramètre pour le serveur Web Nginx. Les plus importants d'entre eux sont le paramètre --add-module=../naxsi-0.56/naxsi_src/
, qui connecte le module NAXSI à Nginx, et les paramètres --user=www-data
et --group=www-data
, qui font fonctionner Nginx avec les privilèges d'utilisateur et de groupe. d'un utilisateur/groupe dédié appelé www-data
fourni avec votre serveur Ubuntu 16.04. Le paramètre --with-http_ssl_module
permet au serveur Nginx d'utiliser la cryptographie SSL, et les paramètres --without-mail_pop3_module
, --without-mail_smtp_module
et --without-mail_imap_module
désactivent les protocoles de messagerie inutiles qui, autrement, être automatiquement inclus. Pour plus d'explications sur ces paramètres, consultez les documents officiels Nginx.
Après avoir utilisé la commande ./configure
, exécutez la commande make
pour exécuter une série de tâches définies dans le Makefile
que vous venez de créer pour construire le programme à partir du code source.
make
Lorsque Nginx est construit et prêt à fonctionner, utilisez la commande make install
en tant que superutilisateur pour copier le programme construit et ses bibliothèques à l'emplacement correct sur votre serveur.
sudo make install
Une fois cela réussi, vous aurez une version compilée de Nginx avec le module NAXSI. Afin que NAXSI commence à bloquer le trafic indésirable, vous devez maintenant établir un ensemble de règles sur lesquelles NAXSI agira en créant une série de fichiers de configuration.
Étape 2 - Configuration de NAXSI
La partie la plus importante du fonctionnement d'un pare-feu est ses règles, qui déterminent comment les requêtes sont bloquées depuis le serveur. L'ensemble de règles de base fourni par défaut avec NAXSI est appelé règles de base. Ces règles sont destinées à rechercher des modèles dans certaines parties d'une demande et à filtrer ceux qui peuvent être des attaques. Les règles de base NAXSI sont appliquées globalement au serveur pour la correspondance des signatures.
Pour configurer Nginx afin d'utiliser ces règles de base, copiez le fichier naxsi_core.rules
dans le répertoire de configuration de Nginx.
sudo cp ~/naxsi-0.56/naxsi_config/naxsi_core.rules /etc/nginx/
Maintenant que les règles de base sont établies, ajoutez les règles Naxsi de base, qui activent et implémentent les règles de base par emplacement et attribuent des actions au serveur lorsqu'une demande d'URL ne satisfait pas les règles de base. Créez un fichier nommé naxsi.rules
dans le répertoire /etc/nginx/
. Pour ce faire, utilisez la commande suivante pour ouvrir le fichier dans l'éditeur de texte appelé nano, ou utilisez l'éditeur de texte de votre choix.
sudo nano /etc/nginx/naxsi.rules
Ajoutez le bloc de code suivant qui définit certaines règles de pare-feu de base.
/etc/nginx/naxsi.rules
SecRulesEnabled; DeniedUrl "/error.html"; ## Check for all the rules CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK;
Le code précédent définit le DeniedUrl
, qui est le URL
NAXSI redirigera lorsqu'une demande est bloquée. Le fichier permet également une liste de contrôle des différents types d'attaques que NAXSI doit bloquer, y compris l'injection SQL, les scripts intersites (XSS) et l'inclusion de fichiers distants (RFI). Une fois que vous avez ajouté le code précédent au fichier, enregistrez et quittez l'éditeur de texte.
Puisque vous avez redirigé les demandes bloquées vers /error.html
, vous pouvez maintenant créer un fichier error.html
dans le répertoire /usr/html
pour fournir à cette destination une page de destination. Ouvrez le fichier dans votre éditeur de texte :
sudo nano /usr/html/error.html
Ensuite, ajoutez le code HTML suivant au fichier pour créer une page Web permettant à l'utilisateur de savoir que sa demande a été bloquée :
/usr/html/erreur.html
<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Enregistrez le fichier et quittez l'éditeur.
Ensuite, ouvrez le fichier de configuration Nginx /etc/nginx/nginx.conf
dans votre éditeur de texte.
sudo nano /etc/nginx/nginx.conf
Pour ajouter les fichiers de configuration NAXSI à la configuration de Nginx afin que le serveur Web sache comment utiliser NAXSI, insérez les lignes de code en surbrillance dans la section http
du fichier nginx.conf
:
/etc/nginx/nginx.conf
. . . http { include mime.types; include /etc/nginx/naxsi_core.rules; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; default_type application/octet-stream; . . .
Ensuite, dans la section server
du même fichier, ajoutez la ligne en surbrillance suivante :
/etc/nginx/nginx.conf
. . . server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { include /etc/nginx/naxsi.rules; root html; index index.html index.htm; } . . .
Maintenant que vous avez configuré Nginx avec les règles de base et de base pour NAXSI, le pare-feu bloquera les requêtes malveillantes correspondantes lorsque vous démarrerez le serveur Web. Ensuite, vous pouvez écrire un script de démarrage pour vous assurer que Nginx démarre lorsque vous redémarrez le serveur.
Étape 3 - Création du script de démarrage pour Nginx
Puisque vous avez installé Nginx manuellement, l'étape suivante consiste à créer un script de démarrage pour que le serveur Web démarre automatiquement lors des rechargements du système.
Ce tutoriel utilise la suite logicielle Systemd pour créer le script. Pour ce faire, vous allez créer un fichier d'unité (voir Comprendre les unités Systemd et les fichiers d'unité pour une étude plus approfondie) pour configurer la manière dont Systemd doit démarrer et gérer le service Nginx.
Créez un fichier appelé nginx.service
et ouvrez-le dans votre éditeur de texte :
sudo nano /lib/systemd/system/nginx.service
Ajoutez les lignes suivantes au fichier :
/lib/systemd/system/nginx.service
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
La section [Unit]
définit le programme que vous configurez, [Service]
décrit comment Nginx doit se comporter au démarrage et [Install]
fournit des informations sur l'installation de l'unité. Une fois que vous avez ajouté ces lignes au fichier nginx.service
, systemd
saura comment démarrer Nginx.
Ensuite, Nginx a besoin d'un dossier pour stocker temporairement les données de requête entrantes avant de les traiter au cas où votre serveur ne disposerait pas de suffisamment de mémoire. Puisque vous avez installé Nginx à partir de la source, vous devrez créer un répertoire que Nginx pourra utiliser pour stocker ces données. Créez un répertoire appelé body
dans /var/lib/nginx
:
sudo mkdir -p /var/lib/nginx/body
Une fois le script de démarrage configuré, vous pourrez désormais démarrer le serveur Nginx.
Utilisez la commande suivante pour démarrer le serveur.
sudo systemctl start nginx
Pour vérifier que votre serveur est actif, exécutez la commande suivante :
sudo systemctl status nginx
Vous verrez la sortie suivante dans votre terminal indiquant que le serveur a démarré avec succès :
Output● nginx.service - The NGINX HTTP and reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-11-05 13:59:40 UTC; 1s ago Process: 16199 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 16194 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Main PID: 16201 (nginx) Tasks: 2 Memory: 1.3M CPU: 17ms CGroup: /system.slice/nginx.service ├─16201 nginx: master process /usr/sbin/ngin └─16202 nginx: worker proces . . .
Vous avez maintenant un serveur Nginx en cours d'exécution sécurisé par NAXSI. L'étape suivante consiste à exécuter une simulation d'attaque par injection XSS et SQL pour s'assurer que NAXSI protège efficacement votre serveur.
Étape 4 - Test NAXSI
Pour tester que Nginx est opérationnel avec le module NAXSI activé, vous allez essayer de frapper le serveur avec des requêtes HTTP malveillantes et analyser les réponses.
Tout d'abord, copiez l'adresse IP publique de votre serveur et utilisez la commande curl
pour envoyer une requête malveillante au serveur Nginx.
curl 'http://your_server_ip/?q="><script>alert(0)</script>'
Cette URL inclut le script XSS "><script>alert(0)</script>
dans le paramètre q
et doit être rejetée par le serveur. Selon les règles NAXSI que vous avez configurées précédemment, vous serez redirigé vers le fichier error.html
et recevrez la réponse suivante :
Output<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Le pare-feu NAXSI a bloqué la demande.
Maintenant, vérifiez la même chose à l'aide du journal Nginx en suivant le journal du serveur Nginx à l'aide de la commande suivante :
tail -f /var/log/nginx/error.log
Dans le journal, vous verrez que la requête XSS de l'adresse IP distante est bloquée par NAXSI :
Output2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=1&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=8&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q="><script>alert(0)</script> HTTP/1.1", host: "your_server_ip"
Appuyez sur CTRL-C
pour quitter tail
et arrêter la sortie du fichier journal des erreurs.
Ensuite, essayez une autre requête d'URL, cette fois avec une requête d'injection SQL malveillante.
curl 'http://your_server_ip/?q=1" or "1"="1"'
La partie or "1"="1"
de l'URL précédente peut exposer les données d'un utilisateur dans une base de données et sera bloquée par NAXSI. Il devrait produire la même réponse dans le terminal :
Output<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Utilisez maintenant tail
pour suivre à nouveau le journal du serveur :
tail -f /var/log/nginx/error.log
Dans le fichier journal, vous verrez l'entrée bloquée pour la tentative d'injection SQL :
Output2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$SQL&score0=40&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: "your_server_ip"
Appuyez sur CTRL-C
pour quitter le journal.
NAXSI a maintenant bloqué avec succès une attaque par injection XSS et SQL, ce qui prouve que NAXSI a été configuré correctement et que votre serveur Web Nginx est sécurisé.
Conclusion
Vous avez maintenant une compréhension de base de la façon d'utiliser NAXSI pour protéger votre serveur Web contre les attaques malveillantes. Pour en savoir plus sur la configuration de Nginx, consultez Comment configurer les blocs de serveur Nginx (hôtes virtuels) sur Ubuntu 16.04. Si vous souhaitez continuer à étudier la sécurité sur les serveurs Web, consultez Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 16.04 et Comment créer un certificat SSL auto-signé pour Nginx dans Ubuntu 16.04[ X211X].