Installeer ModSecurity met Apache in een Docker Container
ModSecurity is een gratis, open-source, en meest populaire web application firewall (WAF) die je web applicatie beschermt tegen een breed scala van Layer 7 aanvallen. Het is ontworpen voor Apache web server die verzoeken bewaakt, logt en filtert. Het wordt geleverd met een Core Rule Set die verschillende aanvallen opspoort en stopt, waaronder SQL injectie, cross-site scripting, Trojaanse paarden, slechte user agents, sessie-hijacking, en meer.
In deze zelfstudie laat ik je zien hoe je ModSecurity 3 met Apache binnen een Docker container installeert.
Vereisten
- Een server met Ubuntu 20.04.
- Een root wachtwoord is op je server ingesteld.
Aan de slag
Eerst is het aan te raden je systeem te updaten naar de nieuwste versie. Je kunt het bijwerken met het volgende commando:
apt-get update -y
Als je systeem up-to-date is, moet je enkele afhankelijkheden op je systeem installeren. Je kunt ze allemaal installeren met het volgende commando:
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
Als alle afhankelijkheden geïnstalleerd zijn, kun je doorgaan naar de volgende stap.
Docker installeren
Vervolgens moet je de Docker CE op je systeem installeren. Standaard is de nieuwste versie van Docker niet opgenomen in de Ubuntu standaard repository. Je zult dus de officiële Docker repository aan de APT moeten toevoegen.
Download eerst de Docker GPG sleutel en voeg die toe met het volgende commando:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
Voeg vervolgens de Docker CE repository toe aan de APT bronlijst met het volgende commando:
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker-ce.list
Zodra de repository is toegevoegd, update je de repository met het volgende commando:
apt-get update -y
Zodra de repository is bijgewerkt, installeer je de nieuwste versie van Docker CE met het volgende commando:
apt-get install docker-ce -y
Controleer na de installatie van Docker CE de geïnstalleerde versie van Docker CE met het volgende commando:
docker --version
Je zou de volgende uitvoer moeten krijgen:
Docker version 20.10.6, build 370c289
Je kunt ook de status van de Docker service controleren met het volgende commando:
systemctl status docker
Je zou de volgende uitvoer moeten krijgen:
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-16 06:49:29 UTC; 38s ago TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 8964 (dockerd) Tasks: 8 Memory: 40.6M CGroup: /system.slice/docker.service ??8964 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.365433228Z" level=warning msg="Your kernel does not support swap memory li> May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.365916961Z" level=warning msg="Your kernel does not support cgroup blkio w> May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.366112111Z" level=warning msg="Your kernel does not support cgroup blkio w> May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.366653374Z" level=info msg="Loading containers: start." May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.498790388Z" level=info msg="Default bridge (docker0) is assigned with an I> May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.576691602Z" level=info msg="Loading containers: done." May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.610542206Z" level=info msg="Docker daemon" commit=8728dd2 graphdriver(s)=o> May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.611668583Z" level=info msg="Daemon has completed initialization" May 16 06:49:29 ubuntu2004 systemd[1]: Started Docker Application Container Engine. May 16 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.690496888Z" level=info msg="API listen on /run/docker.sock" lines 1-21/21 (END)
Als je klaar bent, kun je doorgaan naar de volgende stap.
Maak een Dockerfile voor ModSecurity
Vervolgens moet je een Dockerfile maken om de ModSecurity binnen de Ubuntu container te installeren.
Verander eerst de directory in de /opt en maak een modsec_rules.conf bestand met het volgende commando:
cd /opt
nano modsec_rules.conf
Voeg de volgende regels toe:
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"
Bewaar en sluit het bestand en maak dan een ander bestand aan met het volgende commando:
nano 000-default.conf
Voeg de volgende regels toe:
<VirtualHost *:80> modsecurity on modsecurity_rules_file /etc/apache2/modsecurity.d/modsec_rules.conf ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Sla het bestand op en sluit het als je klaar bent. Dockerfile zal de bovenstaande bestanden naar de Docker container kopiëren tijdens het bouwproces.
Maak tenslotte een Dockerfile met het volgende commando:
nano Dockerfile
Voeg de volgende regels toe:
# Install Modsecurity in a Docker container; FROM ubuntu:latest ARG DEBIAN_FRONTEND=noninteractive # update/upgrade your system RUN apt-get update -y # Install Required Dependencies RUN 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 # Download LibModsecurity RUN wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz # Extract the Downloaded File RUN tar xzf modsecurity-v3.0.4.tar.gz && rm -rf modsecurity-v3.0.4.tar.gz # Compile and Install LibModsecurity RUN cd modsecurity-v3.0.4 && \ ./build.sh && ./configure && \ make && make install # Install ModSecurity-Apache Connector RUN cd ~ && git clone https://github.com/SpiderLabs/ModSecurity-apache RUN cd ~/ModSecurity-apache && \ ./autogen.sh && \ ./configure --with-libmodsecurity=/usr/local/modsecurity/ && \ make && \ make install # Load the Apache ModSecurity Connector Module RUN echo "LoadModule security3_module /usr/lib/apache2/modules/mod_security3.so" >> /etc/apache2/apache2.conf # Configure ModSecurity RUN 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.conf ADD modsec_rules.conf /etc/apache2/modsecurity.d/ # Install OWASP ModSecurity Core Rule Set (CRS) on Ubuntu 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 # Activate ModSecurity RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old ADD 000-default.conf /etc/apache2/sites-available/ EXPOSE 80 CMD apachectl -D FOREGROUND
Sla het bestand op en sluit het als je klaar bent.
Het bovenstaande bestand zal het Ubuntu image downloaden, alle afhankelijkheden installeren, de ModSecurity downloaden, compileren, en Apache configureren om met ModSecurity te werken.
Op dit punt is het Dockerfile klaar. Je kunt nu verder gaan met de volgende stap.
Bouw het Apache ModSecurity Image en start de Container
Verander nu de directory in de /opt en bouw het Docker image voor Apache ModSecurity met het volgende commando:
cd /opt
docker build .
Als het bouwproces voltooid is, zou je de volgende uitvoer moeten krijgen:
Step 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 ---> Running in 00dfa2a5cd23 Cloning into '/etc/apache2/modsecurity.d/owasp-crs'... Removing intermediate container 00dfa2a5cd23 ---> b38c1d874d2f Step 14/17 : RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old ---> Running in 12c9e6d2c559 Removing intermediate container 12c9e6d2c559 ---> 899e26019297 Step 15/17 : ADD 000-default.conf /etc/apache2/sites-available/ ---> eb11751afd6c Step 16/17 : EXPOSE 80 ---> Running in 2f4ba47e2b66 Removing intermediate container 2f4ba47e2b66 ---> dd59b0ac7c7c Step 17/17 : CMD apachectl -D FOREGROUND ---> Running in 98b8cc77df0f Removing intermediate container 98b8cc77df0f ---> f603dbc38018 Successfully built f603dbc38018
Je kunt nu alle docker images opnoemen met het volgende commando:
docker images
Je zou de volgende uitvoer moeten krijgen:
REPOSITORY TAG IMAGE ID CREATED SIZEf603dbc38018 32 seconds ago 2.48GB ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
Kies nu het eerste image id uit de bovenstaande uitvoer en start de Apache ModSecurity container met het volgende commando:
docker run --name modsec-apache -ditp 80:80 f603dbc38018
Je zou de volgende uitvoer moeten krijgen:
40eb0e77e61635c3cee2bfaffbd9489bc7d20aa3e1befb52749de079aaadb528
Je kunt nu de draaiende container verifiëren met het volgende commando:
docker ps
Je zou de volgende uitvoer moeten krijgen:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40eb0e77e616 f603dbc38018 "/bin/sh -c 'apachec…" 17 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp modsec-apache
Zoals je ziet is de ModSecurity container gestart en luistert op poort 80.
Verifieer ModSecurity
Op dit punt draait de ModSecurity container. Nu is het tijd om te testen of de ModSecurity regels de kwaadaardige verzoeken blokkeren of niet.
Open daartoe je terminal en voer het volgende commando uit:
curl localhost?doc=/bin/ls
Je zou de volgende uitvoer moeten zien:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access this resource.</p> <hr> <address>Apache/2.4.41 (Ubuntu) Server at localhost Port 80</address> </body></html>
Je zou de foutmelding“403 Forbidden” moeten zien. Omdat ModSecurity het bovenstaande verzoek geblokkeerd heeft.
Je kunt ook het Apache log bekijken voor meer informatie.
Maak daartoe eerst verbinding met de container met het volgende commando:
docker exec -it modsec-apache /bin/bash
Zodra je verbonden bent, zou je de volgende commandoregel moeten krijgen:
root@40eb0e77e616:/#
Bekijk nu het Apache log met het volgende commando:
tail -f /var/log/apache2/error.log
Je zou moeten zien dat ModSecurity het kwaadaardige verzoek geblokkeerd heeft:
[Sun May 16 07:24:54.456327 2021] [mpm_event:notice] [pid 15:tid 140204464299072] AH00489: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations [Sun May 16 07:24:54.456352 2021] [core:notice] [pid 15:tid 140204464299072] AH00094: Command line: '/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: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/etc/apache2/modsecurity.d/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/ls found within ARGS:doc: /bin/ls"] [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 "172.17.0.2"] [uri "/"] [unique_id "162114993662.860969"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
Conclusie
Gefeliciteerd! je hebt ModSecurity met succes binnen Docker container geïnstalleerd. Ik hoop dat je nu voldoende kennis hebt om deze oplossing in de Docker omgeving te implementeren. Voel je vrij me te vragen als je vragen hebt.