Firewall

如何按主機名排除 ModSecurity 規則?

  • May 28, 2020

我正在使用OWASP 核心規則集 3.2.0設置ModSecurity 3.0.4ModSecurity-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:Hostchained withREQUEST_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指令

  • 內部VirtualHostLocationLocationMatch
<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>

引用自:https://serverfault.com/questions/1018795