网站被刷评论、被扫后台、被注入攻击,是每个站长迟早会遇到的问题。光靠程序自身的过滤往往不够,这时就需要在服务器前面加一道”防火墙闸门”。本文教你如何完成 ModSecurity WAF 配置,从安装、加载核心规则集,到用检测模式验证、处理误报,最后正式开启拦截,每一步都给出可直接执行的命令和判断标准,帮助你把网站防护真正落地。
在动手之前,先理清三个容易混淆的概念。ModSecurity 是 WAF(Web Application Firewall,Web 应用防火墙)引擎本身,负责解析 HTTP 请求并执行规则;OWASP CRS(开源核心规则集)是一套社区维护的通用规则,定义了”什么样的请求是可疑的”;而 Apache 或 Nginx 则是承载 ModSecurity 运行的 Web 服务器。三者是”引擎 + 规则 + 宿主”的关系,配置工作也围绕这三层展开:先在宿主服务器上装好引擎,再挂载规则集,最后调整模式与例外,让防护既拦得住攻击,又不误伤正常访客。

整体部署主线可以拆成五个阶段:确认服务器环境并安装 ModSecurity 模块;启用推荐配置并加载 OWASP CRS;以检测模式(下文详述)观察日志确认规则命中;针对误报添加白名单例外;最后切换为拦截模式并持续监控。接下来的章节按这条主线逐段展开,每个阶段都有验证方法,确保你做一步就能确认一步,避免出现”配置完却不知道有没有生效”的情况。
第一步:确认环境并安装 ModSecurity
ModSecurity 配置的第一步,是确认你的服务器类型和版本,因为安装方式差别很大。以最常见的 Ubuntu 22.04 + Apache 环境为例,整个安装只需要两条命令:
sudo apt update
sudo apt install libapache2-mod-security2
sudo systemctl restart apache2
安装完成后,用 apachectl -M | grep security2 验证模块是否加载,看到 security2_module (shared) 就说明引擎已就位。如果用的是 Nginx,官方未提供预编译模块,需要用 --add-module 参数重新编译,或在 cPanel/宝塔这类面板中直接用内置开关启用。这里建议普通站长优先选择虚拟主机或托管型方案,让服务商在服务器层面预装并维护 WAF,省去自行编译维护的成本;只有使用 VPS(Virtual Private Server,虚拟专用服务器)并有完整 root 权限的场景,才需要按上面的命令手动部署,相关方案可以参考 VPS 主机产品页和SSH 安全与防火墙加固指南。
版本方面需要注意:v3 分支在部分老规则上与 2.x 行为不同,2026 年新部署时,Apache 默认仓库的 2.9.x 仍是兼容性最好的选择,生产环境不建议盲目追新。
第二步:启用推荐配置并加载 OWASP CRS
安装完成后,ModSecurity 默认处于关闭状态,需要手动启用并把规则集挂载上去。先把官方推荐配置复制为生效文件:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
打开 modsecurity.conf,找到 SecRuleEngine 指令,它有三个可选值,直接决定防火墙的行为方式:
On:拦截模式,命中规则的请求会被直接阻断,配置初期不建议使用DetectionOnly:检测模式,只记录日志不拦截,首次部署必须从这里开始Off:完全关闭
首次配置时把它设为 DetectionOnly,这一步是整个 ModSecurity WAF 配置流程中最容易出错也最关键的一环:跳过检测模式直接上拦截,一旦规则和业务冲突,正常用户会被误杀,轻则丢订单,重则整站不可访问。
接着安装 OWASP CRS 规则集。以 4.x 版本为例:
cd /usr/share && sudo git clone https://github.com/coreruleset/coreruleset.git
cd coreruleset && sudo cp crs-setup.conf.example crs-setup.conf
然后在 Apache 的安全配置中(通常是 /etc/apache2/mods-enabled/security2.conf)确认有这两行,把规则集挂载进引擎:
IncludeOptional /usr/share/coreruleset/crs-setup.conf
IncludeOptional /usr/share/coreruleset/rules/*.conf
重启 Apache 后,规则集就真正挂载成功了。判断是否生效有一个简单办法:向网站发送一个明显恶意的探测请求,比如访问 https://你的域名/?id=1%20OR%201=1(这是典型的 SQL 注入(Structured Query Language Injection,结构化查询语言注入)测试语句),然后查看审计日志 /var/log/apache2/modsec_audit.log,如果里面出现了 modsecurity 的告警记录并带有类似 [id "942100"] 的规则编号,说明 CRS 已经在工作——只是目前还只是记录,没有拦截。
第三步:处理误报,再切换为拦截模式
检测模式跑起来之后,观察 3 到 7 天的日志就能回答一个关键问题:你的正常业务会不会触发规则。误报的典型表现是,管理员在后台保存一篇含代码的文章、客户提交一个带特殊字符的表单,日志里却出现了 942 开头(SQL 注入类)或 930 开头(本地文件包含类)的告警。把它们记下来,下一步就是加白名单例外。
白名单的核心是”只放行具体规则 + 具体参数”,而不是整页关闭检测。比如 WordPress 后台编辑器保存文章触发误报时,标准写法是:
SecRule REQUEST_URI "@beginsWith /wp-admin/post.php" \
"id:1000001,phase:1,pass,nolog,ctl:ruleRemoveTargetById=942100;ARGS:content"
这条规则的含义是:只针对 /wp-admin/post.php 路径的 content 参数,移除 942100 这一条规则的检查目标,其他参数、其他规则仍然正常检测。自定义规则建议统一放在单独文件(如 /etc/modsecurity/crs-exclusions.conf)并使用 1000000 以上的 ID 段,避免与 CRS 内置编号冲突。
观察期结束、误报处理完毕后,把 SecRuleEngine 改为 On 并重启 Apache,防护才真正上线。上线后前两周每天扫一眼日志中的 403 状态码分布,确认没有正常流量被误伤。若某个规则 ID 频繁拦截正常请求,优先怀疑业务特征与规则冲突,而不是急着怀疑攻击。

对照检测日志和拦截结果,能更直观看到这套机制的价值:检测模式下的上百条告警绝大多数来自自动化扫描器,切换为拦截模式后这些请求会被直接挡在 403 页面,到不了应用程序层。对独立服务器用户来说意义更明显——一台服务器跑多个站点,WAF 在入口统一生效,等于给所有网站同时加了闸门。
常见问题与排查思路
实际运维中,下面三类问题占了我见过的 ModSecurity 故障的八成以上,遇到异常时可以按顺序对照排查。
配置后网站直接 500 报错。 多数是规则文件语法错误。先跑 sudo apachectl configtest(Nginx 用 nginx -t),输出 Syntax OK 再继续;报错指向某行的,多半是自定义规则少了引号或逗号,修正后重启 Apache 即可恢复。
日志文件暴涨占满磁盘。 审计日志默认记录完整请求体,流量大的站点一天能写出几个 GB。解决方法是在 modsecurity.conf 里把 SecAuditLogParts 从默认的 ABIJDEFHZ 收窄为 ABIJHZ(去掉请求体和响应体的完整记录),再配合 logrotate 配置按天切割并保留 14 天,磁盘占用可以下降一个数量级。
规则集更新后误报突然增多。 CRS 4.x 引入了 plug-ins 机制和更严格的异常评分(Anomaly Scoring,按累计分值而非单条规则判定攻击)模式,老配置直接升级容易水土不服。升级规则集时不要直接覆盖,先在测试环境跑一遍业务核心流程,确认异常评分阈值(默认入站 5 分、出站 4 分)是否需要按业务调整,再同步到生产。
另外提醒一点:WAF 不是万能的,它挡的是应用层的已知攻击模式。暴力破解登录、弱密码、插件漏洞这些问题的最终防线仍然是及时更新和强密码策略,如果你在用 WordPress 主机,建议同时开启服务商提供的登录保护功能,两层配合才稳妥。

总结与行动建议
ModSecurity WAF 配置的要点可以压缩成四句话:装好引擎并确认模块加载;用检测模式加规则集观察至少 3 天;按”具体路径 + 具体参数 + 具体规则 ID”加白名单;确认无误报后再切拦截模式。每一步都有明确验证方法,不存在凭感觉的环节。
如果你需要进一步简化运维,可以考虑把 WAF 和日常安全巡检交给托管方案处理——例如 Hostease 的虚拟主机方案在服务器层面默认集成了 Web 应用防火墙,站长无需自行维护规则集更新和误报调优,可以把精力集中在业务本身。建议本周就按本文步骤在测试环境完整走一遍流程,先用一个不重要的子域名练手,确认检测日志符合预期后再推广到生产站点;部署中遇到具体问题,可以在服务器运维文章分类里查找对应的排查教程。防护这件事,动手做一次比读十篇教程都管用。