Apache2 ModSecurity2

问题描述

我在我的 apache2 生产服务器上托管了一个 nextcloud 应用程序,在该服务器上我使用 modsecurity 进行加固。

由于 modsecurity 会将 Nextcloud 生成的许多请求检测为误报,我想通过“tx.crs_exclusions_nextcloud=1”启用特殊的 modsecurity nextcloud 排除项。 由于我在此服务器上托管多个虚拟主机/子域,而 nextcloud 有自己的一个(并且它不是为每个子域全局执行此类排除的选项),因此我想通过 Apache VirtualHost 配置目录启用此排除:>

<VirtualHost _default_:443>
    ServerName nextcloud.mydomain.tld
    ...
    SecAction "id:x,pass,log,setvar:tx.crs_exclusions_nextcloud=1" #also tried ALL possible combinations of variables (id,nolog,...) etc,please don't assume the issue being here as long as you don't are 100% sure.
    ...
</VirtualHost>

这不起作用。我完全不知道为什么。文档说此命令可用于 VirtualHost 部分并且我检查了包含的配置文件的顺序
订单:

由于 VirtualHost 中的 SecAction 不起作用并且 modsecurity 仍将许多 nextcloud 请求检测为误报,因此我目前使用最后一个文件 002_crs-exclusions.conf 来激活 nextcloud 排除:

Secrule REQUEST_HEADERS:Host ^nextcloud.mydomain.tld$ "id:900130,phase:1,t:none,setvar:tx.crs_exclusions_nextcloud=1"

哪个有效。 我对这个解决方案不满意 - 我想通过 VirtualHost 指令使用它,因为这 应该 工作。

第二期

如果用户尝试更新日历条目,Modsecurity 会阻止请求 URI /remote.PHP/dav/calendars/<user>/personal/<uuid>.ics。这是因为此请求具有标头 Content-Type: application/xml 但没有真正的 xml 内容,这导致 modsecurity 出现 libxml2 解析错误。因此,我想通过 指令排除带有 Content-Type: application/xml 的 URI /remote.PHP/dav/calendars/.* 的规则# 200000(此规则定义标头 SecruleRemoveById-requests 应该通过 modsecurity 的 xml-parser):

<Location ~ "/remote.PHP/dav/calendars/.*">
    Header set LocDebug "works"  #to check if <Location> is applied correctly
    SecruleRemoveById 200000
</Location>

结果:
去往这些 URI 之一的每个请求(日历的加载等)都包含 LocDebug 标头,表明 中的规则已成功应用 - 但如果用户尝试更新日历条目( xml 格式错误的请求),请求仍然失败,HTTP 500 和 modsecurity 报告解析错误 - 此请求没有 LocDebug 标头,导致我假设这些操作和命令的顺序存在一些问题。请求实际上被解析。
我也试过全局设置 SecruleRemoveById,但这个完全不起作用。

我尝试了所有的东西,几乎所有的东西,并且如上面所记录的那样,订单应该没问题。
有没有人知道我可能做错了什么或问题可能出在哪里?我一无所知。


技术信息:

  • 操作系统:Debian 10 Buster - 所有软件包均为最新版本。
  • Apache:apache2.4.38-3+deb10u4
  • ModSecurity:libapache2-mod-security2 v2.9.3-1

解决方法

第一期

您的 SecAction 没有 phase 操作。在这种情况下,mod_security2 将规则/操作置于第二阶段,恕我直言,为时已晚。

关于第二期

我不明白原因,为什么 SecRuleRemoveId 不起作用,它应该起作用。但是您也可以在此处添加 SecAction,并带有 ctl:ruleRemoveById=200000