Назад | Перейти на главную страницу

Apache LocationMatch не соответствует

Я пытаюсь настроить регулирование запросов для определенных конфиденциальных 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 ".*"

То же самое и с другими вашими правилами.