Retoques en Fail2ban para que funcione correctamente con ModSecurity en servidores Apache

Haciendo unas sencillas pruebas con las expresiones regulares que trae de serie Fail2ban, me encontré que para el jail de ModSecurity no encontraba ninguna ocurrencia de error en los logs de Apache. Sin embargo en éstos sí había entradas de bloqueos realizados por ModSecurity que tendrían que hacer saltar el trigger correspondiente en Fail2ban para realizar el baneo de los hosts infractores. Por lo tanto, sorpresa: fail2ban no estaba bloqueando nada, algo no estaba funcionando como debería.

Para muestra un extracto del log error.log donde podemos encontrar entradas con los errores que nos interesan:

Podemos ver claramente que ModSecurity está realizando un bloqueo a partir de las reglas OWASP definidas. Compruebo entonces con fail2ban-regex la expresión regular que viene por defecto definida en Fail2ban para el jail de mod-security, concretamente en el fichero /etc/fail2ban/filter.d/apache-modsecurity.conf que pinta tal que así:

La prueba del algodón:

fail2ban-regex -v /var/log/apache2/error.log "^\[[^]]*\] \[(:?error|\S+:\S+)\]( \[pid \d+(:\S+ \d+)?\])? \[client <HOST>(:\d{1,5})?\] ModSecurity:  (\[.*?\] )*Access denied with code [45]\d\d.*$"

¿Qué vemos? Que no encuentra nada a partir del patrón definido inicialmente en el fichero:

Es evidente que algo no funciona bien, ya que en el log sí aparecen errores que tendrían que identificar los filtros de Fail2ban. Ahora realizo una prueba con una expresión regular que definí yo en función de los patrones que encontré en error.log. La expresión para buscar patrones de coincidencia relativos a ModSecurity en error.log sería:

^.*\[client <HOST>\] ModSecurity:

Y la prueba:

fail2ban-regex -v /var/log/apache2/error.log "^.*\[client <HOST>\] ModSecurity:"

¡Bingo! Ahora sí encuentra a los hosts infractores y Fail2ban puede proceder a realizar los baneos correspondientes:

Por lo tanto, a los que utilicéis Fail2ban con Apache y ModSecurity, si os pasa lo mismo, os basta con añadir la expresión ^.*\[client \] ModSecurity: en el fichero /etc/fail2ban/filter.d/apache-modsecurity.conf

En cualquier caso, también lo he subido a mi Gist correspondiente donde podéis encontrar cómo queda finalmente el fichero de configuración de filtros.

No es el único filtro de Fail2ban que necesita algún retoque por lo que he podido estar viendo… pero para esos otros casos habrá otros artículos 😉