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.