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 programmeWrite for DOnations.

introduction

Nginx est un serveur HTTP populaire open-source et un proxy inverse, connu pour sa stabilité, sa configuration simple et ses besoins en ressources frugales. Vous pouvez augmenter considérablement la sécurité de votre serveur Nginx en utilisant un module tel que NAXSI. NAXSI (Nginx Anti XSS & SQL Injection) est un module Nginx tiers gratuit qui fournit des fonctionnalités de pare-feu d'applications Web. NAXSI analyse, filtre et sécurise le trafic qui entre dans votre application Web et agit comme un pare-feu DROP-by-default, ce qui signifie qu'il bloque tout le trafic qui se présente à son passage, sauf indication contraire.

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'application Web (WAF) avec des fonctionnalités similaires commeModSecurity. Bien que ModSecurity soit livré avec un ensemble de fonctionnalités riches, 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 didacticiel, vous utiliserez NAXSI pour sécuriser Nginx sur votre serveur Ubuntu 16.04. Le module NAXSI n'étant pas fourni avec le package Nginx par défaut, vous devez compiler Nginx à partir de la source avec NAXSI. À la fin de ce didacticiel, vous saurez quels types d'attaques NAXSI peuvent bloquer et comment configurer les règles NAXSI.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin de:

[[step-1 -—- Installing-nginx-and-naxsi]] == Étape 1 - Installation de Nginx et NAXSI

La plupart des modules Nginx ne sont pas disponibles via les référentiels, et NAXSI ne fait pas exception. Pour cette raison, vous devrez télécharger et compiler manuellement Nginx à partir des sources avec NAXSI.

Tout d’abord, téléchargez Nginx à l’aide de la commande suivante.

[.note] #Note: Ce tutoriel utilise la version 1.14 de Nginx. Pour utiliser une version plus récente, vous pouvez visiterthe download page 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.

[.note] #Note: Ce tutoriel utilise la version 0.56 de NAXSI. Vous pouvez trouver des versions plus récentes auNAXSI Github page. 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 référentiel Nginx est une archivetar. Vous devez d'abord l'extraire pour pouvoir le compiler et l'installer, ce que vous pouvez faire en utilisant la commandetar.

tar -xvf nginx-1.14.0.tar.gz

Dans la commande précédente,-x spécifie l'utilitaire d'extraction,-v l'exécute en mode détaillé et-f indique le nom du fichier archive à extraire.

Maintenant que vous avez extrait les fichiers Nginx, vous pouvez maintenant extraire les fichiers NAXSI à l’aide de la commande suivante:

tar -xvf naxsi

Vous avez maintenant les dossiersnaxsi-0.56 etnginx-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épertoirenginx-1.14.0

cd nginx-1.14.0

Pour compiler Nginx à partir des sources, vous aurez besoin du compilateur Cgcc, de la bibliothèque d'expressions régulières compatibles Perllibpcre3-dev etlibssl-dev, qui implémente les protocoles cryptographiques SSL et TLD. Ces dépendances peuvent être ajoutées avec la commandeapt-get.

Tout d’abord, exécutez la commande suivante pour vous assurer que vous avez une liste mise à jour des packages.

sudo apt-get update

Puis installez 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 des sources. Afin de préparer Nginx à être compilé à partir des sources sur votre système, exécutez le script suivant, qui créera lesMakefile qui montrent 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 permettent à Nginx de fonctionner avec les privilèges d'utilisateur et de groupe d'un serveur dédié. utilisateur / groupe 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 seraient automatiquement inclus. Pour plus d'explications sur ces paramètres, voir lesofficial Nginx docs.

Après avoir utilisé la commande./configure, exécutez la commandemake pour exécuter une série de tâches définies dans lesMakefile que vous venez de créer pour construire le programme à partir du code source.

make

Lorsque Nginx est construit et prêt à être exécuté, utilisez la commandemake install en tant que superutilisateur pour copier le programme construit et ses bibliothèques vers l'emplacement correct sur votre serveur.

sudo make install

Une fois que cela réussit, vous aurez une version compilée de Nginx avec le module NAXSI. Pour que NAXSI puisse commencer à 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.

[[step-2 -—- configuring-naxsi]] == Étape 2 - Configuration de NAXSI

La partie la plus importante du fonctionnement d’un pare-feu réside dans ses règles, qui déterminent le mode de blocage des demandes du serveur. L'ensemble de règles de base fourni par défaut avec NAXSI est appelécore rules. Ces règles sont destinées à rechercher des modèles dans des parties d'une requête et à filtrer celles 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 pour utiliser ces règles principales, copiez le fichiernaxsi_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 de base Naxsi, qui activent et implémentent les règles de base par emplacement et affectent les actions à prendre par le serveur lorsqu'une demande d'URL ne satisfait pas les règles de base. Créez un fichier appelé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 base du pare-feu.

/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 lesDeniedUrl, qui sont lesURL que NAXSI redirigera lorsqu'une requête est bloquée. Le fichier active également une liste de contrôle de différents types d'attaques que NAXSI devrait bloquer, notamment l'injection SQL, le script intersite (XSS) et l'inclusion de fichier à distance (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 fichiererror.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/error.html


  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

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 sectionhttp du fichiernginx.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 sectionserver du même fichier, ajoutez la ligne suivante en surbrillance:

/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 les règles de base pour NAXSI, le pare-feu bloque les demandes malveillantes correspondantes lorsque vous démarrez le serveur Web. Ensuite, vous pouvez écrire un script de démarrage pour vous assurer que Nginx démarre au redémarrage du serveur.

[[step-3 -—- creation-the-startup-script-for-nginx]] == Étape 3 - Création du script de démarrage pour Nginx

Comme vous avez installé Nginx manuellement, l'étape suivante consiste à créer un script de démarrage pour permettre au serveur Web de démarrer automatiquement lors du rechargement 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é (voirUnderstanding Systemd Units and Unit Files pour une étude plus approfondie) pour configurer comment 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 fichiernginx.service,systemd saura comment démarrer Nginx.

Ensuite, Nginx a besoin d’un dossier pour stocker temporairement les données des demandes entrantes avant de les traiter, au cas où votre serveur ne dispose pas de suffisamment de mémoire. Comme vous avez installé Nginx à partir des sources, vous devrez créer un répertoire que Nginx pourra utiliser pour stocker ces données. Créez un répertoire appelébody à l'intérieur de/var/lib/nginx:

sudo mkdir -p /var/lib/nginx/body

Une fois le script de démarrage configuré, vous pourrez maintenant 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 dans votre terminal la sortie suivante 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 de fonctionnement sécurisé par NAXSI. L'étape suivante consiste à exécuter une attaque par injection XSS et SQL simulée pour vous assurer que NAXSI protège efficacement votre serveur.

[[step-4 -—- testing-naxsi]] == Étape 4 - Test de NAXSI

Pour vérifier que Nginx est opérationnel et que le module NAXSI est activé, essayez de frapper le serveur avec des requêtes HTTP malveillantes et d'analyser les réponses.

Tout d'abord, copiez l'adresse IP publique de votre serveur et utilisez la commandecurl pour envoyer une requête malveillante au serveur Nginx.

curl 'http://your_server_ip/?q=">'

Cette URL inclut le script XSS"><script>alert(0)</script> dans le paramètreq et doit être rejetée par le serveur. Selon les règles NAXSI que vous avez définies précédemment, vous serez redirigé vers le fichiererror.html et recevrez la réponse suivante:

Output
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Le pare-feu NAXSI a bloqué la demande.

Maintenant, vérifiez la même chose en utilisant le journal Nginx en finissant le journal du serveur Nginx en utilisant 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="> HTTP/1.1", host: "your_server_ip"

Appuyez surCTRL-C pour quittertail et arrêter la sortie du fichier journal des erreurs.

Ensuite, essayez une autre requête d'URL, cette fois avec une requête SQL Injection illicite.

curl 'http://your_server_ip/?q=1" or "1"="1"'

La partieor "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
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Maintenant, utiliseztail 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 surCTRL-C pour quitter le journal.

NAXSI a à présent 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 comprenez maintenant comment utiliser NAXSI pour protéger votre serveur Web contre les attaques malveillantes. Pour en savoir plus sur la configuration de Nginx, consultezHow To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04. Si vous souhaitez continuer à étudier la sécurité sur les serveurs Web, consultezHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 etHow To Create a Self-Signed SSL Certificate for Nginx in Ubuntu 16.04.