Generalidades
ModSecurity, originalmente escrito como un firewall de aplicaciones web (WAF) para servidores Apache, es el estándar de facto para las soluciones WAF de código abierto. El trabajo reciente en el proyecto ha cambiado el enfoque hacia proporcionar una biblioteca compartida genérica que cualquier servidor web puede usar para proteger requerimientos de HTTP(S). Para obtener más información sobre ModSecurity, visita el sitio aquí:
Estas instrucciones tratan sobre la construcción y configuración de libmodsecurity para una instancia de DreamCompute que ejecuta Ubuntu 16.04.
Construir libmodsecurity
Primero, instala los paquetes necesarios y las bibliotecas que se utilizan para crear proyectos fuente, así como las bibliotecas que utiliza específicamente libmodsecurity:
[root@instance]# apt-get update && apt-get install -y automake bison build-essential \ g++ gcc libbison-dev libcurl4-openssl-dev libfl-dev libgeoip-dev \ liblmdb-dev libpcre3-dev libtool libxml2-dev libyajl-dev make \ pkg-config zlib1g-dev
A continuación, descarga y descomprime la fuente más reciente de libmodsecurity. Esto está disponible en el proyecto ModSecurity GitHub, en la sucursal libmodsecurity:
[root@instance]# git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity Cloning into 'ModSecurity'... remote: Counting objects: 750, done. remote: Compressing objects: 100% (721/721), done. remote: Total 750 (delta 441), reused 107 (delta 23), pack-reused 0 Receiving objects: 100% (750/750), 651.13 KiB | 0 bytes/s, done. Resolving deltas: 100% (441/441), done. Checking connectivity... done.
Inicializa y actualiza los submódulos git que requiere ibmodsecurity:
[root@instance]# cd ModSecurity/ [root@instance]# git submodule init [root@instance]# git submodule update
Finalmenta, configura, compila e instala la biblioteca libmodsecurity:
[root@instance]# ./build.sh && ./configure && make && make install
Construir nginx con libmodsecurity
Ahora que libmodsecurity se ha instalado y está disponible para ser utilizado por programas de terceros, nginx se puede compilar con el conector ModSecurity-nginx para cargar libmodsecurity y procesar solicitudes.
Primero, toma la fuente para el módulo nginx envuelve libmodsecurity:
[root@instance]# cd /root && git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git Cloning into 'ModSecurity-nginx'... remote: Counting objects: 30, done. remote: Compressing objects: 100% (30/30), done. remote: Total 30 (delta 6), reused 8 (delta 0), pack-reused 0 Unpacking objects: 100% (30/30), done. Checking connectivity... done.
A continuación, toma la fuente nginx y verifícala. Comienza descargando la fuente y su firma de nginx.org:
[root@instance]# wget -q https://nginx.org/download/nginx-1.12.2.tar.gz{.asc,}
Para verificar el contenido de la descarga, obtén la clave de firma del desarrollador de nginx.org:
[root@instance]# curl -sS https://nginx.org/keys/mdounin.key | gpg --import gpg: directory `/home/ubuntu/.gnupg' created gpg: new configuration file `/home/ubuntu/.gnupg/gpg.conf' created gpg: WARNING: options in `/home/ubuntu/.gnupg/gpg.conf' are not yet active during this run gpg: keyring `/home/ubuntu/.gnupg/secring.gpg' created gpg: keyring `/home/ubuntu/.gnupg/pubring.gpg' created gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created gpg: key A1C052F8: public key "Maxim Dounin <mdounin@mdounin.ru>" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) gpg: no ultimately trusted keys found
Ahora verifica la firma:
[root@instance]# gpg --trusted-key 0x520A9993A1C052F8 --verify nginx-1.12.2.tar.gz{.asc,} gpg: Signature made Tue 17 Oct 2017 01:18:21 PM UTC using RSA key ID A1C052F8 gpg: key A1C052F8 marked as ultimately trusted gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u gpg: Good signature from "Maxim Dounin <mdounin@mdounin.ru>"
Desde aquí, configura nginx con la opción --add-module=, apuntando al módulo ModSecurity-nginx que fue descargado previamente:
[root@instance]# tar -zxf nginx-1.12.2.tar.gz [root@instance]# cd nginx-1.12.2/ [root@instance]# ./configure --add-module=/root/ModSecurity-nginx
Finalmente, construye e instala nginx:
[root@instance]# make && make install
Configurar libmodsecurity en nginx
Agrega reglas de libmodsecurity y directivas de configuración dentro de las configuraciones de nginx es sencillo. Agrega lo siguiente a la configuración de nginx:
modsecurity on; modsecurity_rules ' SecRuleEngine On SecDebugLog /tmp/modsec_debug.log SecDebugLogLevel 9 SecRule ARGS "@streq test" "id:1,phase:1,deny,msg:\'test rule\'" ';
Estas directivas pueden ser agregadas dentro del bloque http, o uno o más server o bloques location. Una vez que se agrega esto, vuelve a cargar nginx. Esta regla ahora se puede probar enviando una solicitud regular a nginx y examinando el resultado:
[root@instance]# curl -D - -s -o /dev/null localhost/ HTTP/1.1 200 OK Server: nginx/1.10.1 Date: Wed, 13 Jul 2016 18:06:15 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Wed, 13 Jul 2016 18:01:34 GMT Connection: keep-alive ETag: "578681fe-264" Accept-Ranges: bytes
Ésta regla agregada vía la directiva modsecurity_rules negará los requerimientos que tienen la palabra test dentro de un argumento GET o POST. Esto puede ser visto cambiando la prueba curl:
[root@instance]# curl -D - -s -o /dev/null localhost/?a=test HTTP/1.1 403 Forbidden Server: nginx/1.10.1 Date: Wed, 13 Jul 2016 18:06:19 GMT Content-Type: text/html Content-Length: 169 Connection: keep-alive
Una respuesta 403 significa que nginx ha bloqueado la solicitud basándose en el procesamiento de la solicitud con libmodsecurity. Desde aquí, libmodsecurity se puede personalizar utilizando las directivas disponibles para ModSecurity (consulta el manual de referencia de ModSecurity a continuación para obtener más información).
Notas Finales
Cabe señalar que libmodsecurity todavía está en desarrollo activo, por lo que ciertas funciones están sujetas a cambios. Al igual que con cualquier proyecto de código abierto desarrollado activamente, asegúrate de consultar el código fuente para conocer las versiones más recientes.