Я пытаюсь настроить регулирование запросов для определенных конфиденциальных URI на виртуальном хосте apache (v2.2) с mod_security, но обнаружив проблемы с использованием LocationMatch. Пока что конфигурация следующая:
<VirtualHost *:80>
ServerName www.example.com
RewriteEngine On
DocumentRoot "/var/www/html/www.example.com"
<Directory "/var/www/html/www.example.com">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
SecRuleEngine On
# ignore requests from localhost or some other IP
SecRule REMOTE_ADDR "^127\.0\.0\.2$" "phase:1,id:'1',nolog,allow"
<LocationMatch "^\/RESTv2\/auth\..+">
SecRule REQUEST_FILENAME ".*" "phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests.auth=+1,id:'3',expirevar:ip.requests.auth=1"
SecRule ip:requests.auth "@gt 2" "phase:1,pass,log,logdata:'blocking auth %{REMOTE_ADDR} req/sec: %{ip.requests}',setvar:ip.block.auth=1,expirevar:ip.block.auth=5,id:'4'"
SecRule ip:block.auth "@eq 1" "phase:1,deny,id:'999',nolog,logdata:'blocking RESTv2/auth.json for %{REMOTE_ADDR} req/sec: %{ip.requests.auth}', status:509"
</LocationMatch>
ErrorDocument 509 "Special Rate Limit Exceeded!"
</VirtualHost>
Проблема в том, что LocationMatch директива никогда не соответствует, даже если я уменьшу ее до чего-то более общего, как .*. Я также пробовал с побегами и без них для / символы в регулярном выражении без какой-либо разницы в поведении.
Если я закомментирую теги open и close, правила дросселирования работают должным образом, просто они никогда не срабатывают, когда находятся внутри LocationMatch теги. В /RESTv2/auth.json файл существует внутри DocumentRoot каталог, и обслуживается нормально.
Я вызываю дросселированные запросы как curl http://www.example.com/RESTv2/auth.json.
Это проблема с использованием LocationMatch, или есть какое-то странное взаимодействие между ним и mod_security правила?
Правила фазы 1 ModSecurity обрабатываются до директив LocationMatch.
Поэтому вам нужно либо изменить их на правила фазы 2 (что может быть нежелательно, так как будет тратить время на обработку всех правил фазы 1 вместо их немедленной блокировки), либо использовать синтаксис ModSecurity и связанные правила для замены синтаксиса LocationMatch:
SecRule REQUEST_URI "^\/RESTv2\/auth\..+" phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests.auth=+1,id:'3',expirevar:ip.requests.auth=1,chain”
SecRule REQUEST_FILENAME ".*"
То же самое и с другими вашими правилами.