【问题标题】:Keep ModSecurity Enabled With Symfony installation W/Cpanel & WHM使用 Symfony 安装 W/Cpanel 和 WHM 保持 ModSecurity 启用
【发布时间】:2015-12-27 06:01:14
【问题描述】:

此问题是此处 (Symfony framework install 406 Not Acceptable Error w/CPanel & WHM) 的另一个问题的扩展,请阅读我的回答以了解我如何解决此问题。

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

编辑

ModSecurity 日志

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

【问题讨论】:

  • 什么是导致 Apache 错误日志中显示的阻塞的 ModSecurity 规则?
  • 我不完全确定,但是当我查看 modSecurity 日志时,最近的日志这样说,请求:GET / 操作描述:访问被拒绝,代码 406(阶段 4)。理由:模式匹配“^5\\d{2}$”在 RESPONSE_STATUS。
  • 我不确定模式匹配是什么意思(除了是正则表达式),但不确定它的目的是什么?
  • 您的应用程序返回 5XX 状态,这通常表示服务器错误。似乎有一个 ModSecurity 规则来防止这些错误一直返回到客户端。这通常是因为服务器错误可能包含对黑客有用的信息(例如堆栈跟踪和/或数据库错误代码)。所以问题不应该是“为什么 ModSecurity 阻止这个请求?”但是“为什么我的请求返回 5xx 状态?”
  • 我也没有否决你的问题,但可以理解为什么它被否决,因为:1)它是前一个问题的延续(并且需要阅读才能完全理解它)而问题应该包含所有回答它们所需的信息,2)它与编程无关,但服务器管理和 stackoverflow 用于编程(serverfault.com 是 SA 的姊妹站点,但仅适用于专业 SA),以及 3)因为很明显你不完全了解您的基础架构或问题,因此问题含糊不清,必须从您那里获取信息。

标签: php symfony installation cpanel mod-security


【解决方案1】:

背景

ModSecurity 是一个 Web 应用防火墙(或 WAF)。您可以定义规则以尝试识别和阻止非法请求。虽然 WAF 并不完美,但通常会使用在“大多数网站”中有效的通用规则,但有时确实会阻止合法请求(称为误报)。

首先要了解的是,除了你之外,没有人会知道你安装了哪些 ModSecurity 规则。 ModSecurity 根本不附带任何规则,尽管有可供下载的规则,从免费规则(如 OWASP CRS)到付费规则(如 Atomic),或者您可以编写自己的规则。因此,首先要向您解释的是,没有人能够告诉您如何解决这个问题,因为它可能是特定于您的,具体取决于您的安装。表示我们可以指导您找到自己的解决方案。

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

您的问题。

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

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

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

ModSecurity 有 5 个阶段:

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

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

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

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

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

这样,我或其他人或许能够帮助您指明正确的方向。

如何自我诊断这个问题(以及未来的问题!)

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

  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 版以来没有更新,但它仍然是一个很棒的介绍。

希望对您有所帮助, 巴里

【讨论】:

  • 感谢您写下这一切并向我解释,我没有很好地理解它是如何工作的。我将努力获取完整的日志信息以及做一些关于 ModSecurity 的其他测试,看看如果我确定我什至需要激活它,我是否无法让网站使用它。将尽快将信息发回此处。
  • 好的,所以你是对的,406 错误是由 500 错误引起的,因为文件的权限不正确。在我的情况下,从 root 更改为实际用户。一旦我修复了权限,406 错误就消失了。所以我还有更多关于 ModSecurity 的阅读要做,但是你所说的拦截响应(也许调试内容的错误消息不会显示例如)就是发生的事情。因此,它没有显示 500 错误和一些位置路径,而是显示了 406。回想起来非常有趣的功能。我还有更多需要学习,感谢您提供的所有信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多