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 并监控任何误报或遗漏的漏洞。持续的测试和调整是维持强大安全设置的关键。