根据这个建议,我对我的配置进行了一些更改:
SecAction \
"id:901321,\
phase:1,\
pass,\
t:none,\
nolog,\
initcol:global=global,\
initcol:ip=%{x-forwarded-for}_%{tx.ua_hash},\
setvar:'tx.real_ip=%{x-forwarded-for}'"
但似乎什么也没有发生。我注意到我的 apache error_log 使用默认错误日志格式并将所有内容记录为 127.0.0.1。
所以我把我ErrorLogFormat
的改为:
ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %{X-Forwarded-For}i] %M% ,\ referer\ %{Referer}i"
这让我的日志更好,但 ModSecurity 仍然没有做任何阻塞。奇怪的是,apache error_log 中的大多数 ModSec 日志中都有一个额外的客户端 IP 部分:
[Wed May..2019] [err] [pid X:tid X] [client XXX.XX.XX.XXX] [client 127.0.0.1] ModSecurity: Warning...
我不知道额外[client 127.0.0.1]
的来自哪里 - 我知道它肯定只对 error_log 中的 ModSecurity 日志执行此操作。
似乎 ModSecurity 要么不断尝试阻止 127.0.0.1,要么只是不阻止任何东西..
那么如何让 ModSecurity 使用X-Forwarded-For
标头进行阻止呢?
笔记
- 我确实设置
SecRuleEngine On
正确。 - 版本:Apache 2.4、ModSecurity 2.9、OWASP 3
您的链接建议的第一部分有这个
如您所见,它指定 x-forwarded-for 是 REQUEST_HEADERS 的一部分,但您的版本中缺少该内容。
请注意,仅记录 IP 不会导致阻塞。它用于持久化可在后续规则中使用的数据(例如,针对 IP 记录计数器并在每个请求中对其进行迭代,然后在超出基本 DoS 保护的特定限制时阻止)。因此,请确保您已经配置了一些规则来使用该 IP 地址执行某些操作!
此外,正如评论中所讨论的,ModSecurity 将集合记录在基于磁盘的文件中。当许多 Apache 进程尝试同时访问它时,这会导致争用。ModSecurity 所做的清理工作也可能会失败,这意味着文件会不断增长,直到耗尽所有磁盘空间或让 Apache 慢下来。我不喜欢使用它们,尤其是在有卷的网站上。我将它们视为 ModSecurity 可以将其基于单一请求规则的引擎扩展到交叉请求引擎的概念证明,但恕我直言,它不是生产就绪的。有关这方面的更多信息,请参见此处:https ://sourceforge.net/p/mod-security/mailman/message/34393121/
双 client_ip 日志记录是 ModSecurity 过去使用非标准日志记录方式的残余。他们转向了 Apache 原生日志记录(它有更多的特性——比如像 x-forwarded-for 一样记录 HTTP 标头的能力),但只是注意到了双 client_ip(因为 Apache 常设日志记录模块和 ModSecurity 现在都在记录这个)。他们原样离开是为了避免破坏任何依赖原始 client_ip 日志记录的人。有关更多详细信息,请参见此处:https ://github.com/SpiderLabs/ModSecurity/pull/840