Comment sécuriser Nginx avec NAXSI sur Ubuntu 16.04

De Get Docs
Aller à :navigation, rechercher

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 :

É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].