ModSecurity est un pare-feu d'application Web populaire, gratuit et open source utilisé pour protéger les applications Web contre plusieurs types d'attaques, notamment l'injection SQL, les scripts intersites et l'inclusion de fichiers locaux. Il est fréquemment utilisé pour protéger les sites Web, cPanel et autres panneaux de contrôle d'hébergement. Bien que ModSecurity ait été principalement conçu pour le serveur Web Apache, il peut également fonctionner avec le serveur Web Nginx.
Dans cet article, nous allons vous montrer comment installer ModSecurity avec Nginx sur Rocky Linux 8.
Prérequis
- Un serveur exécutant Rocky Linux 8 sur la plate-forme cloud Atlantic.Net
- Un mot de passe root configuré sur votre serveur
Étape 1 - Créer un serveur cloud Atlantic.Net
Tout d'abord, connectez-vous à votre serveur Atlantic.Net Cloud. Créez un nouveau serveur en choisissant Rocky Linux 8 comme système d'exploitation avec au moins 2 Go de RAM. Connectez-vous à votre serveur cloud via SSH et connectez-vous à l'aide des informations d'identification mises en évidence en haut de la page.
Une fois connecté à votre serveur, exécutez la commande suivante pour mettre à jour votre système de base avec les derniers packages disponibles.
dnf update -y
Étape 2 - Installer les dépendances requises
Tout d'abord, vous devrez installer toutes les dépendances requises sur votre serveur. Vous pouvez tous les installer avec la commande suivante :
dnf install gcc-c++ flex bison yajl curl-devel curl zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config git wget openssl openssl-devel vim
dnf --enablerepo=powertools install doxygen yajl-devel -y
Ensuite, installez les dépôts EPEL et Remi à l'aide de la commande suivante :
dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
Ensuite, installez GeoIP en utilisant la commande suivante :
dnf --enablerepo=remi install GeoIP-devel -y
Étape 3 - Installer ModSecurity
Tout d'abord, téléchargez la dernière version de ModSecurity à l'aide de la commande suivante :
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
Ensuite, changez le répertoire en ModSecurity et installez les autres modules avec la commande suivante :
cd ModSecurity git submodule init git submodule update
Ensuite, compilez et installez ModSecurity avec la commande suivante :
./build.sh ./configure make make install
Étape 4 - Installer Nginx avec le support LibModsecurity
Afin d'activer la prise en charge de LibModsecurity dans Nginx, vous devrez compiler Nginx avec la prise en charge de LibModsecurity.
Tout d'abord, téléchargez le connecteur ModSecurity-nginx à l'aide de la commande suivante :
cd ../ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Ensuite, téléchargez la dernière version stable de Nginx avec la commande suivante :
wget http://nginx.org/download/nginx-1.19.10.tar.gz
Ensuite, extrayez le fichier téléchargé à l'aide de la commande suivante :
tar xzf nginx-1.19.10.tar.gz
Ensuite, créez un utilisateur pour Nginx avec la commande suivante :
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
Ensuite, modifiez le répertoire vers la source Nginx et compilez-le à l'aide de la commande suivante :
cd nginx-1.19.10 ./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/root/ModSecurity-nginx
Ensuite, installez-le à l'aide de la commande suivante :
make make install
Ensuite, copiez l'exemple de fichier de configuration ModSecurity et le fichier de mappage Unicode avec la commande suivante :
cp /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf cp /root/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Ensuite, sauvegardez le fichier de configuration Nginx :
cp /usr/local/nginx/conf/nginx.conf{,.bak}
Ensuite, modifiez le fichier de configuration Nginx avec la commande suivante :
nano /usr/local/nginx/conf/nginx.conf
Supprimez toutes les lignes et ajoutez les lignes suivantes :
user nginx; worker_processes 1; pid /run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name nginx.example.com; modsecurity on; modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf; access_log /var/log/nginx/access_kifarunix-demo.log; error_log /var/log/nginx/error_kifarunix-demo.log; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Enregistrez et fermez le fichier, puis créez un répertoire de journaux Nginx :
mkdir /var/log/nginx
Étape 5 - Créer un fichier de service Systemd pour Nginx
Ensuite, vous devrez créer un fichier de service systemd pour gérer le service Nginx. Vous pouvez le créer à l'aide de la commande suivante :
nano /etc/systemd/system/nginx.service
Ajoutez les lignes suivantes :
[Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=mixed PrivateTmp=true [Install] WantedBy=multi-user.target
Enregistrez et fermez le fichier, puis créez un lien symbolique du binaire Nginx à l'aide de la commande suivante :
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
Ensuite, rechargez le démon systemd pour appliquer les modifications :
systemctl daemon-reload
Ensuite, démarrez le service Nginx et activez-le au redémarrage du système :
systemctl enable --now nginx
Vous pouvez vérifier l'état de Nginx avec la commande suivante :
systemctl status nginx
Vous obtiendrez le résultat suivant :
● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2021-11-08 09:59:48 UTC; 5s ago Process: 73046 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 73044 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 73043 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 73048 (nginx) Tasks: 2 (limit: 11411) Memory: 3.2M CGroup: /system.slice/nginx.service ├─73048 nginx: master process /usr/sbin/nginx └─73049 nginx: worker process Nov 08 09:59:48 rockylinux systemd[1]: Starting The nginx HTTP and reverse proxy server... Nov 08 09:59:48 rockylinux nginx[73044]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok Nov 08 09:59:48 rockylinux nginx[73044]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Nov 08 09:59:48 rockylinux systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Nov 08 09:59:48 rockylinux systemd[1]: Started The nginx HTTP and reverse proxy server.
Étape 6 - Activer la règle ModSecurity
Vous pouvez l'activer avec la commande suivante :
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf
Activez également le journal d'audit avec la commande suivante :
sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf
Étape 7 - Installer l'ensemble de règles de base OWASP ModSecurity
OWASP fournit des règles génériques de détection d'attaques pour ModSecurity. Vous pouvez le télécharger avec la commande suivante :
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Ensuite, renommez le fichier de configuration de la règle OWASP à l'aide de la commande suivante :
cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}
Définissez ensuite la règle OWASP dans le fichier de configuration de ModSecurity :
echo -e "Include owasp-crs/crs-setup.conf\nInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf
Ensuite, redémarrez le service Nginx pour appliquer les modifications :
systemctl restart nginx
Étape 8 - Vérifier ModSecurity
À ce stade, Nginx est installé et configuré avec la prise en charge de ModSecurity. Il est maintenant temps de le tester.
Exécutez l'injection de commande suivante à l'aide de la commande curl :
curl localhost/index.html?exec=/bin/bash
Si tout va bien, vous devriez obtenir l'erreur "403 Forbidden" comme indiqué ci-dessous :
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.19.10</center> </body> </html>
Vous pouvez également consulter le journal ModSecurity pour plus d'informations :
tail -100 /var/log/nginx/modsec_audit.log
Vous devriez voir le résultat suivant :
---imefFQJy---D-- ---imefFQJy---E-- <html>\x0d\x0a<head><title>403 Forbidden</title></head>\x0d\x0a<body>\x0d\x0a<center><h1>403 Forbidden</h1></center>\x0d\x0a<hr><center>nginx/1.19.10</center>\x0d\x0a</body>\x0d\x0a</html>\x0d\x0a ---imefFQJy---F-- HTTP/1.1 403 Server: nginx/1.19.10 Date: Mon, 08 Nov 2021 10:00:55 GMT Content-Length: 154 Content-Type: text/html Connection: keep-alive ---imefFQJy---H-- ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:exec' (Value: `/bin/bash' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/bash found within ARGS:exec: /bin/bash"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "1636365655"] [ref "o1,8v21,9t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "1636365655"] [ref ""]
Conclusion
Dans le guide ci-dessus, nous avons expliqué comment installer ModSecurity avec Nginx sur Rocky Linux 8. Votre serveur Web Nginx est maintenant sécurisé avec ModSecurity WAF. ModSecurity peut protéger votre serveur d'un large éventail d'attaques. Lancez-vous dès aujourd'hui sur l'hébergement VPS d'Atlantic.Net !