我正在尝试为 Apache 配置 modsecurity 以限制每单位时间可以访问给定资源的命中次数(比如说,每个资源每分钟 10 次命中,无论请求哪个 IP 地址)。资源具有“ https://myhost/my-resource/my-resource-id ”形式的 url 模式
# Limit the requests count by unit of time.
SecRuleEngine On
<LocationMatch "^.*/my-resource/.*">
# SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog,id:132
SecAction initcol:uri=%{REQUEST_URI},pass,nolog,id:232
SecAction "phase:5,deprecatevar:uri.counter=10/60,pass,nolog,id:332"
SecRule URI:COUNTER "@ge 10" "phase:2,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:432"
SecAction "phase:2,pass,setvar:uri.counter=+1,nolog,id:532"
Header always set Retry-After "60" env=RATELIMITED
</LocationMatch>
ErrorDocument 429 "Too Many Requests"
据我了解这个片段,它告诉 modsecurity“为每个 request_uri 创建一个名为 uri 的变量,并为每个 request_uri 关联一个计数器,然后每 60 秒将其递减 10。如果当前的 uri 计数器达到 10 的值,则失败并显示错误代码429,否则增加它”这是我需要的。
此配置导致“未找到 uri 变量”错误,我不明白为什么。
如果我取消注释第一个 SecAction 并更改剩余配置以引用它,它可以工作(在 10 次快速调用后返回 429),但显然没有考虑 uri(它对任何资源都失败,例如 /my-resource/ 123 和 /my-resource/456)
有人可以提供一些帮助吗?我所有的尝试都惨遭失败,而且我对 Apache 的配置不是很熟悉,所以我想我在这里遗漏了一些重要的概念。
PS:Apache是v2.4,mod-security是v2.9
谢谢!