Existen diversas casuísticas en la exclusión de reglas de mod_security. Un procedimiento habitual suele ser limitar el ámbito de exclusión a un determinado contexto en el que por diversas razones estamos obteniendo falsos positivos de una serie de reglas problemáticas, ejemplo:
<Location /aplicacion> SecRuleRemoveById 920320 942200 942330 942430 980130 </Location>
Suponemos que dicha directiva excluiría las reglas 920320, 942200, 942330, 942430 y 980130 para el contexto /aplicacion
. Pues bien, si estas reglas saltan en la fase 1 de procesado de mod_security la exclusión que pretendemos no va a funcionar, ya que dicha información de request aún no habrá llegado a Apache y por tanto no podrá aplicar la directiva Location
para el contexto mencionado… ¡mod_security habrá bloqueado antes la request!
Para encontrar una explicación tenemos que recordar que mod_security funciona siguiendo un flujo de procesado de request en 5 fases:
- Request headers
- Request body
- Response headers
- Response body
- Logging
Podéis comprobar esto en la documentación oficial. Precisamente si vemos la documentación referente a la primera fase:
De esta manera, la forma de excluir correctamente las 5 reglas mencionadas en el ejemplo tendremos que aplicar estas directivas:
SecRule REQUEST_URI "@beginswith /aplicacion" "phase:1,nolog,allow,ctl:ruleRemoveById=920320,id:1" SecRule REQUEST_URI "@beginswith /aplicacion" "phase:1,nolog,allow,ctl:ruleRemoveById=942200,id:2" SecRule REQUEST_URI "@beginswith /aplicacion" "phase:1,nolog,allow,ctl:ruleRemoveById=942330,id:3" SecRule REQUEST_URI "@beginswith /aplicacion" "phase:1,nolog,allow,ctl:ruleRemoveById=942430,id:4" SecRule REQUEST_URI "@beginswith /aplicacion" "phase:1,nolog,allow,ctl:ruleRemoveById=980130,id:5"
Indicando de esta manera a mod_security que ignore en fase 1 la regla en cuestión (ej.: ruleRemoveById=920320
) para toda request bajo el contexto /aplicacion y evitando de esta manera el falso positivo que nos generaba.