如何配置ModSecurity与OWASP-CRS允许含()的ERDDAP查询?
解决ModSecurity拦截ERDDAP含
(/)的查询请求问题 步骤1:定位触发拦截的具体规则ID
首先查看Apache错误日志,找到ModSecurity拦截请求时记录的规则ID:
sudo grep "ModSecurity: Access denied" /var/log/apache2/error.log
日志里会包含类似[id "942100"]的字段,这就是触发拦截的规则ID(通常是OWASP CRS中SQL注入相关的规则,比如942系列)。
步骤2:添加自定义规则排除拦截
根据实际场景选择以下一种方式,修改ModSecurity配置:
方式一:针对ERDDAP路径全局排除
如果ERDDAP的请求都以固定路径开头(比如/erddap/),可以通过自定义规则对该路径下的请求禁用触发拦截的规则:
- 创建自定义规则文件:
sudo touch /etc/modsecurity/custom-erddap-rules.conf - 编辑文件,添加内容(替换
942100为实际找到的规则ID,多个ID用逗号分隔):# 允许ERDDAP路径下的请求包含()字符,排除指定SQL注入规则 SecRule REQUEST_URI "@beginsWith /erddap" "id:100000,phase:1,nolog,pass,ctl:ruleRemoveById=942100,ctl:ruleRemoveById=942110" - 在Apache的ModSecurity配置中引入该文件:
编辑/etc/apache2/mods-available/security2.conf,在IncludeOptional /etc/modsecurity/crs/*.conf之后添加:Include /etc/modsecurity/custom-erddap-rules.conf
方式二:针对特定参数精准排除
如果只有某个特定参数(比如ERDDAP的query参数)包含括号,可以只对该参数禁用规则,避免影响其他请求:
在自定义规则文件中添加:
# 允许ERDDAP的query参数包含()字符,排除指定规则对该参数的检查 SecRule ARGS_NAMES "@streq query" "id:100001,phase:1,nolog,pass,ctl:ruleRemoveTargetById=942100,ARGS:query"
步骤3:验证配置并重启服务
保存配置后,重启Apache使规则生效:
sudo systemctl restart apache2
测试包含(/)的ERDDAP查询请求,确认不再被拦截,同时检查日志确保无异常拦截记录。
注意事项
- 尽量精准排除规则,避免全局禁用OWASP CRS核心规则,保障服务器安全性。
- 定期查看Apache错误日志,及时发现新的误拦截情况并调整规则。
内容的提问来源于stack exchange,提问作者lorenzo corgnati
相关产品推荐
相关产品推荐

