
在我负责运维的香港服务器集群中,Web 应用的攻击手法日益多样化,尤其是那些尚未公开的 0day 攻击行为,常规规则型 WAF 根本无法提前识别。最初我们依赖商业 WAF + OWASP CRS 规则进行防护,但面对模糊化 payload、伪随机路径、短生命周期的攻击特征时,频繁“漏网”已成为常态。为了提升防护深度,我尝试将机器学习流量分析嵌入到 WAF 流量路径中,让系统能基于历史访问行为自动识别异常流量模式,实现对 0day 利用的自适应识别。
本文将详细拆解我在香港服务器上部署 AI/ML 流量模型辅助 WAF 自动识别 0day 攻击的实战过程,包括流量采集、特征工程、模型训练、在线推理与封禁联动等关键模块。
一、部署目标与整体架构
目标很明确:
- 实时检测未命名攻击(0day)
- 基于行为特征而非特定规则判断可疑请求
- 减少人工维护规则负担
整体架构如下:
[nginx ingress] -> [AI流量探针] -> [原始WAF] -> [应用服务]
|
[历史流量日志] => [特征提取] => [模型训练] => [模型部署API]
我们将 nginx ingress 层的访问流量以镜像方式送入 AI 流量探针进行实时分析,模型服务提供“恶意评分”API,WAF 或 Nginx 根据恶意分数决定是否拦截。
二、流量采集与清洗
我在边缘 ingress 层部署了 [nginx + Lua] 的 mirror 模块,对所有 HTTP/HTTPS 请求进行镜像,并异步投递到 Kafka 消息队列:
mirror /mirror;
location = /mirror {
internal;
proxy_pass http://127.0.0.1:8080/log_collector;
proxy_set_body $request_body;
proxy_set_header Content-Type application/json;
}
镜像数据结构如下(JSON 格式):
{
"method": "GET",
"uri": "/wp-login.php",
"args": "redirect_to=http://xx.xx",
"headers": {
"User-Agent": "...",
"X-Forwarded-For": "1.2.3.4",
...
},
"body": "",
"timestamp": 1722123532
}
Kafka 每秒入流量约 1500 条,我利用 Flink 做实时 ETL 清洗,包括:
- 去重(按 IP+URI+时间窗口)
- 提取 URL 路径、参数名、参数值
- 分词、tokenize、编码长度等语义特征
- 加入是否命中已有规则引擎的标识标签
三、特征工程设计
传统 IDS 模型往往依赖手工规则或 signature,我们改为使用如下通用特征:
| 特征名 | 类型 | 描述 |
|---|---|---|
| uri_len | 数值型 | 请求 URI 长度 |
| param_key_entropy | 数值型 | 参数名信息熵 |
| payload_entropy | 数值型 | 参数值信息熵 |
| method | 类别型 | 请求方法(GET/POST 等) |
| ua_fingerprint | 类别型 | User-Agent 分类指纹 |
| is_sql_keyword | 布尔型 | 是否包含常见 SQL 关键词 |
| char_dist | 数组 | payload 中字符分布密度向量 |
| time_bucket | 类别型 | 所在访问时间段(如凌晨/中午) |
数据最终存入 ClickHouse,用于后续训练样本读取。
四、模型训练与评估
我选择了两种模型:
1. 有监督模型(XGBoost)
适用于已知恶意样本数据。我们人工标注了部分攻击样本(如扫描工具、SQL 注入)、正常用户请求进行训练:
model = XGBClassifier()
model.fit(X_train, y_train)
评估指标:
- F1 score 达 0.93
- Recall 对于未命名攻击保持在 0.89 左右
2. 无监督模型(Isolation Forest)
针对潜在 0day,我们使用无监督方法训练:
iso_model = IsolationForest(contamination=0.01)
iso_model.fit(normal_requests_features)
此模型能自动识别“偏离正常群体”的请求,尤其对突发型异常 payload 敏感。
五、模型在线推理服务
我们用 Flask + ONNXRuntime 将训练模型部署成 REST API 接口:
POST /predict
{
"uri_len": 35,
"payload_entropy": 4.52,
...
}
返回结构:
{
"score": 0.91,
"is_malicious": true
}
并在 Nginx Lua 层加一段联动逻辑:
local res = ngx.location.capture("/ml_api", {
method = ngx.HTTP_POST,
body = cjson.encode(request_features)
})
local result = cjson.decode(res.body)
if result["is_malicious"] then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
这样做能实时过滤高风险请求,平均延迟控制在 10ms 内。
六、持续学习与样本反馈机制
为了避免模型过拟合或失效,我们建立了如下反馈机制:
- 拦截请求 + 应用异常日志匹配,发现误报及时放行;
- 被攻击后溯源请求样本,加入恶意样本库重新训练;
- 每日自动调度 retrain 任务,融合最新样本。
调度流程基于 Airflow 实现,模型自动打包并发布到线上推理服务中。
七、落地效果与未来展望
自上线 ML-WAF 模块后,我们对比业务系统日志:
- SQL 注入类攻击拦截率提升至 98%;
- 漏洞扫描类攻击平均识别时间缩短至 30 秒内;
- 日均误报率控制在 0.2% 以下,大多为爬虫或异常 UA;
- 在一次插件 0day 攻击中,AI 模型首次在规则未更新前实现拦截,避免了网站挂马。
未来我们还计划接入图神经网络(GNN)识别攻击路径依赖关系,结合 honeypot 数据自动生成诱捕特征,进一步增强系统对变种攻击的免疫力。
这套基于 AI/ML 的流量特征学习防御方案,已经逐渐从“辅助”走向“主力”。在面对越来越难以规则化定义的攻击模式时,让服务器自己“学会分辨坏人”,比不断堆规则更有现实意义。尤其在香港等对抗强度高的出口节点,AI WAF 已经不是“锦上添花”,而是“雪中送炭”。











