Installer le pare-feu d’application Web LibModsecurity avec Nginx sur CentOS 8

LibModSecurity est un pare-feu d’application Web gratuit et open-source qui peut être utilisé pour protéger un serveur Nginx contre différents types de cyberattaques. Il est livré avec un jeu de règles de base comprenant, entre autres, l’injection SQL, le cross-site scripting et les chevaux de Troie. Il fonctionne en surveillant le trafic HTTP en temps réel et en luttant contre les vulnérabilités à l’aide du jeu de règles de base OWASP ModSecurity. Il peut être utilisé avec Apache, Nginx et IIS et est également compatible avec Debian, Ubuntu et CentOS.

Dans ce tutoriel, nous allons te montrer comment télécharger et compiler LibModSecurity avec la prise en charge de Nginx sur CentOS 8.

Exigences

  • Un serveur exécutant CentOS 8.
  • Un mot de passe root est configuré sur le serveur.

Pour commencer

Avant de commencer, mets ton serveur à jour avec la dernière version en utilisant la commande suivante :

dnf update

Une fois que ton serveur est à jour, redémarre-le pour appliquer les modifications.

Installe les référentiels et dépendances nécessaires

Tout d’abord, installe le référentiel EPEL et REMI sur ton système. Tu peux les installer avec la commande suivante :

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Ensuite, installe toutes les dépendances requises avec la commande suivante :

dnf install gcc-c++ flex bison yajl curl-devel zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config wget openssl openssl-devel nano

Une fois que tous les paquets sont installés, tu peux installer les autres dépendances à l’aide du référentiel PowerTool :

dnf --enablerepo=PowerTools install doxygen yajl-devel

Ensuite, installe GeoIP en utilisant le référentiel REMI en exécutant la commande suivante :

dnf --enablerepo=remi install GeoIP-devel

Une fois que tous les paquets sont installés, tu peux passer à l’étape suivante.

Télécharge et compile LibModsecurity

Tout d’abord, tu dois télécharger la source de LibModsecurity et la compiler sur ton système. Pour ce faire, change le répertoire en /opt et télécharge la dernière version de LibModsecurity depuis le dépôt Git :

cd /opt/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity

Ensuite, change le répertoire en ModSecurity et télécharge le code libInjection avec la commande suivante :

cd ModSecurity
git submodule init
git submodule update

Ensuite, configure la LibModsecurity à l’aide de la commande suivante :

./build.sh
./configure

Enfin, compile et installe LibModSecurity avec la commande suivante :

make
make install

À ce stade, LibModsecurity a été installé sur ton système. Tu peux maintenant procéder à l’installation de Nginx avec la prise en charge de LibModsecurity.

Télécharge et compile Nginx avec le support LibModsecurity

Tout d’abord, tu dois créer un utilisateur et un groupe système pour Nginx. Tu peux les créer avec la commande suivante :

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

Ensuite, tu devras télécharger Nginx et le compiler avec le support LibModsecurity.

Pour ce faire, télécharge d’abord le connecteur ModSecurity-nginx depuis le dépôt Git avec la commande suivante :

cd /opt
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Ensuite, télécharge la dernière version stable de Nginx avec la commande suivante :

wget http://nginx.org/download/nginx-1.17.6.tar.gz

Une fois téléchargé, extrais le fichier téléchargé à l’aide de la commande suivante :

tar -xvzf nginx-1.17.6.tar.gz

Ensuite, change le répertoire de Nginx et configure-le avec la commande suivante :

cd nginx-1.17.6
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/opt/ModSecurity-nginx

Ensuite, installe Nginx avec la commande suivante :

make
make install

À ce stade, Nginx a été installé avec la prise en charge de LibModsecurity. Tu peux maintenant passer à la configuration de Nginx.

Configurer Nginx avec ModSecurity

Tout d’abord, tu dois copier l’exemple de fichier de configuration ModSecurity du répertoire source de Nginx au répertoire de configuration de Nginx.

Tu peux les copier avec la commande suivante :

cp /opt/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /opt/ModSecurity/unicode.mapping /usr/local/nginx/conf/

Ensuite, crée un lien symbolique du binaire Nginx vers le chemin /usr/sbin/ avec la commande suivante :

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

Ensuite, crée le répertoire des journaux de Nginx avec la commande suivante: :

mkdir /var/log/nginx

Ensuite, ouvre le fichier de configuration de Nginx avec la commande suivante :

nano /usr/local/nginx/conf/nginx.conf

Apporte les modifications 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  your-server-ip;
        modsecurity  on;
        modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;
        access_log  /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, vérifie que Nginx n’a pas d’erreur de syntaxe avec la commande suivante :

nginx -t

Tu devrais voir la sortie suivante :

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

À ce stade, Nginx a été configuré. Tu peux passer à la création d’un fichier de service systemd pour Nginx.

Créer un fichier de service Systemd pour Nginx

Ensuite, tu devras créer un fichier systemd pour gérer le service Nginx. Tu peux le créer avec la commande suivante :

nano /etc/systemd/system/nginx.service

Ajoute les lignes suivantes :

[Unit]
Description=The nginx 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

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, recharge le démon systemd avec la commande suivante :

systemctl daemon-reload

Ensuite, démarre le service Nginx et active-le pour qu’il démarre après le redémarrage du système avec la commande suivante :

systemctl start nginx
systemctl enable --now nginx

Tu devrais voir la sortie suivante :

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.

Ensuite, vérifie le service Nginx avec la commande suivante :

systemctl status nginx

Tu devrais voir 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 2019-12-30 10:20:01 EST; 41s ago
  Process: 17730 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 17728 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 17727 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 17732 (nginx)
    Tasks: 2 (limit: 6102)
   Memory: 5.0M
   CGroup: /system.slice/nginx.service
           ??17732 nginx: master process /usr/sbin/nginx
           ??17733 nginx: worker process

Dec 30 10:20:00 nginx systemd[1]: Starting The nginx HTTP and reverse proxy server...
Dec 30 10:20:00 nginx nginx[17728]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
Dec 30 10:20:00 nginx nginx[17728]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Dec 30 10:20:01 nginx systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Dec 30 10:20:01 nginx systemd[1]: Started The nginx HTTP and reverse proxy server.

À ce stade, Nginx a été lancé et fonctionne. Tu peux maintenant passer à la configuration de ModSecurity.

Configurer ModeSecurity

Par défaut, ModSecurity est configuré en mode détection uniquement. Tu devras donc activer le moteur de règles de ModSecurity. Tu peux le faire en modifiant le fichier modsecurity.conf :

nano /usr/local/nginx/conf/modsecurity.conf

Trouve la ligne suivante :

SecRuleEngine DetectionOnly

Et, remplace-la par la ligne suivante :

SecRuleEngine On

Trouve aussi la ligne suivante :

/var/log/modsec_audit.log

Et, remplace-la par la ligne suivante :

/var/log/nginx/modsec_audit.log

Sauvegarde et ferme le fichier lorsque tu as terminé.

Ensuite, télécharge la dernière version de ModSecurity Core Rule Set depuis le dépôt Git à l’aide de la commande suivante :

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

Une fois téléchargé, renomme le fichier de configuration de l’exemple CRS avec la commande suivante :

mv /usr/local/nginx/conf/owasp-crs/crs-setup.conf.example /usr/local/nginx/conf/owasp-crs/crs-setup.conf

Ensuite, configure le ModeSecurity pour utiliser ces règles en modifiant le fichier /usr/local/nginx/conf/modsecurity.conf :

nano /usr/local/nginx/conf/modsecurity.conf

Ajoute les lignes suivantes à la fin du fichier :

Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, redémarre le service Nginx pour appliquer les modifications :

systemctl restart nginx

Teste ModSecurity

ModSecurity est maintenant installé et configuré. Il est temps de tester s’il fonctionne ou non.

Pour tester ModSecurity contre l’injection de commandes, ouvre ton navigateur Web et tape l’URL http://localhost/index.html?exec=/bin/bash. Tu devrais voir l’erreur 403 Forbidden dans la page suivante :

Teste ModSecurity

Pour tester ModSecurity contre l’attaque CSS, ouvre ton terminal et exécute la commande suivante :

curl http://localhost/?q="><script>alert(1)</script>"

Tu devrais obtenir la sortie suivante :

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>

Conclusion

Félicitations ! Tu as réussi à télécharger et à compiler LibModSecurity avec Nginx. Ton serveur est maintenant sécurisé contre les différentes attaques. Pour plus d’informations, tu peux consulter la documentation de ModSecurity à l’adresse ModSecurity Doc.

Vous aimerez aussi...