Apache modsecurity ограничивает количество попаданий на uri в единицу времени

Я пытаюсь настроить 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

Спасибо!


person spi    schedule 08.06.2017    source источник


Ответы (1)


Конфигурация, которая работает, выглядит следующим образом:

# Limit the requests count by unit of time.
SecRuleEngine On

<LocationMatch "^.*/my-resource/.*">
  SecAction initcol:resource=%{REQUEST_URI},pass,nolog,id:132
  SecRule RESOURCE:COUNTER "@ge 10" "phase:3,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:232"
  SecAction "phase:2,setvar:resource.counter=+1,pass,nolog,id:332"
  SecAction "phase:2,deprecatevar:resource.counter=10/60,pass,nolog,id:432"
  Header always set Retry-After "60" env=RATELIMITED
</LocationMatch>

ErrorDocument 429 "Too Many Requests"

ndlr: измените имя коллекции с «uri» на «resource» и немного адаптируйте этапы.

Затем он работает как положено (см. список рассылки modsecurity: https://sourceforge.net/p/mod-security/mailman/message/35889575/)

person spi    schedule 12.06.2017