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

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

我在用着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

答案1

使用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,您可以使用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>
    

答案2

答案是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"

相关内容