Instale ModSecurity con Apache en un contenedor Docker
ModSecurity es un firewall de aplicaciones web (WAF) gratuito, de código abierto y el más popular que protege su aplicación web contra una amplia gama de ataques de capa 7. Fue diseñado para el monitoreo, registro y filtrado de solicitudes del servidor web Apache. Viene con un conjunto de reglas básicas que detecta y detiene varios ataques, incluidos inyección de SQL, secuencias de comandos entre sitios, troyanos, agentes de usuario incorrectos, secuestro de sesión y más.
En este tutorial, le mostraré cómo instalar ModSecurity 3 con Apache dentro de un contenedor Docker.
Requisitos
- Un servidor con Ubuntu 20.04.
- Una contraseña de root está configurada en su servidor.
Empezando
Primero, se recomienda actualizar su sistema a la última versión. Puedes actualizarlo con el siguiente comando:
apt-get update -y
Una vez que su sistema esté actualizado, deberá instalar algunas dependencias en su sistema. Puede instalarlos todos con el siguiente comando:
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
Una vez que todas las dependencias estén instaladas, puede continuar con el siguiente paso.
Instalar ventana acoplable
A continuación, deberá instalar Docker CE en su sistema. De forma predeterminada, la última versión de Docker no está incluida en el repositorio predeterminado de Ubuntu. Por lo tanto, deberá agregar el repositorio oficial de Docker al APT.
Primero, descargue y agregue la clave Docker GPG con el siguiente comando:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
A continuación, agregue el repositorio de Docker CE a la lista de fuentes de APT con el siguiente comando:
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker-ce.list
Una vez que se agrega el repositorio, actualice el repositorio con el siguiente comando:
apt-get update -y
Una vez actualizado el repositorio, instala la última versión de Docker CE con el siguiente comando:
apt-get install docker-ce -y
Después de instalar Docker CE, verifique la versión instalada de Docker CE con el siguiente comando:
docker --version
Deberías obtener el siguiente resultado:
Docker version 20.10.6, build 370c289
También puede verificar el estado del servicio Docker con el siguiente comando:
systemctl status docker
Deberías obtener el siguiente resultado:
? 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)
Una vez que haya terminado, puede continuar con el siguiente paso.
Crear un Dockerfile para ModSecurity
A continuación, deberá crear un Dockerfile para instalar ModSecurity dentro del contenedor de Ubuntu.
Primero, cambie el directorio a /opt y cree un modsec_rules.conf archivo con el siguiente comando:
cd /opt nano modsec_rules.conf
Agregue las siguientes líneas:
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"
Guarde y cierre el archivo, luego cree otro archivo con el siguiente comando:
nano 000-default.conf
Agregue las siguientes líneas: Anuncio
<VirtualHost *:80> modsecurity on 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 combined </VirtualHost>
Guarde y cierre el archivo cuando haya terminado. Dockerfile copiará los archivos anteriores en el contenedor de Docker durante el proceso de compilación.
Finalmente, crea un Dockerfile con el siguiente comando:
nano Dockerfile
Agregue las siguientes líneas:
# 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
Guarde y cierre el archivo cuando haya terminado.
El archivo anterior descargará la imagen de Ubuntu, instalará todas las dependencias, descargará ModSecurity, lo compilará y configurará Apache para que funcione con ModSecurity.
En este punto, Dockerfile está listo. Ahora puede continuar con el siguiente paso.
Cree la imagen de Apache ModSecurity e inicie el contenedor
Ahora, cambie el directorio a /opt y cree la imagen de Docker para Apache ModSecurity con el siguiente comando:
cd /opt docker build .
Una vez que se haya completado el proceso de compilación, debería obtener el siguiente resultado:
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
Ahora puede enumerar todas las imágenes de la ventana acoplable con el siguiente comando:
docker images
Deberías obtener el siguiente resultado:
REPOSITORY TAG IMAGE ID CREATED SIZE f603dbc38018 32 seconds ago 2.48GB ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
Ahora, elija la primera identificación de imagen de la salida anterior e inicie el contenedor Apache ModSecurity con el siguiente comando:
docker run --name modsec-apache -ditp 80:80 f603dbc38018
Deberías obtener el siguiente resultado:
40eb0e77e61635c3cee2bfaffbd9489bc7d20aa3e1befb52749de079aaadb528
Ahora puede verificar el contenedor en ejecución con el siguiente comando:
docker ps
Deberías obtener el siguiente resultado:
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
Como puede ver, el contenedor ModSecurity se inicia y escucha en el puerto 80.
Verificar ModSecurity
En este punto, el contenedor ModSecurity se está ejecutando. Ahora es el momento de probar si las reglas de ModSecurity bloquean las solicitudes maliciosas o no.
Para hacerlo, abre tu terminal y ejecuta el siguiente comando:
curl localhost?doc=/bin/ls
Debería ver el siguiente resultado:
<!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>
Deberías ver el «403 Prohibido» error. Porque ModSecurity ha bloqueado la solicitud anterior.
También puede consultar el registro de Apache para obtener más información.
Para hacerlo, primero conéctese al contenedor con el siguiente comando:
docker exec -it modsec-apache /bin/bash
Una vez que esté conectado, debería obtener el siguiente shell:
[email protected]:/#
Ahora, verifique el registro de Apache con el siguiente comando:
tail -f /var/log/apache2/error.log
Debería ver que ModSecurity ha bloqueado la solicitud maliciosa:
[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"]
Conclusión
¡Felicidades! ha instalado correctamente ModSecurity dentro del contenedor Docker. Espero que ahora tenga suficiente conocimiento para implementar esta solución en el entorno de Docker. No dude en preguntarme si tiene alguna pregunta.