Comment installer ModSecurity pour Nginx sur Debian/Ubuntu
Chaque développeur souhaite déployer des applications Web sécurisées et à l’abri des menaces. Dans la plupart des cas, c’est plus facile à dire qu’à faire. La fréquence des sites Web piratés ne cesse d’augmenter à mesure que les pirates informatiques continuent d’exploiter tous les vecteurs d’attaque à leur disposition.
La sécurité des applications Web peut constituer un défi de taille, en particulier avec la prévalence d'outils malveillants tels que les rootkits, les scanners, les robots et autres logiciels malveillants. Même si une violation peut sembler une question de savoir quand, voire si, il est prudent de mettre en œuvre des mesures de sécurité décentes pour protéger vos applications Web.
L'un des outils pouvant fournir un niveau de sécurité décent contre les attaques s'appelle ModSecurity. Il s'agit d'un Web Application Firewall (WAF) gratuit et open source qui protège vos applications Web contre une vaste gamme d'attaques de couche 7 telles que les scripts intersites (XSS), injection SQL, détournement de session et bien d'autres encore.
Dans ce guide, nous allons vous montrer comment installer et configurer ModSecurity pour fonctionner avec Nginx sur les distributions Linux basées sur Debian telles que Ubuntu.
Étape 1 : Installer les dépendances
Pour commencer l'installation, un certain nombre de dépendances logicielles sont requises pour que l'installation réussisse. Mais d’abord, mettez à jour les listes de packages et actualisez les référentiels comme suit.
sudo apt update
Ensuite, installez les dépendances comme suit.
sudo apt install make gcc build-essential autoconf automake libtool libfuzzy-dev ssdeep gettext pkg-config libcurl4-openssl-dev liblua5.3-dev libpcre3 libpcre3-dev libxml2 libxml2-dev libyajl-dev doxygen libcurl4 libgeoip-dev libssl-dev zlib1g-dev libxslt-dev liblmdb-dev libpcre++-dev libgd-dev
Étape 2 : Installer la dernière version de Nginx
La prochaine étape consistera à installer le navigateur Web Nginx. Pour installer la dernière version, nous allons l'installer à partir du PPA w ondrej/nginx-mainline qui est actuellement maintenu par un développeur Debian depuis 2000.
Pour ajouter le PPA à votre système Ubuntu local, exécutez la commande :
sudo add-apt-repository ppa:ondrej/nginx-mainline -y
Ensuite, mettez à jour les listes de packages et installez la dernière version de Nginx comme suit
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full
En règle générale, seul le référentiel par défaut est activé. Il est prudent d'activer le référentiel de code source afin de pouvoir télécharger ultérieurement le code source Nginx à l'étape suivante.
Pour y parvenir, modifiez le fichier du référentiel Nginx.
sudo vim /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list
Localisez et décommentez cette ligne pour activer le référentiel de code source :
deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
Le fichier devrait maintenant apparaître comme indiqué.
Enregistrez les modifications et quittez.
Mettez ensuite à jour l’index du package.
sudo apt update
Étape 3 : Téléchargez le package source Nginx
Pour compiler le module dynamique ModSecurity, nous devons télécharger le package de code source Nginx. Pour ce faire, nous allons d'abord créer un répertoire Nginx dans le chemin /usr/local/src/ pour accueillir le fichier du package de code source Nginx.
sudo mkdir -p /usr/local/src/nginx
Ensuite, attribuez les autorisations de répertoire comme indiqué. Assurez-vous de remplacer le nom d'utilisateur par votre nom d'utilisateur sudo réel.
sudo chown username:username -R /usr/local/src/
Ensuite, accédez au répertoire source Nginx :
cd /usr/local/src/nginx
Continuez et téléchargez les packages de fichiers sources Nginx :
sudo apt source nginx
Vous rencontrerez très probablement l’erreur suivante :
W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Ce n’est rien pour vous énerver. Alors, ignorez simplement l’erreur.
Vous pouvez jeter un œil au fichier source à l’aide de la commande ls.
ls -l
Assurez-vous que la version du code source coïncide avec la version de Nginx installée.
nginx -v
Étape 4 : Installez la bibliothèque Libmodsecurity3
Libmodesecurity est une bibliothèque Modsecurity qui gère le filtrage HTTP pour vos applications. Il existe deux manières de l'installer. Vous pouvez utiliser le gestionnaire de paquets apt comme indiqué
sudo apt install libmodsecurity3
L'autre approche consiste à l'installer à partir d'une source qui est préférable car elle vous fournit la dernière version. Pour démarrer l'installation de Libmodsecurity à partir de la source, clonez le dépôt git comme indiqué :
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/
Accédez au répertoire cloné :
cd /usr/local/src/ModSecurity/
Assurez-vous d'installer les sous-modules
sudo git submodule init
sudo git submodule update
Ensuite, créez l'environnement à l'aide des commandes ci-dessous.
sudo ./build.sh
sudo ./configure
Encore une fois, ignorez l'erreur affichée ci-dessous.
fatal: No names found, cannot describe anything.
Compilez ensuite le code source et installez d'autres utilitaires à l'aide de la commande make suivante. Cela prend environ 25 minutes et demande un peu de patience.
sudo make -j4
Une fois terminé, installez les bibliothèques.
sudo make install
Étape 5 : Téléchargez et compilez le connecteur Nginx ModSecurity v3
L'étape suivante consiste à télécharger et compiler le connecteur ModSecurity Nginx. Le connecteur, comme son nom l'indique, relie la bibliothèque Libmodsecurity au serveur Web Nginx. Pour télécharger le connecteur Modsecurity, clonez-le depuis le référentiel GitHub comme suit.
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
Accédez au répertoire cloné.
cd /usr/local/src/nginx/nginx-1.21.3/
Procéder et installer les dépendances de build
sudo apt build-dep nginx
sudo apt install uuid-dev
Ensuite, compilez le module ModSecurity Nginx Connector avec l'indicateur --with-compat
. L'option --with-compat
rend le module ModSecurity Nginx Connector compatible binaire avec la bibliothèque Nginx actuelle.
sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
Une fois cela fait, créez le module ModSecurity Nginx Connector à l’aide de la commande make.
sudo make modules
Le module est enregistré sous objs/ngx_http_modsecurity_module.so. Vous devez copier ce module dans le répertoire /usr/share/nginx/modules/ comme suit.
sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
Étape 6 : Charger le module de connecteur ModSecurity Nginx
Pour charger le module de connecteur Nginx, accédez d'abord au fichier de configuration principal de Nginx.
sudo vim /etc/nginx/nginx.conf
Ajoutez la ligne suivante juste en dessous des premières lignes
load_module modules/ngx_http_modsecurity_module.so;
De plus, ajoutez les lignes suivantes dans la section http {...}
. Cela active ModSecurity pour tous les hôtes virtuels Nginx.
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
Enregistrez les modifications et quittez le fichier.
Ensuite, créez le répertoire /etc/nginx/modsec/ qui stockera la configuration ModSecurity.
sudo mkdir /etc/nginx/modsec/
Ensuite, copiez le fichier de configuration ModSecurity comme suit.
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
Ouvrez ensuite le fichier de configuration.
sudo vim /etc/nginx/modsec/modsecurity.conf
Localisez la ligne commençant par la directive SecRuleEngine.
SecRuleEngine DetectionOnly
Cette ligne demande à ModSecurity de consigner uniquement les transactions HTTP, mais de ne prendre aucune mesure face à une attaque d'application Web. Vous devez modifier cela pour que Modsecurity non seulement détecte mais bloque également les attaques Web.
Remplacez la ligne par la ligne ci-dessous
SecRuleEngine On
Enregistrez les modifications et quittez le fichier.
Ensuite, créez le fichier /etc/nginx/modsec/main.conf.
sudo vim /etc/nginx/modsec/main.conf
Ajoutez cette ligne pour référencer le fichier de configuration /etc/nginx/modsec/modsecurity.conf.
Include /etc/nginx/modsec/modsecurity.conf
Enregistrez les modifications et quittez le fichier.
De plus, copiez le fichier de mappage Unicode.
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
Testez ensuite la configuration de Nginx.
sudo nginx -t
Le test devrait réussir. Sinon, revenez en arrière et vérifiez si toutes les modifications apportées sont correctes.
Puis enfin, redémarrez Nginx pour appliquer toutes les modifications apportées.
sudo systemctl restart nginx
Et vérifiez que Nginx fonctionne comme prévu.
sudo systemctl status nginx
Étape 7 : Téléchargez l’ensemble de règles OWASP
Pour que ModSecurity protège vos applications Web, vous devez spécifier des règles qui vont détecter les activités suspectes et les bloquer. Pour commencer, il est préférable d’installer des ensembles de règles existants qui vous aideront à apprendre les ficelles du métier.
L'OWASP Core Rule Set (CRS) est un ensemble de règles gratuit, open source et géré par la communauté, qui fournit des règles permettant de repousser les vecteurs d'attaque courants tels que l'injection SQL, Scripts intersites (XSS).
Téléchargez l'ensemble de règles de base OWASP depuis Github comme indiqué à l'aide de la commande wget.
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
Extrayez le fichier compressé.
tar xvf v3.3.0.tar.gz
Assurez-vous de déplacer le répertoire non compressé vers le chemin /etc/nginx/modsec/.
sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/
Renommez ensuite le fichier crs-setup.conf.example en crs-setup.conf.
sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Encore une fois, revenez au fichier de configuration ModSecurity.
sudo vim /etc/nginx/modsec/main.conf
Et ajoutez les lignes suivantes.
Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
Le fichier devrait maintenant contenir 3 lignes :
Enregistrez le fichier et, encore une fois, redémarrez Nginx.
sudo systemctl restart nginx
Étape 8 : tester ModSecurity
Enfin, nous allons effectuer un test ModSecurity et confirmer qu'il peut détecter et bloquer le trafic HTTP suspect.
Nous allons modifier le fichier de configuration ModSecurity et créer une règle de blocage qui bloquera l'accès à une certaine URL lors de l'accès par un navigateur Web.
sudo vim /etc/nginx/modsec/modsecurity.conf
Ajoutez cette ligne juste en dessous de la directive SecRuleEngine On
SecRule ARGS:testparam "@contains test" "id:254,deny,status:403,msg:'Test Successful'"
Vous pouvez définir les balises 'id' et 'msg' sur vos valeurs préférées.
Enregistrez les modifications et redémarrez Nginx.
sudo systemctl restart nginx
Lancez maintenant votre navigateur et visitez l'URL ci-dessous avec le suffixe ?testparam=test
http://server-ip/?testparam=test
Vous devriez obtenir une erreur 403 « Interdit ». Cela indique que vous essayez d'accéder à une ressource interdite sur le serveur Web.
De plus, vous pouvez consulter les journaux d'erreurs Nginx pour confirmer que le client a été bloqué.
cat /var/log/nginx/error.log | grep "Test Successful"
C'était un aperçu de la façon dont vous pouvez configurer Modsecurity avec Nginx sur Debian et Ubuntu. Nous espérons que cela a été bénéfique.