如何通过主机名排除 ModSecurity 规则?

nny*_*yby 4 firewall mod-security web-application-firewall

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

如何将此排除限制为特定主机名?例如,wiki.example.com

Esa*_*nen 6

使用REQUEST_HEADERS:Host链接 withREQUEST_URI可以解决问题,但如果有多个站点需要或不需要排除,则维护起来会更加困难。因此,另一种解决方案是禁用虚拟主机的Nginx 配置规则。

可以使用modsecurity_rules内部特定的server&禁用某些规则location

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

    location /api.php {
        modsecurity_rules '
            SecRuleRemoveById 941160
        ';
    }
}
Run Code Online (Sandbox Code Playgroud)

对于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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者,尽管不推荐,但即使使用.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>
    
    Run Code Online (Sandbox Code Playgroud)