CDN 与 WAF 精讲教程 / 第06章 WAF 基础原理
第06章 WAF 基础原理
本章介绍 WAF 的核心工作原理、常见部署模式、规则引擎设计以及对 OWASP Top 10 的防护能力。
6.1 WAF 工作原理
6.1.1 WAF 核心架构
客户端请求
│
▼
┌──────────────────────────────────────────────────────────────┐
│ WAF 处理流水线 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ 请求解析 │→│ 规则匹配 │→│ 决策引擎 │→│ 响应处理 │ │
│ │ │ │ │ │ │ │ │ │
│ │ - URL │ │ - 正则 │ │ - 允许 │ │ - 放行 │ │
│ │ - Header │ │ - 语义 │ │ - 拦截 │ │ - 拦截 │ │
│ │ - Body │ │ - 行为 │ │ - 限速 │ │ - 重定向 │ │
│ │ - Cookie │ │ - ML │ │ - 日志 │ │ - 日志 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
│ │
│ 时间预算: < 5ms (不影响正常请求延迟) │
└──────────────────────────────────────────────────────────────┘
│
▼
源站 / 拦截响应
6.1.2 检测方法对比
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 正则匹配 | 正则表达式匹配恶意特征 | 精确、可控 | 规则维护成本高 |
| 语义分析 | 解析 SQL/HTML/JS 语义 | 准确率高 | CPU 消耗大 |
| 行为分析 | 分析请求频率、模式 | 检测未知攻击 | 误报率较高 |
| 机器学习 | 训练模型识别异常 | 自适应 | 需要大量训练数据 |
| 签名匹配 | 已知攻击指纹库 | 快速匹配 | 无法检测 0day |
6.2 WAF 部署模式
6.2.1 三种部署模式
模式1: 反向代理模式 (Reverse Proxy)
用户 ──→ [WAF] ──→ 源站
▲
│ 终结 TLS,检查请求,转发到源站
│ 可修改请求/响应
模式2: 透明桥接模式 (Transparent Bridge)
用户 ──→ [WAF] ──→ 源站
▲
│ 二层桥接,不改变网络拓扑
│ 仅检查,不修改流量
模式3: 旁路模式 (Out-of-Band / TAP)
用户 ──→ ──────────→ 源站
│
└──→ [WAF] (镜像流量,仅监控告警)
▲
│ 通过 SPAN/TAP 镜像流量
│ 不影响正常流量
6.2.2 部署模式对比
| 特性 | 反向代理 | 透明桥接 | 旁路 |
|---|---|---|---|
| 拦截能力 | ✅ 完全 | ✅ 完全 | ❌ 仅监控 |
| 网络改动 | 大 | 中 | 小 |
| 性能影响 | 较大(TLS 终结) | 较小 | 无 |
| 部署复杂度 | 中 | 高 | 低 |
| 适用场景 | 公网 Web 服务 | 内网防护 | 检测/审计 |
| 高可用 | 需要 LB | 需要 STP/RSTP | 天然不影响 |
6.2.3 CDN 集成 WAF 模式
现代架构: CDN 内置 WAF
用户 ──→ [CDN 边缘节点]
│
├── WAF 检查
├── 缓存查找
├── 压缩
│
└──→ 源站
优势:
- WAF 在边缘拦截,恶意流量不到达源站
- TLS 卸载在边缘完成
- 无需额外部署 WAF 硬件/软件
- 自动扩缩容
6.3 规则引擎
6.3.1 规则引擎架构
┌─────────────────────────────────────────────────────────────────┐
│ WAF 规则引擎 │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Phase 1: 预处理 │ │
│ │ ├── URL 解码 / Unicode 规范化 │ │
│ │ ├── HTML 实体解码 │ │
│ │ ├── Base64 解码 │ │
│ │ └── 空白字符规范化 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼───────────────────────────────────┐ │
│ │ Phase 2: 规则匹配 │ │
│ │ ├── 规则集遍历(按优先级排序) │ │
│ │ ├── 正则表达式匹配 │ │
│ │ ├── 字符串匹配(Aho-Corasick 等) │ │
│ │ └── 复合条件评估 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼───────────────────────────────────┐ │
│ │ Phase 3: 评分与决策 │ │
│ │ ├── 累计异常评分 (Anomaly Score) │ │
│ │ ├── 阈值判断(默认: 5 分拦截) │ │
│ │ ├── 白名单检查 │ │
│ │ └── 生成最终动作: PASS / BLOCK / LOG / CHALLENGE │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
6.3.2 ModSecurity 规则示例
# ModSecurity CRS (Core Rule Set) 规则示例
# SQL 注入检测
SecRule ARGS "@detectSQLi" \
"id:942100,\
phase:2,\
block,\
msg:'SQL Injection Attack Detected',\
severity:'CRITICAL',\
tag:'attack-sqli',\
tag:'OWASP_CRS'"
# XSS 检测
SecRule ARGS "@detectXSS" \
"id:941100,\
phase:2,\
block,\
msg:'XSS Attack Detected',\
severity:'CRITICAL',\
tag:'attack-xss',\
tag:'OWASP_CRS'"
# 路径遍历
SecRule REQUEST_URI "@rx \.\./\.\." \
"id:930100,\
phase:1,\
block,\
msg:'Path Traversal Attack',\
severity:'CRITICAL',\
tag:'attack-lfi'"
6.3.3 规则动作
| 动作 | 说明 | 使用场景 |
|---|---|---|
PASS | 放行请求 | 白名单命中 |
BLOCK | 拦截请求,返回错误页 | 攻击确认 |
DROP | 直接断开连接 | 严重攻击 |
REDIRECT | 重定向到指定 URL | 引导到验证页 |
LOG | 仅记录日志不拦截 | 监控模式 |
CHAIN | 链式匹配(AND 逻辑) | 复合条件 |
ALLOW | 全局放行,跳过后续规则 | 白名单 |
6.4 OWASP Top 10 防护详解
6.4.1 A01: Broken Access Control(失效的访问控制)
攻击类型:
├── IDOR(不安全的直接对象引用)
│ GET /api/user/123 → GET /api/user/456
│
├── 路径遍历
│ GET /files/../../../etc/passwd
│
├── CORS 配置错误
│ Origin: evil.com → Access-Control-Allow-Origin: evil.com
│
└── 越权操作
PUT /api/admin/users (普通用户调用)
WAF 防护规则:
├── 拦截路径遍历模式 (../)
├── 验证 CORS Origin 白名单
├── 限制敏感路径访问(/admin/*)
└── 检查 HTTP 方法与路径匹配
6.4.2 A03: Injection(注入攻击)
SQL 注入示例:
GET /search?q=' OR '1'='1' --
GET /user?id=1 UNION SELECT * FROM users
WAF 检测模式:
├── 关键字匹配: UNION SELECT, OR '1'='1, --
├── 语义分析: SQL 语法树解析
└── 参数异常: 数字参数中出现引号
命令注入示例:
POST /ping host=127.0.0.1; cat /etc/passwd
WAF 检测模式:
├── 命令分隔符: ; | && || ` $( )
└── 危险命令: cat, ls, whoami, curl, wget
XSS 注入示例:
GET /search?q=<script>alert(1)</script>
WAF 检测模式:
├── HTML 标签: <script>, <img onerror>
└── JS 事件: onclick, onerror, onload
6.4.3 OWASP 防护能力矩阵
| OWASP 风险 | WAF 防护能力 | 防护深度 |
|---|---|---|
| A01 访问控制 | 中 | 路径限制、CORS 校验 |
| A02 加密失败 | 低 | 强制 HTTPS、密码套件限制 |
| A03 注入攻击 | 高 | 核心防护能力 |
| A04 不安全设计 | 低 | 速率限制 |
| A05 安全配置 | 中 | 安全头注入、信息泄露防护 |
| A06 组件漏洞 | 中 | 虚拟补丁 |
| A07 认证失败 | 中 | 暴力破解防护 |
| A08 数据完整性 | 低 | 请求签名校验 |
| A09 日志不足 | 高 | 完整审计日志 |
| A10 SSRF | 中 | 出站请求过滤 |
6.5 WAF 与 CDN 集成
6.5.1 主流 CDN WAF 对比
| 功能 | Cloudflare | AWS WAF | 阿里云 WAF | 自建 ModSecurity |
|---|---|---|---|---|
| 部署方式 | CDN 内置 | ALB/CF 边缘 | 独立服务 | 自建反向代理 |
| 规则集 | 内置 + 自定义 | 托管规则 | 内置 + 自定义 | CRS + 自定义 |
| 机器学习 | ✅ | ✅ | ✅ | ❌ |
| Bot 管理 | ✅ | AWS Bot | ✅ | 有限 |
| DDoS 防护 | 免费基础 | Shield | ✅ | 需额外方案 |
| 价格 | 免费-$20/月 | 按规则+请求计费 | 按套餐 | 人力成本 |
6.5.2 Cloudflare WAF 规则示例
# Cloudflare WAF 自定义规则
# 阻止来自特定国家的请求访问管理后台
(http.request.uri.path contains "/admin") and
(ip.geoip.country in {"CN" "RU" "KP"}) and
(not ip.src in {企业办公网IP})
→ Action: Block
# 阻止恶意 User-Agent
(http.user_agent contains "sqlmap") or
(http.user_agent contains "nikto") or
(http.user_agent contains "nmap")
→ Action: Block
# 限速:API 接口每分钟最多 60 次
(http.request.uri.path matches "^/api/") and
(rate gt 60)
→ Action: Challenge (Managed Challenge)
6.6 注意事项
⚠️ 误报管理:WAF 规则过于严格会导致正常请求被拦截(误报)。上线前务必在"监控模式"下运行至少 1 周,观察日志后再启用拦截。
⚠️ 规则更新:攻击手法不断演进,WAF 规则集需定期更新。OWASP CRS 每季度发布新版本。
⚠️ 绕过风险:WAF 不是万能的。编码绕过、分块传输、HTTP 参数污染等技术可绕过部分 WAF。需定期进行渗透测试。
⚠️ 性能开销:WAF 规则数量直接影响处理延迟。建议规则数量控制在 500 条以内。
6.7 扩展阅读
- OWASP ModSecurity Core Rule Set — 最流行的开源 WAF 规则集
- ModSecurity Reference Manual — ModSecurity 官方文档
- AWS WAF Documentation — AWS WAF 配置指南
- Cloudflare WAF — Cloudflare WAF 使用手册
- WAF Bypass Techniques — WAF 绕过技术合集(用于防御评估)
本章小结
| 主题 | 核心要点 |
|---|---|
| 工作原理 | 请求解析 → 规则匹配 → 决策 → 响应处理 |
| 部署模式 | 反向代理(最安全)、透明桥接、旁路(仅监控) |
| 规则引擎 | 预处理 → 规则匹配 → 评分 → 决策 |
| OWASP | WAF 对注入类攻击防护最强,逻辑漏洞需应用层配合 |
| 集成 | CDN 内置 WAF 是当前主流方案 |
下一章:第07章 WAF 规则详解 →