mod_security es un módulo de seguridad de Apache, actúa como firewall de aplicaciones web (WAF) y su trabajo es filtrar y bloquear las solicitudes HTTP sospechosas, pudiendo bloquear ataques de fuerza bruta, vulnerabilidades de cross scripting (XSS), ataques por inyección SQL (SQLi), etc.
mod_security está activo en todos nuestros servidores Linux por defecto. Aunque no es posible deshabilitarlo completamente por razones de seguridad, este módulo permite añadir excepciones mediante el fichero .htaccess en el caso de que trate de un falso positivo.
¿Cómo identificar un bloqueo de mod_security?
Si al efectuar alguna tarea en nuestra web, tal como actualizar un formulario, añadir una entrada en WordPress o cualquier otro CMS o realizar un pago a través de un TPV y te encuentras con un error 406, posiblemente estemos ante un bloqueo de mod_security.
Para confirmar que el bloqueo es debido a una regla de modsecurity, lo más efectivo sería comprobar el log de errores de Apache disponible en nuestro hosting.
Puedes acceder al log de errores de Apache usando el explorador de ficheros disponible en el apartado FTP de tu hosting, o conectándote mediante FileZilla. El fichero que debes descargar se llama apache.error.log y está ubicado en el directorio logs de tu hosting.
Una vez descargado el log, abre el fichero con cualquier editor de texto de tu equipo y revisa las últimas peticiones realizadas, si el log es muy grande puedes buscar las palabras ModSecurity o simplemente las que contengan tu IP.
Si se trata de un bloqueo de mod_security verás úna línea similar a esta:
[Mon Apr 26 13:24:15.571708 2021] [:error] [pid 8xxx:tid 1401138623xxxxx] [client 123.456.789.012:49500] [client 123.456.789.012] ModSecurity: Access denied with code 406 (phase 2). Pattern match "^POST$" at REQUEST_METHOD. [file "/etc/modsecurity/custom/20_bruteforce.conf"] [line "43"] [id "210"] [msg "Accept header required"] [hostname "ejemplo.com"] [uri "/"] [unique_id "YIai31JimwwAAB9Mo7EAAA"]
En este mensaje podrás identificar fácilmente las siguientes etiquetas:
- Fecha y hora de la petición:
[Mon Apr 26 13:24:15.571708 2021]
- IP del visitante:
[client 123.456.789.012]
- Tipo de error:
ModSecurity: Access denied with code 406 (phase 2)
- Identificador de error de ModSecuriy:
[id "210"]
- Nuestra web:
[hostname "ejemplo.com"]
Añadir excepción
Una vez identificado y confirmado que el problema se trata de mod_security, que la petición se realiza desde nuestra IP o en su defecto la IP de un equipo o servidor de nuestra confianza, podemos añadir una excepción de seguridad para esta regla, añadiendo el siguiente código en el fichero .htaccess de nuestro hosting.
<IfModule mod_security2.c>
SecRuleRemoveById 210
</IfModule>
Debes prestar especial atención a lo siguiente
- Es importante que el código que añades después de la línea SecRuleRemoveById se corresponda con el identificador de error que has visto en tu log de errores de Apache.
- Asegúrate siempre de que la excepción que estás añadiendo es provocada por una petición que has generado tú mismo, de otro modo podrías estar permitiendo vulnerabilidades de bots maliciosos o usuarios malintencionados.
- Nunca crearemos excepciones para las reglas que empiecen por 949, como por ejemplo la 949110, ni tampoco para la 980130 en concreto.
El fichero .htaccess lo podrás editar desde el explorador de ficheros en la sección FTP del hosting, este fichero se encontrará en el directorio www de tu hosting o en el directorio donde tengas instalada tu aplicación.