# rm-rf.es

Cómo instalar ModSecurity en NGINX

Hace tiempo que ModSecurity ya no es exclusivo de Apache. En el año 2012 ya publiqué una entrada hablando sobre la extensión para IIS. Ahora que NGINX se ha hecho un hueco importante como servidor web y que ModSecurity ya no es BETA para NGINX vamos a ver los pasos para instalarlo y configurarlo.

Es importante saber que NGINX no soporta módulos dinámicos por lo que debemos recompilar añadiendo estáticamente el módulo de ModSecurity. Esto implica que no podemos utilizar la versión paquetizada (rpm, deb, etc). Para añadir esta funcionalidad debemos entonces primero deshabilitar la versión de repositorio y compilar manualmente tanto ModSecurity como NGINX.

Compilar ModSecurity como módulo standalone

Estos son los pasos para compilar ModSecurity. Descargamos la última versión estable y en la línea de compilación especificamos que se va a utilizar en modo standalone y con mlogc deshabilitado (no está soportado en NGINX):

# wget https://www.modsecurity.org/tarball/2.9.0/modsecurity-2.9.0.tar.gz
# tar -xzvf modsecurity-2.9.0.tar.gz 
# cd modsecurity-2.9.0
# ./configure --enable-standalone-module --disable-mlogc
# make

Aunque no sea demasiado limpio, es necesario instalar las fuentes de Apache para poder compilar ModSecurity, en caso contrario recibiréis este error:

configure: looking for Apache module support via DSO through APXS
configure: error: couldn't find APXS

Las instalamos junto con otros requerimientos (xml2):

# yum install httpd-devel libxml2 libxml2-devel

Instalación de NGINX con el módulo ModSecurity

Al igual que antes, bajamos la última versión estable de NGINX y la compilamos según requerimientos. Lo importante en este caso es indicar que queremos añadir el módulo ModSecurity especificando el path donde hemos realizado las tareas anteriores:

# wget http://nginx.org/download/nginx-1.6.3.tar.gz
# cd nginx-1.6.3
# ./configure --add-module=/var/tmp/modsecurity-2.9.0/nginx/modsecurity/
# make
# make install

Configuración de NGINX para habilitar ModSecurity

Básicamente activamos el módulo y referenciamos el archivo de configuración. Podemos utilizar como base de configuración el archivo modsecurity.conf-recommended:

# cp /var/tmp/modsecurity-2.9.0/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf

Y la configuración en el archivo nginx.conf:

vi /usr/local/nginx/conf/nginx.conf
        location / {
            root   html;
            ModSecurityEnabled on;
            ModSecurityConfig modsecurity.conf;
            index  index.html index.htm;
        }

Si iniciamos NGINX veremos como se carga el módulo en los logs:

2015/04/21 18:54:19 [notice] 15323#0: ModSecurity for nginx (STABLE)/2.9.0 (http://www.modsecurity.org/) configured.
2015/04/21 18:54:19 [notice] 15323#0: ModSecurity: APR compiled version="1.4.8"; loaded version="1.4.8"
2015/04/21 18:54:19 [notice] 15323#0: ModSecurity: PCRE compiled version="8.32 "; loaded version="8.32 2012-11-30"
2015/04/21 18:54:19 [notice] 15323#0: ModSecurity: LIBXML compiled version="2.9.1"
2015/04/21 18:54:19 [notice] 15323#0: ModSecurity: StatusEngine call: "2.9.0,nginx,1.4.8/1.4.8,8.32/8.32 2012-11-30,(null),2.9.1,75cefdc5c766548a38f7b340944079f10d5dda9f"
2015/04/21 18:54:19 [notice] 15323#0: ModSecurity: StatusEngine call successfully sent. For more information visit: http://status.modsecurity.org/

Reglas de ModSecurity

Hay reglas de pago y gratuitas. A través del github de SpiderLabs podéis bajar las gratuitas y usarlas según requerimientos:

# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master -O /root/rules.tar.gz
# tar -xzvf rules.tar.gz

Después, sólo tenéis que hacer un Include al directorio con las reglas activas. Ejemplo:

Include /usr/local/nginx/modsecurity/rules/*conf

Si todo ha ido bien ya podréis testear el funcionamiento de ModSecurity y verificar los bloqueos/warnings en los logs (modsec_audit.log):

--13c83728-H--
Message: Warning. Match of "within %{tx.allowed_methods}" against "REQUEST_METHOD" required. 
[file "/root/SpiderLabs-owasp-modsecurity-crs-d469e93/base_rules/modsecurity_crs_30_http_policy.conf"]
[line "31"] [id "960032"] [rev "2"] [msg "Method is not allowed by policy"] [data "GET"] [severity "CRITICAL"] 
[ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/POLICY/METHOD_NOT_ALLOWED"]
[tag "WASCTC/WASC-15"] [tag "OWASP_TOP_10/A6"] [tag "OWASP_AppSensor/RE1"] [tag "PCI/12.1"]

Os recomiendo consultar las distintas directivas para entender como configurar el módulo. Más información en el manual de referencia de SpiderLabs.

Salir de la versión móvil