Используйте ModSecurity для ограничения скорости API с Apache - PullRequest
0 голосов
/ 16 мая 2018

Я пытался ограничить мой API с помощью Apache, чтобы не загружать мою инфраструктуру и не подключаться к моей БД при каждом вызове, но я изо всех сил стараюсь делать то, что хочу.

Я нашел несколько примеров того, какограничивайте вызовы разными IP-адресами, как показано ниже, и это прекрасно работает:

SecAction id:1,initcol:IP=%{REMOTE_ADDR}
SecAction "id:2,deprecatevar:IP.CALLS_LIMIT=1/10
SecRule IP:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:IP.CALLS_LIMIT=+1

Но я смог бы сгруппировать вызовы по переменной enache Apache, а не по IP.Поэтому я попробовал что-то вроде:

SecAction id:1,initcol:ACTOR=%{env.actor}
SecAction "id:2,deprecatevar:ACTOR.CALLS_LIMIT=1/10
SecRule ACTOR:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:ACTOR.CALLS_LIMIT=+1

Но это не работает, как в SecRule, он не распознает субъект:

Ошибка при создании правила: Неизвестная переменная: ACTOR

Я посмотрел, но не могу никого найти, используя пользовательскую переменную, установленную ModSec в e SecRule.

Я также пробовал что-то вроде передачи переменной в env, но мойenv var, кажется, остается пустым ...: /

SecAction id:1,initcol:ACTOR=%{env.actor}
SecAction "id:2,deprecatevar:ACTOR.CALLS_LIMIT=1/10,setenv:CALLS_LIMIT=%{ACTOR.CALLS_LIMIT}
SecRule ACTOR:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:ACTOR.CALLS_LIMIT=+1,setenv:CALLS_LIMIT=%{ACTOR.CALLS_LIMIT}
Header set Test "expr=%{env:CALLS_LIMIT}"

Так что я не знаю, как использовать мой собственный var в моем SecRule.Кто-нибудь знает, как я мог это сделать?

Спасибо.;)

...