我试图设置请求限制某些敏感的URI在apache(v2.2)虚拟主机与mod_security ,但find使用LocationMatch麻烦。 到目前为止,configuration如下:
<VirtualHost *:80> ServerName www.example.com RewriteEngine On DocumentRoot "/var/www/html/www.example.com" <Directory "/var/www/html/www.example.com"> Options None AllowOverride None Order allow,deny Allow from all </Directory> SecRuleEngine On # ignore requests from localhost or some other IP SecRule REMOTE_ADDR "^127\.0\.0\.2$" "phase:1,id:'1',nolog,allow" <LocationMatch "^\/RESTv2\/auth\..+"> SecRule REQUEST_FILENAME ".*" "phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests.auth=+1,id:'3',expirevar:ip.requests.auth=1" SecRule ip:requests.auth "@gt 2" "phase:1,pass,log,logdata:'blocking auth %{REMOTE_ADDR} req/sec: %{ip.requests}',setvar:ip.block.auth=1,expirevar:ip.block.auth=5,id:'4'" SecRule ip:block.auth "@eq 1" "phase:1,deny,id:'999',nolog,logdata:'blocking RESTv2/auth.json for %{REMOTE_ADDR} req/sec: %{ip.requests.auth}', status:509" </LocationMatch> ErrorDocument 509 "Special Rate Limit Exceeded!" </VirtualHost>
问题在于, LocationMatch指令永远不会匹配,即使我把它简化为一般的.* 。 我也尝试过在正则expression式中使用和不使用/字符的转义,没有任何行为上的差异。
如果我注释掉打开和closures的标签,那么限制规则就会像预期的那样工作,只不过它们在LocationMatch标签内部不会启动。 /RESTv2/auth.json文件存在于DocumentRoot目录中,并且正常运行。
我正在调用curl http://www.example.com/RESTv2/auth.json请求curl http://www.example.com/RESTv2/auth.json 。
这是使用LocationMatch的问题,还是在它和mod_security规则之间有一些奇怪的交互?
在LocationMatch指令之前处理ModSecurity阶段1规则。
因此,您需要将它们更改为阶段2规则(这可能不合意,因为将浪费时间处理所有阶段1规则,而不是立即阻止这些规则),或者使用ModSecurity语法和链接规则来replaceLocationMatch语法:
SecRule REQUEST_URI "^\/RESTv2\/auth\..+" phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests.auth=+1,id:'3',expirevar:ip.requests.auth=1,chain” SecRule REQUEST_FILENAME ".*"
和其他规则一样。