WAF 配置指南:Web 应用防火墙规则设置与网站安全防护

WAF(Web 应用防火墙)是保护网站免受 Web 攻击的关键安全层。它可以检测和拦截 SQL 注入、XSS 跨站脚本、文件包含、恶意爬虫等常见攻击。本文将详解主流 WAF 的配置方法和推荐规则。

一、WAF 的工作原理

WAF 的位置

用户请求 → CDN → WAF → Web 服务器 → 应用 → 数据库
                    ↓
              拦截恶意请求 ❌
              放行正常请求 ✅

WAF 的检测方式

检测方式 原理 优点 缺点
签名匹配 匹配已知攻击特征 准确率高 无法检测新的攻击
行为分析 分析请求行为模式 可检测未知攻击 误报率高
速率限制 限制单位时间请求数 防御暴力攻击 可能误伤正常用户
IP 信誉 基于 IP 的历史行为 阻止已知恶意 IP 依赖数据源更新

二、Cloudflare WAF 配置

Cloudflare 的免费套餐包含基础 WAF 功能,付费版(Pro/Business/Enterprise)提供更高级的规则引擎。

安全级别设置

Cloudflare Dashboard → Security → Settings:

安全级别:
- Essentially Off:基本关闭(仅拦截最明显的攻击)
- Low:低(拦截常见攻击)
- Medium:中(推荐 ✅)
- High:高(可能误伤正常访问)
- I'm Under Attack:紧急模式(当遭受 DDoS 攻击时开启)

推荐设置:设置为 Medium 级别,如果收到误报报告,再针对特定规则调整为 Off。

WAF 自定义规则

Cloudflare 允许创建自定义 WAF 规则:

# 规则示例 1:拦截已知恶意 IP
表达式:
  (ip.src eq 192.0.2.1) or (ip.src in {203.0.113.0/24})
操作:
  Block

# 规则示例 2:阻止非中国大陆 IP 访问管理后台
表达式:
  (http.request.uri.path contains "/wp-admin") and (ip.geoip.country ne "CN")
操作:
  Block

# 规则示例 3:限制登录尝试频率
表达式:
  (http.request.uri.path eq "/wp-login.php")
操作:
  Rate Limit: 10 requests per 60 seconds

托管规则集

Cloudflare 提供预配置的托管规则集:

规则集 免费版 Pro 版 说明
Cloudflare 托管规则集 ✅ 基础版 ✅ 完整版 OWASP Top 10 防护
Cloudflare OWASP 核心规则集 细粒度规则控制
已知攻击签名规则集 定期更新

三、ModSecurity 配置

ModSecurity 是最流行的开源 WAF 引擎,可以与 Nginx 和 Apache 集成。

Nginx 集成 ModSecurity

# 1. 安装 ModSecurity
apt install libmodsecurity3 nginx-mod-modsecurity -y

# 2. 启用 ModSecurity 模块
cat > /etc/nginx/modsecurity/modsecurity.conf << 'EOF'
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/json
EOF

# 3. 下载 OWASP CRS(核心规则集)
git clone https://github.com/coreruleset/coreruleset /etc/nginx/modsecurity/crs/
cp /etc/nginx/modsecurity/crs/crs-setup.conf.example /etc/nginx/modsecurity/crs/crs-setup.conf

# 4. Nginx 配置中启用 ModSecurity
server {
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
    
    # ...
}

OWASP CRS 核心规则集

OWASP CRS 是 ModSecurity 最常用的规则集,防护以下攻击类型:

规则 ID 范围 防护类型 说明
900000-900999 初始化 规则集配置和初始化
901000-901999 请求体检查 配置请求体处理
911000-911999 IP 信誉 恶意 IP 检测
912000-912999 DDoS 防护 速率限制
913000-913999 扫描器检测 检测漏洞扫描器
920000-920999 协议攻击 HTTP 协议违规
921000-921999 请求走私 HTTP 请求走私攻击
930000-930999 LFI/RFI 文件包含攻击
931000-931999 RFI 远程文件包含
932000-932999 RCE 远程代码执行
933000-933999 PHP 注入 PHP 代码注入
942000-942999 SQL 注入 SQL 注入攻击
950000-950999 XSS 跨站脚本攻击

四、WAF 规则最佳实践

规则部署流程

1. 初始部署:设置为「仅检测」模式(Log Only)
       ↓
2. 观察 1-2 周:收集误报数据
       ↓
3. 添加例外规则:放行被误报的正常请求
       ↓
4. 逐步启用:从低风险规则开始「拦截」
       ↓
5. 持续监控:定期审查日志,调整规则

误报处理

误报(False Positive)是 WAF 配置中最常见的挑战:

# 在 Cloudflare 中添加例外规则
# 或者使用 ModSecurity 规则排除

# 排除特定 URL 的规则检查
SecRule REQUEST_URI "@beginsWith /api/webhook" "id:1001,phase:1,pass,nolog,ctl:ruleEngine=Off"

常见误报来源:

  • 富文本编辑器(TinyMCE、CKEditor)中的 HTML 内容
  • API 请求中的特殊字符
  • 搜索功能中的特殊查询
  • 文件上传功能

速率限制配置

# Nginx 速率限制
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

server {
    location /wp-login.php {
        limit_req zone=login burst=3 nodelay;
        # ...
    }
}
# Cloudflare 速率限制规则
规则名称:限制登录页面访问
匹配条件:URL 包含 /login 或 /wp-login.php
速率限制:10 次/60 秒
触发操作:阻止 30 分钟

五、WAF 与其他安全措施的配合

WAF + CDN

Cloudflare CDN
    → DDoS 防护(网络层)
    → WAF(应用层)
    → Bot Management(爬虫管理)

WAF + 服务器端安全

WAF(边缘层)
    ↓ 拦截大部分攻击
服务器安全模块(应用层)
    → 输入验证
    → 参数化查询
    → CSP 策略
    → HttpOnly Cookie

安全体系分层

层级 防护措施 目的
⛅ 边缘层 Cloudflare WAF + DDoS 防护 在到达服务器前拦截攻击
🌐 网络层 防火墙 + Fail2Ban 阻止恶意 IP
🖥️ 应用层 ModSecurity + 代码审计 拦截应用层攻击
📊 数据层 数据库防火墙 + 加密 保护数据安全

六、WAF 性能影响

WAF 会带来一定的性能开销。以下是最小化影响的建议:

  1. 使用 CDN 层 WAF:Cloudflare WAF 不会增加源站负载
  2. 优化规则数量:规则越少,处理越快
  3. 使用缓存:对静态页面启用缓存,减少 WAF 处理次数
  4. 合理配置检测级别:生产环境建议使用最高效的规则集

七、WAF 日志分析

关键日志指标

# Cloudflare 查看 WAF 日志
# Dashboard → Security → Events

# 关注以下指标:
# 1. 最多被拦截的攻击类型
# 2. 攻击来源 IP 和国家
# 3. 被攻击的目标 URL
# 4. 误报数量(被错误拦截的正常请求)

定期安全审计

  • 每日:检查 WAF 拦截统计是否有异常
  • 每周:审查误报报告,更新白名单
  • 每月:评估规则集更新,调整配置
  • 季度:完整的 WAF 规则审计和优化

16IDC 观察

WAF 是网站安全体系中性价比最高的防护手段之一。对于大多数中小网站,推荐以下方案:

  1. 基础防护:Cloudflare 免费 WAF + 合理配置(0 成本,覆盖大部分常见攻击)
  2. 增强防护:Cloudflare Pro WAF + 自定义规则($20/月,适合电商和重要站点)
  3. 自建方案:Nginx + ModSecurity + OWASP CRS(适合需要完全控制权的场景)

安全不是一次性配置,而是一个持续优化和适应的过程。建议每季度审查一次 WAF 规则,根据最新的威胁情报进行更新。