ModSecurity恶意Bot拦截规则失效:@pmFromFile与@beginswith问题求助
解决ModSecurity恶意Bot拦截规则失效问题
嘿,我之前在配置ModSecurity拦截恶意Bot时也踩过类似的坑,给你梳理下问题根源和解决办法:
核心问题:@beginswith不支持正则分组匹配
你之前写的@beginswith (black.?hole|blackwidow|...)是错误用法——ModSecurity的@beginswith运算符只接受单个或多个空格分隔的纯字符串前缀,不支持正则表达式的|分组语法,这就是规则完全不生效的原因。
正确的两种实现思路
1. 纯前缀匹配(无正则模糊需求)
如果你的Bot标识都是固定前缀(不需要black.?hole这种模糊匹配),可以直接用@beginswith加空格分隔多个前缀:
SecRule REQUEST_HEADERS:User-Agent "@beginswith blackhole blackwidow blowfish botalot buddy builtbottough bullseye" "id:'444440',phase:2,t:none,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'"
2. 前缀正则匹配(支持模糊变种)
如果需要像black.?hole这种带通配符的前缀匹配,必须改用@rx(正则匹配)运算符,同时用^锚定字符串开头,确保只匹配前缀:
SecRule REQUEST_HEADERS:User-Agent "@rx ^(black.?hole|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye)" "id:'444440',phase:2,t:none,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'"
这里注意ModSecurity使用PCRE正则语法,你的表达式要符合规范:比如black.?hole里的.匹配任意单个字符,?表示前面的字符可选,能覆盖blackhole、black hole这类变种。
额外调试与优化建议
- 开启调试日志排查:配置ModSecurity调试日志,查看规则未触发的具体原因:
测试后查看日志,能清楚看到User-Agent的实际值、正则匹配的结果。SecDebugLog /var/log/apache2/modsec_debug.log SecDebugLogLevel 9 - 大小写兼容处理:很多Bot会篡改User-Agent的大小写,建议加上
t:lowercase转换为小写后匹配,避免绕过:SecRule REQUEST_HEADERS:User-Agent "@rx ^(black.?hole|blackwidow|blowfish)" "id:'444440',phase:2,t:lowercase,deny,status:406,log,msg:'BAD BOT - Detected and Blocked.'" - 用curl快速测试:模拟恶意Bot请求验证规则是否生效:
查看服务器日志或ModSecurity审计日志,确认是否触发了406拦截。curl -A "blackhole" http://your-domain.com
内容的提问来源于stack exchange,提问作者abkrim
相关产品推荐
相关产品推荐

