CentOS7下Apache2+PHP5环境特定URI的ModSecurity白名单配置咨询
步骤1:获取触发拦截的规则ID
首先查看ModSecurity审计日志,定位拦截对应的规则ID:
grep "你的请求URI" /var/log/httpd/modsec_audit.log
在返回的日志内容中找到格式为[id:xxxxxx]的字段,xxxxxx就是触发拦截的规则ID,记录下来备用。
步骤2:添加自定义绕过规则
优先选择粒度最细的绕过方案,降低安全风险,以下三种方案按安全性从高到低排列:
方案1:仅对指定URI的指定GET参数绕过对应规则(最安全)
适合当前仅UUID参数触发拦截的场景,编辑ModSecurity自定义规则文件:
vi /etc/httpd/modsecurity.d/activated_rules/custom_bypass.conf
添加如下规则:
SecRule REQUEST_URI "@streq /你的目标URI路径" "id:10001,phase:2,nolog,allow,ctl:ruleRemoveTargetById=xxxxxx;ARGS:uuid"
参数说明:
- 10001:自定义规则ID,可使用10000以上未被占用的任意数值
- /你的目标URI路径:替换为实际需要放行的URI,例如
/user/query - xxxxxx:替换为步骤1中获取到的触发拦截的规则ID
- ARGS:uuid:替换为实际接收UUID的GET参数名
方案2:仅对指定URI绕过触发的单条规则(安全性中等)
适合该URI下多个参数都可能触发同一条规则的场景,规则内容如下:
SecRule REQUEST_URI "@streq /你的目标URI路径" "id:10002,phase:1,nolog,allow,ctl:ruleRemoveById=xxxxxx"
方案3:对指定URI完全关闭ModSecurity校验(不推荐,仅临时测试使用)
会导致该URI完全失去安全防护,规则内容如下:
SecRule REQUEST_URI "@streq /你的目标URI路径" "id:10003,phase:1,nolog,allow,ctl:ruleEngine=Off"
如果需要匹配多个同前缀URI,可以将匹配方式改为正则:将@streq替换为@rx ^/前缀/,例如@rx ^/api/可匹配所有/api/开头的URI。
步骤3:生效配置
首先验证Apache配置语法是否正确:
apachectl configtest
返回Syntax OK后重启Apache服务生效:
systemctl restart httpd
步骤4:验证效果
访问目标URI携带UUID格式的GET参数,确认不再被拦截,也可再次查看ModSecurity审计日志确认没有对应拦截记录。
内容的提问来源于stack exchange,提问作者FL370

