Cómo instalar libmodsecurity + nginx en Ubuntu 14.04

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.

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.

¿Aún no encuentra lo que busca?