Я пытаюсь настроить modsecurity для Apache, чтобы ограничить количество запросов к одному и тому же ресурсу за единицу времени: 10 обращений в секунду на ресурс, независимо от того, какой IP-адрес выполняет запрос. Желательно не блокировать дополнительные вызовы, а перенаправить на данную страницу.
Я включил модуль и поместил следующий код в httpd.conf:
<LocationMatch "(.*)\.dimg(.*)">
SecDebugLogLevel 9
SecAction phase:2,initcol:resource=%{REQUEST_URI},pass,nolog,id:132
SecRule RESOURCE:COUNT "@gt 10" "phase:2,pause:300,deny,status:503,setenv:RATELIMITED,skip:1,nolog,id:102"
SecAction "phase:2,setvar:resource.count=+1,pass,nolog,id:103"
SecAction "phase:5,deprecatevar:resource.count=10/1,pass,nolog,id:104"
Header always set Retry-After "10" env=RATELIMITED
ErrorDocument 503 "Service Unavailable"
Затем я запускаю стресс-тест для имитации высокой нагрузки.
Но лишние запросы не блокируются.
Из журналов:
Записанная исходная переменная коллекции: resource.count = "0"
В результате SecRule RESOURCE: COUNT "@gt 10" возвращает false для любого запроса.
Что здесь не так?