Estoy usando ModSecuity con mi servidor Apache y quiero configurarlo para que no registre solicitudes que tengan un parámetro determinado en la cadena de consulta.
En mod_secuirty.conf, tengo las siguientes configuraciones:
SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))"Y quiero configurar algo como SecAuditLogRelevantParameter "?! (prueba)" (para registrar cualquier solicitud que no tenga el parámetro de prueba ).
mod_security2 para Apache admite ctl:auditLogParts y ctl:auditLogEngine (nota: libmodsecurity3 no admite auditLogEngine para ctl ). Por lo tanto, puede crear una regla que apague el motor de auditoría o modificar las partes del registro. Creo que desea desactivarlo, por lo que, según su solicitud, necesita algo como esto:
SecAction "id:111001,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:tx.args_contains_test=0" SecRule ARGS_NAMES "@rx test" \ "id:111002,\ phase:2,\ pass,\ nolog,\ t:lowercase, setvar:'tx.args_contains_test=1'" SecRule TX:args_contains_tests "@lt 1" "id:111003,\ phase:2,\ pass,\ nolog,\ ctl:auditLogEngine=Off" Coloque estas reglas al principio de su conjunto de reglas; si usa CRS, entonces REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf es una buena opción.
¿Cómo funciona esta exclusión?
Como escribió anteriormente, la condición es "cualquier solicitud que no tenga el parámetro de prueba" . Esto no es tan trivial, porque debe verificar que algo no exista , por lo tanto, debe inspeccionar todos los argumentos.
En ModSecurity, puede hacerlo solo de esta manera: primero, debe configurar una variable de transacción, que almacena la información, la solicitud contiene cualquier argumento con nombre de test o no. Esa es la primera (y única) SecAction .
@rx test es un operador ModSecurity y su argumento, que verifica la colección ARGS_NAMES . Esta colección contiene todos los argumentos de la solicitud. La regla 111002 verifica todos los nombres de los argumentos y, si hay alguna variable con un nombre como test (coincidencias de expresiones regulares), cambia la variable TX.
La regla 111003 comprueba la variable TX y, si es 1, desactiva el motor auditLog para la transacción actual . Eso es todo.
Tenga en cuenta que el operador @rx entre mayúsculas y minúsculas , por eso está ahí la t:lowercase .
También tenga en cuenta que los dos SecRule ejecutaron en phase:2 . Si desea verificar el parámetro GET, debe mover esta regla a la phase:1 . Si desea verificar todas las variables posibles, debe duplicar esta regla: una para la phase:1 y la otra para la phase:2 , ¡con una identificación única!
Si desea desactivar auditLogEngine con un parámetro QUERY_STRING, p. http://example.com/form.cgi?test=1 , entonces la solución es más simple, pero cualquiera puede apagar de esta manera:
SecRule REQUEST_URI "@endsWith test=1" \ "id:111001,\ phase:1,\ pass,\ nolog,\ t:lowercase,\ ctl:auditLogEngine=Off"