mod_security X-Forwarded-未被阻止

mod_security X-Forwarded-未被阻止

我根据以下配置做了一些更改这个建议

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


笔记

  1. SecRuleEngine On正确设置。
  2. 版本: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

相关内容