Я пытаюсь настроить modsecurity для Apache, чтобы ограничить количество обращений к данному ресурсу за единицу времени (скажем, 10 обращений в минуту на ресурс, независимо от того, какой IP-адрес выполняет запрос). Ресурсы имеют шаблон URL-адреса в виде "https://myhost/my-resource/my-resource-id"
# Limit the requests count by unit of time.
SecRuleEngine On
<LocationMatch "^.*/my-resource/.*">
# SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog,id:132
SecAction initcol:uri=%{REQUEST_URI},pass,nolog,id:232
SecAction "phase:5,deprecatevar:uri.counter=10/60,pass,nolog,id:332"
SecRule URI:COUNTER "@ge 10" "phase:2,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:432"
SecAction "phase:2,pass,setvar:uri.counter=+1,nolog,id:532"
Header always set Retry-After "60" env=RATELIMITED
</LocationMatch>
ErrorDocument 429 "Too Many Requests"
Насколько я понимаю этот фрагмент, он сообщает modsecurity: «Создайте переменную с именем uri для каждого запроса_uri и свяжите счетчик для каждого, а затем уменьшите его на 10 каждые 60 секунд. Если текущий счетчик uri достигает значения 10, произойдет сбой с кодом ошибки. 429, иначе увеличьте его», что мне и нужно.
Эта конфигурация приводит к ошибке «URI переменная не найдена», почему я не понимаю.
Если я раскомментирую 1-й SecAction и изменю оставшуюся конфигурацию, чтобы ссылаться на него, он работает (возвращает 429 после 10 быстрых вызовов), но, очевидно, не принимает во внимание uri (он не работает для любого ресурса, например, /my-resource/ 123 и /мой-ресурс/456)
Может ли кто-нибудь помочь с этим? Все мои попытки терпят неудачу, и я не очень хорошо знаком с конфигурацией Apache в целом, поэтому я думаю, что здесь упущено какое-то важное понятие.
PS: Apache v2.4, mod-security v2.9
Спасибо!