Nginx环境下ModSecurity未匹配任何规则时的默认动作如何配置
Nginx+ModSecurity 未匹配规则默认拦截配置方案
核心概念纠正
SecDefaultAction 不是「未匹配任何规则时的全局默认动作」,它的作用是为同阶段下没有显式声明动作的SecRule设置默认执行动作,你需要的「仅允许指定范围通行、其余全部拦截」的需求,需要通过「前序放行规则+末尾兜底拦截规则」的逻辑实现。
你当前配置的问题
SecDefaultAction位置错误,应该放在所有同阶段规则的最前方才能生效- 缺少兜底拦截规则,未匹配到放行规则的请求不会被自动拦截
- 现有放行规则的日志描述错误,你当前规则逻辑是放行CN IP,但msg写的是
Blocking Country IP Address
修正后完整配置
# 开启ModSecurity规则引擎(遗漏的话规则不会生效) SecRuleEngine On # 配置阶段1默认动作,放在所有规则最前 SecDefaultAction "phase:1,log,auditlog,drop,status:403,tag:'SLA 24/7'" # 加载GeoIP数据库 SecGeoLookupDb /usr/local/geo/data/GeoLiteCity.dat # 放行中国大陆IP规则:匹配到CN IP则跳过后续所有规则 SecRule REMOTE_ADDR "@geoLookup" "phase:1,chain,id:10,allow,log,msg:'Allow China IP Access'" SecRule GEO:COUNTRY_CODE "@pm CN" # 兜底拦截规则:所有未命中上方放行规则的请求全部拦截 SecRule REMOTE_ADDR "@rx .*" "phase:1,id:9999,deny,log,status:403,msg:'Block Non-Allowed IP'"
扩展场景:仅放行指定IP段
如果不需要按国家放行,只要指定IP段通行,将上方GeoIP相关规则替换为以下配置即可:
# 示例:放行192.168.1.0/24、10.0.0.0/8两个内网段 SecRule REMOTE_ADDR "@ipMatch 192.168.1.0/24,10.0.0.0/8" "phase:1,id:10,allow,log,msg:'Allow Internal IP Access'"
验证方法
配置完成后执行nginx -t确认语法正确,重载Nginx后用非允许范围的IP访问服务,确认返回403状态码,同时查看ModSecurity审计日志存在对应拦截记录即可。
内容的提问来源于stack exchange,提问作者leminhquan
相关产品推荐
相关产品推荐

