使用 Symfony 安装保持 ModSecurity 启用 W/Cpanel & WHM

Keep ModSecurity Enabled With Symfony installation W/Cpanel & WHM

这个问题是这里另一个问题的延伸(),请阅读我在那里的回答,看看我是如何解决这个问题的。

我能够解决我遇到的 406 错误问题,但代价是……我不得不禁用 WHM 中的 mod 安全性,我敢肯定这是一个巨大的安全漏洞。我的问题是如何保持 mod 安全启用并仍然使用默认的 Symfony 安装,这样我就不会再收到 406 错误?

编辑

Mod 安全日志

请求:GET/操作描述:访问被拒绝,代码为 406(第 4 阶段)。理由:模式匹配“^5\d{2}$”在RESPONSE_STATUS

背景

ModSecurity 是一个 Web 应用程序防火墙(或 WAF)。您可以定义规则来尝试识别和阻止非法请求。虽然 WAF 并不完美,并且通常使用适用于 "most sites" 的通用规则,但有时会阻止合法请求(称为误报)。

首先要了解的是,除了您之外,没有人会知道您安装了哪些 ModSecurity 规则。 ModSecurity 根本不附带任何规则,但可以从免费规则(如 OWASP CRS) to paid for ones from the likes of Atomic)下载规则,或者您可以编写自己的规则。因此,首先要向您解释的是,没有人能够告诉您如何解决此问题,因为它可能因您的安装而异。说我们可以指导您找到自己的解决方案。

运行 WAF 确实提供了额外的保护,但确实需要大量维护。虽然我个人喜欢它并且可以看到它的优点,但说实话,大多数网站都没有它,而且如果你保持软件最新并且不安装软件,黑客很少(虽然不是闻所未闻)无论如何都会这样做高目标(例如 WordPress)。是否保留它取决于您的网站的重要性和安全意识,但如果确实要使用它,那么您将需要了解它是如何处理此类问题的。

你的问题。

我不熟悉 Symfony,但据我所知,当 ModSecurity 打开时,您的应用程序失败并且至少触发了一个 ModSecurity 规则。当 ModSecurity 关闭时,一切正常。

因此,首先您需要找出 ALL 阻止您的应用程序运行的规则。您给出了一条规则,但我怀疑这不是唯一的一条规则。

正如我在对您的原始问题的评论中所讨论的那样,该规则是大多数规则集中的一个相当标准的规则,旨在防止信息泄露。对于每个请求,所有 Web 服务器都以 3 位数字 status code 响应。最著名的是 404 或 "page not found"。 500 范围内的表示服务器错误。所以这条规则说,如果服务器响应 (RESPONSE_STATUS) 模式匹配“^5\d{2}$”(即 5XX,X 是数字,所以 0-9)那么出现问题,并且 ModSecurity 介入以防止任何错误消息返回给用户,而是发送它自己的 406 错误消息。

ModSecurity 有 5 个阶段:

  1. 扫描请求的规则headers (REQUEST_HEADERS)
  2. 扫描请求的规则body (REQUEST_BODY)
  3. 扫描响应的规则headers (RESPONSE_HEADERS)
  4. 扫描响应的规则body (RESPONSE_BODY)
  5. 影响日志记录 (LOGGING) 的规则

此规则在第 4 阶段触发 - 即请求被发送回客户端时。因此,在这个阶段,您的应用程序返回 5XX 状态已经出了问题。

我怀疑之前触发的另一个 ModSecurity 规则(第 1 阶段或第 2 阶段规则)导致了错误,而您只显示了最后触发的规则。

在我进一步帮助您解决问题之前,我需要知道:

  • ALL 来自 Apache 错误日志的 ModSecurity 错误消息。
  • 此外,了解您的 ModSecurity 版本会很有帮助运行(这应该在启动时的 Apache 错误日志中)。
  • 了解您的规则集也会很有帮助 运行。它们是上面讨论的一些标准的,还是专门为您的站点编写的?大多数规则都有一个规则 ID(事实上,从 ModSecurity 2.7 开始这是强制性的)很惊讶这没有列在您之前提供的错误日志片段中。

有了这些,我或其他人也许可以帮助您指明正确的方向。

你怎么能self-diagnose这个问题(以及以后的问题!)

如果我是你,我会采取以下步骤来确定问题:

  1. 阅读您所有的 Apache 配置文件并找出 ModSecurity 配置和规则的定义位置。 ModSecurity 规则只是使用添加到标准 Apache 配置的 ModSecurity 语言的文本配置——通常通过包含外部文件来定义规则。了解这些规则的作用和含义。
  2. 在您的配置中找到 "SecRuleEngine On" 行并将其更改为 "SecRuleEngine DetectionOnly" 然后重新启动 Apache。这将在日志文件中标记规则,但不会阻止尝试。然后做你想做的事,不要接受触发的规则。
  3. 同时打开额外的审核引擎以捕获阻止 ("SecAuditEngine RelevantOnly") 的请求的完整详细信息。
  4. 确定您是否需要那些导致问题的规则,然后将它们从您的配置中注释掉,或者有一些方法可以调整它们以停止阻止合法请求。
  5. 一旦所有规则生效调整,然后再次打开 ModSecurity。

ModSecurity Reference Manual 是了解 ModSecurity 非常有用的资源。

我还可以推荐 the ModSecurity handbook 进一步阅读。它是由 ModSecurity 的原作者编写的,虽然自 2.7 版以来没有更新,但它仍然是一个很好的介绍。

希望对您有所帮助, 巴里