ModSecurity/Coraza中混合逻辑AND与OR的规则配置及Host匹配优化
解决ModSecurity/Coraza中混合AND与OR的规则配置问题
需求回顾
需要实现的逻辑:当源IP属于指定CIDR网段 且 请求Host头是指定域名之一时,拒绝请求,等价于:
if (srcIp in ['3.4.5.0/24', '2.3.4.0/24']) AND (host in ['foo.com', 'bar.com']) deny
问题分析
- 链式规则默认是AND逻辑,适合实现IP和Host的组合判断
- 使用
@pm匹配Host会导致子串误匹配(如abar.com、bar.coma),因为@pm是子串匹配,而非精确匹配
解决方案
方法1:链式规则 + 正则精确匹配Host(推荐)
利用链式规则实现AND逻辑,第二条规则用@rx正则精确匹配多个域名(通过|实现OR):
SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny" SecRule REQUEST_HEADERS:Host "@rx ^(foo\.com|bar\.com)$" "id:10,phase:1"
- 正则中的
^和$确保匹配整个Host头内容,避免子串误匹配 - 链式规则要求两条规则同时满足,完美实现
IP匹配 AND Host匹配任一指定域名的逻辑
方法2:使用@pmFromFile配合精确域名列表
如果域名数量较多,可以将精确域名写入文件(每行一个域名),然后用@pmFromFile结合anchored参数实现精确匹配:
- 创建域名文件
domains.txt:
foo.com bar.com
- 配置链式规则:
SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny" SecRule REQUEST_HEADERS:Host "@pmFromFile domains.txt" "id:10,phase:1,anchored"
anchored参数强制规则匹配整个字符串,实现精确匹配,避免子串误判
方法3:多个Host规则用OR逻辑组合(适合域名极少场景)
如果不想用正则,也可以用OR操作符将多个Host精确匹配规则组合,再和IP规则链式:
SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny" SecRule REQUEST_HEADERS:Host "@eq foo.com" "id:10,phase:1,OR" SecRule REQUEST_HEADERS:Host "@eq bar.com" "id:11,phase:1"
- 这种方式需要为每个域名单独写规则,维护性不如正则或文件配置
验证要点
- 测试
X-Forwarded-For为3.4.5.10且Host为foo.com:应触发拒绝 - 测试
X-Forwarded-For为3.4.5.10且Host为abar.com:不应触发 - 测试
X-Forwarded-For为1.2.3.4且Host为foo.com:不应触发
内容的提问来源于stack exchange,提问作者user2233706
相关产品推荐
相关产品推荐

