如何在 Debian 12 或 11 上使用 Apache 安装 ModSecurity 2

ModSecurity 2 是一款必不可少的 Web 应用程序防火墙 (WAF),用于保护 Apache HTTP 服务器,提供实时监控和基于规则的过滤。安装在 Debian 12 或 11 Linux 服务器上,ModSecurity 有助于防止 SQL 注入、跨站点脚本 (XSS) 和其他攻击。Digitalwave ModSecurity 存储库简化了安装,确保您使用的是最新稳定版本。

为了增强安全性,OWASP 核心规则集 (CRS) 提供了针对常见漏洞的预配置规则。设置它允许管理员以最少的手动配置来增强防御。本指南将向您展示如何使用 Digitalwave 存储库在 Debian 上安装 ModSecurity 2 并配置 OWASP CRS 以获得最佳保护。

更新 Debian 系统软件包以安装 ModSecurity 2

我们的第一步是确保我们的 Debian 系统已更新。这样做可以使所有现有软件包保持最新,确保最佳性能,并最大限度地降低安全风险。通过运行以下命令实现此目的:

sudo apt update && sudo apt upgrade

更新系统后,请检查 Apache 是否已安装。如果没有,请使用以下命令进行安装:

sudo apt install apache2

导入 ModSecurity 模块 PPA

设置所需的存储库

我们列表中的下一个任务是安装 ModSecurity Apache 模块。Debian 默认存储库中提供的版本可能不是最新版本,使用它可能会导致立即出错。相反,我们将导入第三方存储库来安装最新的 Apache ModSecurity 模块。这个由 Digitalwave 维护的第三方存储库以其稳定的二进制文件而闻名。

首先安装一组必要的软件包:

sudo apt install apt-transport-https lsb-release ca-certificates curl -y

然后我们继续导入 ModSecurity 2 Module PPA 存储库 GPG 密钥:

curl -fsSL https://modsecurity.digitalwave.hu/archive.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/digitalwave-modsecurity.gpg > /dev/null

获取 GPG 密钥后,将存储库添加到您的系统:

echo "deb [signed-by=/usr/share/keyrings/digitalwave-modsecurity.gpg] http://modsecurity.digitalwave.hu/debian/ $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/digitalwave-modsecurity.list
echo "deb [signed-by=/usr/share/keyrings/digitalwave-modsecurity.gpg] http://modsecurity.digitalwave.hu/debian/ $(lsb_release -sc)-backports main" | sudo tee -a /etc/apt/sources.list.d/digitalwave-modsecurity.list

优先考虑新的 Apache 模块 PPA 存储库

有了存储库后,现在需要调整 APT 策略,以便为与 ModSecurity 相关的特定软件包优先考虑此存储库。以下命令可实现此目的:

cat << EOF | sudo tee -a /etc/apt/preferences.d/99modsecurity
Package: *nginx*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900

Package: *libapache2-mod-security2*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900

Package: *modsecurity-crs*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900

Package: *libmodsecurity*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900
EOF

接下来,运行 APT 更新以反映新导入的源:

sudo apt update

此外,为了确认偏好,您可以通过以下方式确认此政策变更:

sudo apt-cache policy libapache2-mod-security2 modsecurity-crs libmodsecurity3

安装 ModSecurity 2 模块

现在存储库已准备就绪,继续安装 libapache2-mod-security2 模块:

sudo apt install libapache2-mod-security2

安装后,必须启用该模块。使用以下命令来实现这一点:

sudo a2enmod security2

重新启动 Apache 服务

最后,我们重新启动 Apache 服务以确保所有更改生效,并且新添加的 ModSecurity 模块正确集成:

sudo nano /etc/apache2/mods-enabled/security2.conf

在 Apache HTTP 上启用 ModSecurity 2 模块

访问 ModSecurity 配置文件

Apache ModSecurity 的配置文件位于 /etc/apache2/mods-enabled/security2.conf。使用 nano 文本编辑器(或您喜欢的文本编辑器)通过以下命令访问此文件:

sudo nano /etc/apache2/mods-enabled/security2.conf

查找以下行:

IncludeOptional /etc/modsecurity/*.conf

确保此行未注释,因为它包含 /etc/modsecurity 目录中的其他必要配置文件。默认情况下,它应该被取消注释。

修改 ModSecurity 2 配置

我们需要将 modsecurity.conf-recommended 配置文件重命名为 modsecurity.conf 以使其生效。可以使用以下命令完成此操作:

sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

现在,让我们打开这个新命名的配置文件:

sudo nano /etc/modsecurity/modsecurity.conf

在此文件中,ModSecurity 规则引擎默认设置为 DetectionOnly。这意味着它将识别并记录潜在的恶意行为,但不阻止它。要更改此设置并启用 ModSecurity 的阻止功能,请找到 SecRuleEngine 行(第 7 行左右),并将 DetectionOnly 替换为 On。

从:

SecRuleEngine DetectionOnly

到:

SecRuleEngine On

调整 Apache 的日志设置

在配置文件中继续往下,你会发现 SecAuditLogParts 行(大约 224 行)。此行的默认设置不太正确;需要进行调整才能准确记录所有事务信息。

改变:

SecAuditLogParts ABDEFHIJZ

到:

SecAuditLogParts ABCEFHJKZ

完成这些修改后,保存更改并退出编辑器。

重新启动 Apache 以应用更改

此过程的最后一步是重新启动 Apache 服务,以便我们对 ModSecurity 配置的更改生效。使用以下命令完成此操作:

sudo systemctl restart apache2

为 ModSecurity2 安装 OWASP 核心规则集

仅使用 ModSecurity 无法保护您的 Web 服务器。它需要一套规则来识别潜在威胁并阻止恶意活动。OWASP(开放式 Web 应用程序安全项目)核心规则集 (CRS) 是一套备受推崇的规则集,被各种 Web 服务器和 Web 应用程序防火墙 (WAF) 使用。部署此规则集可为您的服务器提供强大的保护,以抵御互联网上出现的一系列威胁。

在继续之前,必须通过访问以下网址来验证您是否拥有最新版本的 OWASP CRS: OWASP 发布标签页。此步骤可确保您为服务器下载并安装最新的安全措施。

为 OWASP CRS 创建父目录

首先,让我们使用 mkdir 命令为 OWASP 创建主要父目录:

sudo mkdir /etc/apache2/modsec/

在 Debian 上下载 OWASP CRS 档案

接下来,我们将使用 wget 命令获取 OWASP CRS 3.3.4 存档,这是撰写本文时的稳定版本。请记住,您应该使用前面提到的链接验证版本。

wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.4.zip

夜间版本可能提供更先进的安全措施,但由于其开发状态,可能会引发问题。对于新用户,建议使用稳定版本以避免潜在的问题。

注意:您应该不断检查更新;稳定的规则不会每周更改,而是每季度更改一次,除非需要紧急更新。

提取档案

下载档案后,我们可以将其解压到我们之前创建的目录中:

sudo tar xvf v3.3.4.tar.gz -C /etc/apache2/modsec

请记住根据您下载的 OWASP CRS 版本更改命令。

配置规则集

OWASP CRS 有一个示例配置文件,您应该重命名它,同时保留原始文件作为备份。您可以使用“cp 命令”执行此操作:

sudo cp /etc/apache2/modsec/coreruleset-3.3.4/crs-setup.conf.example /etc/apache2/modsec/coreruleset-3.3.4/crs-setup.conf

注意:请记住将 /coreruleset-3.3.4/ 替换为您选择的 OWASP CRS 的确切版本。

启用规则

要激活规则,请打开 /etc/apache2/mods-enabled/security2.conf 文件:

sudo apt install unzip -y

然后插入以下两行:

Include /etc/apache2/modsec/coreruleset-3.3.4/crs-setup.conf
Include /etc/apache2/modsec/coreruleset-3.3.4/rules/*.conf

注意:再次确保将 /coreruleset-3.3.4/ 替换为您选择的 OWASP CRS 的确切版本,因为您下载的核心规则集很可能比指南的示例更新。

此外,注释掉或删除以下行:

IncludeOptional /usr/share/modsecurity-crs/*.load

完成后,保存并退出文件:

重新启动 Apache 以应用更改

最后一步是重新启动 Apache 服务以确保更改生效:

sudo systemctl restart apache2

开始使用 OWASP 核心规则集和 ModSecurity 2

OWASP 核心规则集 (CRS) 是一款综合性工具,具有众多可自定义选项。其默认配置可为大多数服务器提供即时安全增强功能,而不会影响真正的访问者或搜索引擎优化 (SEO) 机器人。我们将在本节中讨论 CRS 的一些重要方面,但探索配置文件以全面了解所有可用选项始终是有益的。

调整 CRS 配置

我们首先打开 crs-setup.conf 文件,其中可以更改大多数 CRS 设置:

sudo nano /etc/apache2/modsec/coreruleset-3.3.4/crs-setup.conf

了解 CRS 评分系统

ModSecurity 以两种不同的模式运行:

  • 异常评分模式:建议大多数用户使用,此模式在每次规则匹配时分配一个“异常分数”。处理入站和出站规则后,检查异常分数,并在必要时触发破坏性操作。此操作通常以 403 错误的形式出现。此模式提供准确的日志信息,并在设置阻止策略方面提供更大的灵活性。
  • 自包含模式:在此模式下,只要匹配规则,就会立即应用操作。虽然它可以减少资源使用量,但灵活性较差,并且产生的审计日志信息量较少。当满足第一条规则并执行指定的操作时,规则匹配过程将停止。

了解偏执程度

OWASP CRS 定义了四个偏执等级:

  • 偏执等级1:默认级别适合大多数用户。
  • 偏执狂等级 2:适合高级用户。
  • 偏执狂等级 3:适合专家用户。
  • 偏执等级4:仅在特殊情况下建议。

更高的偏执级别可以启用更多规则,提高安全性,并增加因误报而阻止合法流量的可能性。选择符合您的专业知识和安全需求的偏执级别至关重要。

在您的服务器上测试 OWASP CRS

为了确保 OWASP CRS 在您的服务器上正常运行,请使用您的互联网浏览器访问以下 URL。请记住将“yourdomain.com”替换为您的实际域名:

https://www.yourdomain.com/index.html?exec=/bin/bash

如果您收到 403 Forbidden 错误,OWASP CRS 将按预期运行。如果没有,则设置过程中可能存在需要您注意的失误;最常见的问题可能是忘记将 DetectionOnly 更改为 On 或类似内容。

解决误报和自定义排除规则

使用 ModSecurity 和 OWASP 核心规则集 (CRS) 管理误报可能是一项持续性任务。但是,这些系统针对各种威胁提供的强大防御能力使得这项工作必不可少。为了在最初将误报降至最低,建议将警惕程度设得较低。

通过以较低的偏执级别运行规则集数周甚至数月,您可以降低大量误报的可能性。这种方法让您有时间熟悉警报和适当的响应,然后再逐渐提高偏执级别以实现更严格的安全性。

使用 OWASP、ModSecurity 2 管理 Debian 上已知应用程序中的误报

ModSecurity 具有将某些可能无意中触发误报的操作列入白名单的功能。例如:

#SecAction \
# "id:900130,\
#  phase:1,\
#  nolog,\
#  pass,\
#  t:none,\
#  setvar:tx.crs_exclusions_cpanel=1,\
#  setvar:tx.crs_exclusions_dokuwiki=1,\
#  setvar:tx.crs_exclusions_drupal=1,\
#  setvar:tx.crs_exclusions_nextcloud=1,\
#  setvar:tx.crs_exclusions_phpbb=1,\
#  setvar:tx.crs_exclusions_phpmyadmin=1,\
#  setvar:tx.crs_exclusions_wordpress=1,\
#  setvar:tx.crs_exclusions_xenforo=1"

要对 WordPress、phpBB 和 phpMyAdmin 等应用程序实施白名单,请取消注释相应行并保留 (1) 值。要防止将未使用的服务列入白名单,请将值调整为 (0)。

更新后的配置如下:

SecAction \
 "id:900130,\
  phase:1,\
  nolog,\
  pass,\
  t:none,\
  setvar:tx.crs_exclusions_phpbb=1,\
  setvar:tx.crs_exclusions_phpmyadmin=1,\
  setvar:tx.crs_exclusions_wordpress=1"

在这种情况下,多余的选项已被删除,只留下您所需配置的正确语法。

在 CRS 实施前创建规则排除

要创建自定义排除,首先使用以下命令重命名“REQUEST-900-EXCLUSION-RULES-BEFORE-CRS-SAMPLE.conf”文件:

sudo cp /etc/apache2/modsec/coreruleset-3.3.4/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /etc/apache2/modsec/coreruleset-3.3.4/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

请记住,每个排除规则必须有一个唯一的“idnumber”,以避免 Apache2 服务测试期间出现错误。

例如,某些“REQUEST_URI”可能会导致误报。以下示例说明了涉及 Google PageSpeed 信标和 WordPress 的 WPMU DEV 插件的两个此类案例:

SecRule REQUEST_URI "@beginsWith /wp-load.php?wpmudev" "id:1544,phase:1,log,allow,ctl:ruleEngine=off"

SecRule REQUEST_URI "@beginsWith /ngx_pagespeed_beacon" "id:1554,phase:1,log,allow,ctl:ruleEngine=off"

这些规则自动允许以指定路径开头的任何 URL。

您还可以将特定 IP 地址列入白名单:

SecRule REMOTE_ADDR "^195\.151\.128\.96" "id:1004,phase:1,nolog,allow,ctl:ruleEngine=off"

SecRule REMOTE_ADDR "@ipMatch 127.0.0.1/8, 195.151.0.0/24, 196.159.11.13" "phase:1,id:1313413,allow,ctl:ruleEngine=off"

在第一条规则中,单个 IP 地址被列入白名单,而第二条规则使用“@ipMatch”指令进行更广泛的子网匹配。要阻止子网或 IP 地址,只需将“allow”替换为“deny”。这种灵活性允许您创建详细的黑名单和白名单,这些名单可以与 Fail2Ban 集成以增强安全策略。

使用 OWASP、ModSecurity 2 禁用 Debian 上的特定规则

除了将整个路径列入白名单之外,另一种方法是禁用导致持续误报的特定规则。虽然这种方法需要更多测试,但它具有长期效益。

例如,如果“/admin/”区域中的规则 941000 和 942999 为您的团队触发了误报,您可以在 ModSecurity 日志中找到规则 ID,并使用“RemoveByID”命令仅禁用那些特定的 ID:

SecRule REQUEST_FILENAME "@beginsWith /admin" "id:1004,phase:1,pass,nolog,ctl:ruleRemoveById=941000-942999"

监控日志并识别模式

使用 Apache、ModSecurity 和 OWASP 处理误报时,持续的日志监控至关重要。它有助于识别触发误报的模式,让您可以创建自定义规则来解决这些问题。

例如,如果特定规则持续导致误报,您可以制定排除规则来处理这些特定情况。这种量身定制的方法可确保更有效地管理误报。

通过定期检查日志并调整规则,您可以为您的应用程序维护更安全、更高效的环境。

ModSecurity 2 的日志轮换

由于网络事务的动态特性,ModSecurity 日志会快速增长,因此有效的日志管理至关重要。日志轮换是管理这些日志的有用工具,尽管默认情况下 ModSecurity 并未配置它。本节将指导您为 ModSecurity 设置日志轮换。

创建 ModSecurity 轮换文件

首先,您需要为 ModSecurity 日志轮换创建一个专用文件。为此,使用以下命令创建并打开一个名为 modsec 的新文件:

sudo nano /etc/logrotate.d/modsec

配置轮换文件

在新创建的ModSecurity(modsec)配置文件中,添加以下内容:

/var/log/modsec_audit.log
{
        rotate 31
        daily
        missingok
        compress
        delaycompress
        notifempty
}

此配置会保留日志 31 天,但您可以根据需要修改该天数。例如,将其更改为“轮换 7”将保留一周的日志。

“daily”指令确保每天轮换日志,而“compress”通过压缩旧日志来节省空间。“delaycompress”选项将压缩延迟到第二个轮换周期,而“missingok”可在日志文件不存在时防止错误。此外,“notifempty”确保不会轮换空日志文件。

提示:建议每日进行日志轮换,以避免处理过大的日志文件,这会使分析更加耗时。

结论

现在,您已使用 Digitalwave 存储库在 Debian 12 或 11 服务器上安装了 ModSecurity 2,并配置了 OWASP 核心规则集。有了这些工具,您的服务器就可以阻止许多常见的 Web 应用程序威胁。

记得定期更新 CRS 并监控任何误报或遗漏的漏洞。持续的测试和调整是维持强大安全设置的关键。

Joshua James
跟我来
Joshua James 的最新帖子 (查看全部)

发表评论