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          SIZE
           f603dbc38018   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.