我根据以下配置做了一些更改这个建议:
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 仍然没有进行任何阻止。奇怪的是,大多数 ModSec 日志在apache error_log 中有一个额外的客户端 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
答案1
您的链接建议的第一部分是这样的
SecAction "phase:1,nolog,pass,initcol:IP=%{REQUEST_HEADERS.x-forwarded-for}"
如您所见,它指定 x-forwarded-for 是 REQUEST_HEADERS 的一部分,但是您的版本中缺少该部分。
请注意,仅记录 IP 不会导致阻塞。它用于保存可在后续规则中使用的数据(例如,记录针对 IP 的计数器并在每个请求中迭代它,然后如果它超过基本 DoS 保护的某个限制,则进行阻塞)。因此,请确保您已配置一些规则来对该 IP 地址执行某些操作!
此外,正如评论中所讨论的,ModSecurity 将集合记录在基于磁盘的文件中。当许多 Apache 进程尝试同时访问它时,这会导致争用。而且 ModSecurity 所做的清理也可能失败,这意味着文件会不断增长,直到它占用所有磁盘空间或使 Apache 变得缓慢。我不喜欢使用它们,尤其是在具有卷的网站上。我将它们视为 ModSecurity 可以将其基于单个请求规则的引擎扩展为跨请求引擎的概念证明,但在我看来它还没有准备好投入生产。有关更多信息,请参见此处:https://sourceforge.net/p/mod-security/mailman/message/34393121/
双客户端 IP 日志记录是 ModSecurity 过去使用非标准日志记录方式的遗留问题。他们转向 Apache 原生日志记录(它具有更多功能 - 例如能够记录 HTTP 标头,如 x-forwarded-for),但后来才注意到双客户端 IP(因为 Apache 常备日志记录模块和 ModSecurity 现在都在记录这一点)。他们保持原样,以避免破坏任何依赖原始客户端 IP 日志记录的人。有关更多详细信息,请参见此处:https://github.com/SpiderLabs/ModSecurity/pull/840