я использую Набор основных правил 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"