ModSecurity est un pare-feu d'application Web (WAF) gratuit, open-source et le plus populaire qui protège votre application Web contre un large éventail d'attaques de couche 7. Il a été conçu pour la surveillance, la journalisation et le filtrage des requêtes du serveur Web Apache. Il est livré avec un ensemble de règles de base qui détecte et arrête plusieurs attaques, notamment l'injection SQL, les scripts intersites, les chevaux de Troie, les agents utilisateurs malveillants, le piratage de session, etc.
Dans ce tutoriel, je vais vous montrer comment installer ModSecurity 3 avec Apache dans un conteneur Docker.
Exigences
- Un serveur exécutant Ubuntu 20.04.
- Un mot de passe root est configuré sur votre serveur.
Mise en route
Tout d'abord, il est recommandé de mettre à jour votre système vers la dernière version. Vous pouvez le mettre à jour avec la commande suivante :
apt-get update -y
Une fois votre système mis à jour, vous devrez installer certaines dépendances sur votre système. Vous pouvez tous les installer avec la commande suivante :
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
Une fois toutes les dépendances installées, vous pouvez passer à l'étape suivante.
Installer Docker
Ensuite, vous devrez installer Docker CE sur votre système. Par défaut, la dernière version de Docker n'est pas incluse dans le référentiel par défaut d'Ubuntu. Vous devrez donc ajouter le référentiel officiel Docker à l'APT.
Tout d'abord, téléchargez et ajoutez la clé Docker GPG avec la commande suivante :
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-clé ajouter -
Ensuite, ajoutez le référentiel Docker CE à la liste des sources APT avec la commande suivante :
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable"> /etc/apt/sources.list.d/docker-ce.listUne fois le référentiel ajouté, mettez à jour le référentiel avec la commande suivante :
apt-get update -yUne fois le référentiel mis à jour, installez la dernière version de Docker CE avec la commande suivante :
apt-get install docker-ce -yAprès avoir installé Docker CE, vérifiez la version installée de Docker CE avec la commande suivante :
docker --versionVous devriez obtenir le résultat suivant :
Docker version 20.10.6, build 370c289Vous pouvez également vérifier l'état du service Docker avec la commande suivante :
menu fixe d'état systemctlVous devriez obtenir le résultat suivant :
? docker.service - Docker Application Container Engine Loaded :chargé (/lib/systemd/system/docker.service ; activé ; préréglage du fournisseur :activé) Actif :actif (en cours d'exécution) depuis le dim 2021-05-16 06:49:29 UTC ; il y a 38sTriggeredBy : ? docker.socket Docs :https://docs.docker.com PID principal :8964 (dockerd) Tâches :8 Mémoire :40,6 Mo CGroup :/system.slice/docker.service ??8964 /usr/bin/dockerd -H fd :// --containerd=/run/containerd/containerd.sockMay 16 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:29.365433228Z" level=warning msg="Votre noyau not support swap memory li>16 mai 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:29.365916961Z" level=warning msg="Votre noyau ne prend pas en charge le cgroup blkio w>16 mai 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:29.366112111Z" level=warning msg="Votre noyau ne prend pas en charge le cgroup blkio w>16 mai 06:49:29 ubuntu2004 dockerd[ 8964] :time="2021-05-16T06:49:29.366653374Z" level=info msg="Chargement des conteneurs :début."16 mai 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06 :49:29.498790388Z" level=info msg="Le pont par défaut (docker0) est attribué avec un I>16 mai 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:2 9.576691602Z" level=info msg="Chargement des conteneurs :terminé."16 mai 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:29.610542206Z" level=info msg="Daemon Docker " commit=8728dd2 graphdriver(s)=o>May 16 06:49:29 ubuntu2004 dockerd[8964] :time="2021-05-16T06:49:29.611668583Z" level=info msg="Le démon a terminé l'initialisation"May 16 06:49:29 ubuntu2004 systemd[1] :démarrage du moteur de conteneur d'applications Docker. 16 mai 06:49:29 ubuntu2004 dockerd[8964] : time="2021-05-16T06:49:29.690496888Z" level=info msg="API listen on /run/docker.sock" lignes 1-21/21 (END)Une fois que vous avez terminé, vous pouvez passer à l'étape suivante.
Créer un Dockerfile pour ModSecurity
Ensuite, vous devrez créer un Dockerfile pour installer ModSecurity dans le conteneur Ubuntu.
Tout d'abord, changez le répertoire en /opt et créez un modsec_rules.conf fichier avec la commande suivante :
cd /opt
nano modsec_rules.confAjoutez les lignes suivantes :
Include "/etc/apache2/modsecurity.d/modsecurity.conf"Include "/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf"Include "/etc/apache2/modsecurity.d/ owasp-crs/rules/*.conf"Enregistrez et fermez le fichier puis créez un autre fichier avec la commande suivante :
nano 000-default.confAjoutez les lignes suivantes :
modsecurity sur modsecurity_rules_file /etc/apache2/modsecurity.d/modsec_rules.conf ServerAdmin [email protected] DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR} /access.log combiné Enregistrez et fermez le fichier lorsque vous avez terminé. Dockerfile copiera les fichiers ci-dessus dans le conteneur Docker pendant le processus de construction.
Enfin, créez un Dockerfile avec la commande suivante :
nano DockerfileAjoutez les lignes suivantes :
# Installer Modsecurity dans un conteneur Docker;FROM ubuntu:latestARG DEBIAN_FRONTEND=noninteractive# mettre à jour/mettre à niveau votre systèmeRUN apt-get update -y# Installer les dépendances requisesRUN apt-get install -y g++ flex bison curl apache2-dev \ doxygen libyajl -dev ssdeep liblua5.2-dev \ libgeoip-dev libtool dh-autoreconf \ libcurl4-gnutls-dev libxml2 libpcre++-dev \ libxml2-dev git wget tar apache2# Télécharger LibModsecurity RUN wget https://github.com/SpiderLabs/ModSecurity /releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz# Extraire le fichier téléchargéRUN tar xzf modsecurity-v3.0.4.tar.gz &&rm -rf modsecurity-v3.0.4.tar.gz# Compiler et Installez LibModsecurityRUN cd modsecurity-v3.0.4 &&\ ./build.sh &&./configure &&\ make &&make install# Installez ModSecurity-Apache ConnectorRUN cd ~ &&git clone https://github.com/SpiderLabs/ModSecurity-apacheRUN cd ~/ModSecurity-apache &&\ ./autogen.sh &&\ ./configure --with-libmodsecurity=/usr/local/modsecurity/ &&\ make &&\ make install# Charger l'Apac e ModSecurity Connector ModuleRUN echo "LoadModule security3_module /usr/lib/apache2/modules/mod_security3.so">> /etc/apache2/apache2.conf# Configurez ModSecurityRUN mkdir /etc/apache2/modsecurity.d &&\ cp modsecurity-v3. 0.4/modsecurity.conf-recommended /etc/apache2/modsecurity.d/modsecurity.conf &&\ cp modsecurity-v3.0.4/unicode.mapping /etc/apache2/modsecurity.d/ &&\ sed -i 's/SecRuleEngine DetectionOnly /SecRuleEngine On/' /etc/apache2/modsecurity.d/modsecurity.confADD modsec_rules.conf /etc/apache2/modsecurity.d/# Installez OWASP ModSecurity Core Rule Set (CRS) sur UbuntuRUN git clone https://github.com /SpiderLabs/owasp-modsecurity-crs.git /etc/apache2/modsecurity.d/owasp-crs &&\ cp /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf.example /etc/apache2/ modsecurity.d/owasp-crs/crs-setup.conf# Activer ModSecurityRUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.oldADD 000-default .conf /etc/apache2/sites-available/EXPOSE 80CMD apach ectl -D PREMIER PLANEnregistrez et fermez le fichier lorsque vous avez terminé.
Le fichier ci-dessus téléchargera l'image Ubuntu, installera toutes les dépendances, téléchargera ModSecurity, le compilera et configurera Apache pour qu'il fonctionne avec ModSecurity.
À ce stade, Dockerfile est prêt. Vous pouvez maintenant passer à l'étape suivante.
Construire l'image Apache ModSecurity et démarrer le conteneur
Maintenant, changez le répertoire en /opt et créez l'image Docker pour Apache ModSecurity avec la commande suivante :
cd /opt
construction docker.Une fois le processus de compilation terminé, vous devriez obtenir le résultat suivant :
Étape 13/17 :RUN git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /etc/apache2/modsecurity.d/owasp-crs &&cp /etc/apache2/modsecurity.d /owasp-crs/crs-setup.conf.example /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf ---> Exécution dans 00dfa2a5cd23Clonage dans '/etc/apache2/modsecurity.d/owasp- crs'...Suppression du conteneur intermédiaire 00dfa2a5cd23 ---> b38c1d874d2fÉtape 14/17 :RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old ---> En cours d'exécution dans 12c9e6d2c559Suppression du conteneur intermédiaire 12c9e6d2c559 ---> 899e26019297Étape 15/17 :ADD 000-default.conf /etc/apache2/sites-available/ ---> eb11751afd6cÉtape 16/17 :EXPOSE 80 ---> En cours d'exécution in 2f4ba47e2b66Suppression du conteneur intermédiaire 2f4ba47e2b66 ---> dd59b0ac7c7cÉtape 17/17 :CMD apachectl -D FOREGROUND ---> Exécution dans 98b8cc77df0fSuppression du conteneur intermédiaire 98b8cc77df0f ---> f603dbc38018F6018 construit avec succèsVous pouvez maintenant lister toutes les images Docker à l'aide de la commande suivante :
images fixesVous devriez obtenir le résultat suivant :
REPOSITORY TAG IMAGE ID CREATED SIZEf603dbc38018 il y a 32 secondes 2.48GBubuntu dernier 7e0aa2d69a15 il y a 3 semaines 72.7MB Maintenant, choisissez le premier identifiant d'image dans la sortie ci-dessus et démarrez le conteneur Apache ModSecurity avec la commande suivante :
docker run --name modsec-apache -ditp 80:80 f603dbc38018Vous devriez obtenir le résultat suivant :
40eb0e77e61635c3cee2bfaffbd9489bc7d20aa3e1befb52749de079aaadb528Vous pouvez maintenant vérifier le conteneur en cours d'exécution avec la commande suivante :
docker psVous devriez obtenir le résultat suivant :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES40eb0e77e616 f603dbc38018 "/bin/sh -c 'apachec…" Il y a 17 secondes Up 15 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp modsec -apacheComme vous pouvez le voir, le conteneur ModSecurity est démarré et écoute sur le port 80.
Vérifier ModSecurity
À ce stade, le conteneur ModSecurity est en cours d'exécution. Il est maintenant temps de tester si les règles ModSecurity bloquent ou non les requêtes malveillantes.
Pour cela, ouvrez votre terminal et lancez la commande suivante :
curl localhost?doc=/bin/lsVous devriez voir le résultat suivant :
403 Interdit Interdit
Vous n'êtes pas autorisé à accéder à cette ressource.
Apache/2.4.41 (Ubuntu) Server at localhost Port 80Vous devriez voir le "403 Interdit " erreur. Parce que ModSecurity a bloqué la requête ci-dessus.
Vous pouvez également consulter le journal Apache pour plus d'informations.
Pour ce faire, connectez-vous d'abord au conteneur avec la commande suivante :
docker exec -it modsec-apache /bin/bashUne fois connecté, vous devriez obtenir le shell suivant :
[email protected] :/#Maintenant, vérifiez le journal Apache avec la commande suivante :
tail -f /var/log/apache2/error.logVous devriez voir que ModSecurity a bloqué la requête malveillante :
[Sun May 16 07:24:54.456327 2021] [mpm_event:notice] [pid 15:tid 140204464299072] AH00489 :Apache/2.4.41 (Ubuntu) configuré -- reprise des opérations normales[Sun May 16 07:24 :54.456352 2021] [core:notice] [pid 15:tid 140204464299072] AH00094 :Ligne de commande :'/usr/sbin/apache2 -D FOREGROUND'[Sun May 16 07:25:36.680515 2021] [:error] [pid 16 :tid 140204216108800] [client 172.17.0.1:45298] ModSecurity :Avertissement. Correspondance "Operator `PmFromFile' avec le paramètre `unix-shell.data' contre la variable `ARGS:doc' (Valeur :`/bin/ls' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/ REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Exécution de la commande à distance :code shell Unix trouvé"] [data "Données correspondantes :bin /ls trouvé dans ARGS:doc :/bin/ls"] [gravité "2"] [ver "OWASP_CRS/3.2.0"] [maturité "0"] [précision "0"] [balise "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"] [balise "WASCTC/WASC-31"] [balise "OWASP_TOP_10/A1"] [balise "PCI/6.5.2"] [nom d'hôte "172.17.0.2"] [uri "/"] [unique_id "162114993662.860969"] [réf "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]Conclusion
Toutes nos félicitations! vous avez installé avec succès ModSecurity dans le conteneur Docker. J'espère que vous avez maintenant suffisamment de connaissances pour implémenter cette solution dans l'environnement Docker. N'hésitez pas à me demander si vous avez des questions.