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

Как исключить правила ModSecurity по имени хоста?

я использую Набор основных правил OWASP 3.2.0 настроить с ModSecurity 3.0.4 и ModSecurity-nginx.

Если у меня есть такое исключение из правил, в REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf:

 SecRule REQUEST_URI "@beginsWith /api.php" \
     "id:1015,\
     phase:2,\
     pass,\
     nolog,\
     ctl:ruleRemoveById=941160"

Как мне также ограничить это исключение конкретным именем хоста? Например, wiki.example.com.

С помощью REQUEST_HEADERS:Host прикованный к REQUEST_URI делает свое дело, но становится труднее поддерживать, если есть несколько сайтов, которые нуждаются или не нуждаются в исключении. Следовательно, альтернативным решением было бы отключение правил в конфигурации Nginx для виртуального хоста.

Некоторые правила можно отключить, используя modsecurity_rules внутри конкретных server & location:

server {
    server_name wiki.example.com;
    modsecurity on;
    . . .

    location /api.php {
        modsecurity_rules '
            SecRuleRemoveById 941160
        ';
    }
}

То же самое возможно с Apacheтакже, поскольку некоторые пользователи Apache могут позже найти этот вопрос по его названию. С Apache вы можете использовать SecRuleRemoveById / modsecurity_rules директивы

  • внутри VirtualHost и Location или LocationMatch:

    <VirtualHost *:443>
        ServerName wiki.example.com
        . . .
    
        <LocationMatch "^/api.php">
            <IfModule security2_module>
                SecRuleRemoveById 941160
            </IfModule>
            <IfModule security3_module>
                modsecurity_rules 'SecRuleRemoveById 941160'
            </IfModule>
        </LocationMatch>
    </VirtualHost>
    
  • или, хотя не рекомендуется, даже с .htaccess:

    <IfModule security2_module>
        <If "%{REQUEST_URI} =~ m#^/api.php#">
            SecRuleRemoveById 941160
        </If>
    </IfModule>
    
    <IfModule security3_module>
        <If "%{REQUEST_URI} =~ m#^/api.php#">
            modsecurity_rules 'SecRuleRemoveById 941160'
        </If>
    </IfModule>
    

Ответ - использовать REQUEST_HEADERS:Host с участием цепь, как это:

 SecRule REQUEST_HEADERS:Host "wiki.example.com" \
     "id:1017,\
     phase:2,\
     pass,\
     nolog,\
     chain"
     SecRule REQUEST_URI "@beginsWith /api.php" \
         "ctl:ruleRemoveById= 941160"