3

我正在尝试为 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

谢谢!

4

1 回答 1

1

有效的配置如下:

# Limit the requests count by unit of time.
SecRuleEngine On

<LocationMatch "^.*/my-resource/.*">
  SecAction initcol:resource=%{REQUEST_URI},pass,nolog,id:132
  SecRule RESOURCE:COUNTER "@ge 10" "phase:3,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:232"
  SecAction "phase:2,setvar:resource.counter=+1,pass,nolog,id:332"
  SecAction "phase:2,deprecatevar:resource.counter=10/60,pass,nolog,id:432"
  Header always set Retry-After "60" env=RATELIMITED
</LocationMatch>

ErrorDocument 429 "Too Many Requests"

ndlr:将集合名称从“uri”更改为“resource”并稍微调整相位

然后它按预期工作(参见 modsecurity 邮件列表:https ://sourceforge.net/p/mod-security/mailman/message/35889575/ )

于 2017-06-12T08:42:26.140 回答