aiwaf-project/aiwaf
GitHub: aiwaf-project/aiwaf
AIWAF 是一个基于人工智能的自适应 Web 应用防火墙,专为 Python Web 框架设计,用于实时检测和拦截网络攻击。
Stars: 55 | Forks: 5
# AIWAF
AIWAF 提供基于上下文的防护,包含速率限制、异常检测、蜜罐、UUID篡改防护、智能关键词学习、文件扩展名探测检测、路径/ IP豁免感知以及定时重训练等功能。
## 最新增强功能
- 智能关键词过滤,避免误拦截如 `/profile/` 等合法路径
- 针对黑名单、关键词和豁免项提供细粒度重置控制
- 基于上下文的学习机制,优先处理可疑流量而非常规路由
- 通过 `AIWAF_ALLOWED_PATH_KEYWORDS` 和 `AIWAF_EXEMPT_KEYWORDS` 增强关键词控制
- 蜜罐逻辑中增加全面的 HTTP 方法验证
- 蜜罐计时增强,包含页面过期/重载流程
- 头部验证结合质量评分与机器人模式检测
## 快速安装
```
pip install aiwaf
```
可选框架附加组件:
```
pip install "aiwaf[django]"
pip install "aiwaf[flask]"
pip install "aiwaf[fastapi]"
pip install "aiwaf[rust]"
```
Rust 附加组件会安装可选的 `aiwaf-rust` 加速包。
重要说明:
- 请使用与您框架对应的适配器包(`aiwaf.django`、`aiwaf.flask` 或 `aiwaf.fast`)。
- 有关 Django 的设置和命令详情,请参阅 `INSTALLATION.md` 和 `REPO_GUIDE_DJANGO.md`。
## 系统要求
- Python 3.8+
- 仅 CPU 运行(无需 GPU)
- 小型部署:约 1 个 vCPU 和 ~512 MB 内存
- 中型部署:建议 2 至 4 个 vCPU 和 2 至 4 GB 内存
- 生产环境中需计划检测/训练任务并轮换日志
## 包结构
```
aiwaf/
core/ # framework-agnostic helpers, training, storage abstractions
core/geolock/ipinfo_lite.mmdb # bundled GeoIP database
django/ # Django adapter (middleware, models, trainer, commands)
flask/ # Flask adapter (integration class, middleware, CLI helpers)
fast/ # FastAPI adapter (middleware, decorators, CLI helpers)
```
框架入口点:
```
# Django
import aiwaf.django as aiwaf
# Flask
import aiwaf.flask as aiwaf
# FastAPI
import aiwaf.fast as aiwaf
```
## 功能特性
- **IP 黑名单**
- 快速拦截已知可疑来源
- 支持通过适配器存储进行运行时更新
- **速率限制**
- 滑动窗口请求控制(`AIWAF_RATE_WINDOW`、`AIWAF_RATE_MAX`)
- 支持洪水攻击阈值(`AIWAF_RATE_FLOOD`)以应对恶意滥用
- **AI 异常检测**
- 基于 IsolationForest 的行为检测
- 随流量增长进行模型训练更新
- **动态关键词学习**
- 从类攻击流量中学习可疑路径关键词
- 排除豁免/允许的术语以减少误报
- **文件扩展名探测检测**
- 检测对 `.php`、`.asp`、`.jsp` 等扩展名的重复探测
- **头部验证**
- 检测缺失必要头部
- 检查可疑的用户代理和头部组合
- 头部质量评分
- 支持静态资源豁免
- **增强蜜罐计时**
- 通过 `AIWAF_MIN_FORM_TIME` 进行 GET 到 POST 的计时检查
- 通过 `AIWAF_MAX_PAGE_TIME` 进行页面年龄验证
- 方法误用检查(例如向只读端点发送 POST 请求)
- **UUID 篡改防护**
- 基于评分的 UUID 滥用检测
- 格式错误的 UUID 会增加高分并可能立即被拦截
- 有效 UUID 请求若反复以 `404` 结束会增加分数
- 成功的 UUID 请求会使分数衰减
- 当单个 IP 的 UUID 分数超过阈值时进行拦截
- **GeoIP 支持**
- 可选国家级别的允许/拦截行为
- 默认支持本地捆绑的 MMDB 文件
- **内置日志路径**
- 适配器级别的请求日志可在主访问日志不可用时用于训练
- **被拦截请求的调试日志**
- 在调试模式下捕获原因、IP、方法、路径和用户代理
## 头部验证详情
检测内容:
- 缺少类似浏览器的核心头部
- 简单机器人典型的头部多样性低
- 可疑或以自动化为导向的用户代理
- 不现实的头部组合
允许内容:
- 带有完整头部的正常浏览器流量
- 标识明确的客户端和已知的合法机器人
- 配置了豁免模式时的静态文件请求
有用的测试模式:
```
# 常为低质量头部画像
curl http://your-app.example/
# 对比正常浏览器流量
```
## 豁免与安全路由
AIWAF 支持:
- 豁免路径(`AIWAF_EXEMPT_PATHS`)
- 豁免 IP(由适配器管理的白名单)
- 豁免关键词(`AIWAF_EXEMPT_KEYWORDS`)
- 允许的路由关键词(`AIWAF_ALLOWED_PATH_KEYWORDS`)
豁免的影响:
- 不参与关键词学习
- 绕过选定的拦截路径
- 降低对受信任业务路由(webhook、健康检查、静态资源)的误报率
基于装饰器的豁免:
- Django 适配器和 Flask 适配器均在其适配器模块中暴露了豁免装饰器。
## 训练与重训练
训练流程:
1. 读取配置的访问日志或适配器日志器输出
2. 检测可疑模式(包括大量的 404 探测行为)
3. 当满足 AI 阈值时,训练/更新 IsolationForest 模型
4. 从可疑流量中刷新动态关键词
5. 从学习到的关键词集中移除豁免/允许的噪声
阈值:
- `AIWAF_MIN_AI_LOGS` 默认为 10,000 用于完整 AI 训练
- `AIWAF_MIN_TRAIN_LOGS` 默认为 50 用于关键词聚焦的回退训练
- `AIWAF_FORCE_AI_TRAINING` 可以覆盖 AI 阈值门控
## 配置(`AIWAF_*`)
AIWAF 使用扁平的 `AIWAF_*` 设置/配置键。
部分配置项是特定适配器的;核心控制是共享的。
大多数部署中必需的配置:
```
AIWAF_ACCESS_LOG = "/var/log/nginx/access.log"
```
核心默认值(示例):
```
AIWAF_DISABLE_AI = False
AIWAF_MIN_AI_LOGS = 10000
AIWAF_MIN_TRAIN_LOGS = 50
AIWAF_FORCE_AI_TRAINING = False
AIWAF_AI_CONTAMINATION = 0.05
AIWAF_RATE_WINDOW = 10
AIWAF_RATE_MAX = 20
AIWAF_RATE_FLOOD = 10
AIWAF_WINDOW_SECONDS = 60
AIWAF_MIN_FORM_TIME = 1.0
AIWAF_MAX_PAGE_TIME = 240
AIWAF_FILE_EXTENSIONS = [".php", ".asp", ".jsp"]
AIWAF_UUID_SCORE_ENABLED = True
AIWAF_UUID_SCORE_WINDOW_SECONDS = 60
AIWAF_UUID_SCORE_BLOCK_THRESHOLD = 5
AIWAF_UUID_SCORE_MALFORMED_WEIGHT = 5
AIWAF_UUID_SCORE_NOT_FOUND_WEIGHT = 1
AIWAF_UUID_SCORE_SUCCESS_DECAY = 2
AIWAF_ALLOWED_PATH_KEYWORDS = ["profile", "user", "account", "dashboard"]
AIWAF_EXEMPT_KEYWORDS = ["api", "webhook", "health", "static", "media"]
AIWAF_EXEMPT_PATHS = ["/favicon.ico", "/robots.txt", "/static/", "/health/"]
```
模型存储:
```
AIWAF_MODEL_PATH = "aiwaf/resources/model.pkl"
AIWAF_MODEL_STORAGE = "file" # file | db | cache
AIWAF_MODEL_CACHE_KEY = "aiwaf:model"
AIWAF_MODEL_CACHE_TIMEOUT = None
AIWAF_MODEL_STORAGE_FALLBACK = True
```
头部控制:
```
AIWAF_REQUIRED_HEADERS = None # list or method->list mapping
AIWAF_HEADER_QUALITY_MIN_SCORE = 3
```
GeoIP:
```
AIWAF_GEO_BLOCK_ENABLED = False
AIWAF_GEOIP_DB_PATH = "aiwaf/core/geolock/ipinfo_lite.mmdb"
AIWAF_GEO_BLOCK_COUNTRIES = ["CN", "RU"]
AIWAF_GEO_ALLOW_COUNTRIES = []
AIWAF_GEO_CACHE_SECONDS = 3600
AIWAF_GEO_CACHE_PREFIX = "aiwaf:geo:"
```
Rust 加速:
```
AIWAF_USE_RUST = False
```
启用后,AIWAF 会尝试使用 Rust 辅助功能,并在失败时自动回退到 Python。
旧版兼容性:
- 如果您仍在使用嵌套的 `AIWAF_SETTINGS`,AIWAF 会在启动时将常见键映射到扁平的 `AIWAF_*` 值。
## 中间件设置
在所有适配器中顺序都很重要。将防护中间件放在前面,日志记录中间件放在末尾附近。
### 统一的 `all` / `auto` 选择
AIWAF 现在支持跨适配器的集中式“启用所有功能并使用智能默认值”模式。
- FastAPI 和 Flask:传递 `middlewares=["all"]`(或 `["auto"]`)
- Django:在 `MIDDLEWARE` 中使用 `"aiwaf.django.middleware.all"`
自动行为:
- 当 `AIWAF_ACCESS_LOG` 缺失或为空时,启用日志记录中间件
- 当 `AIWAF_ACCESS_LOG` 已配置时,禁用日志记录中间件
- 当以下任一条件为真时,启用地理中间件:
- 显式的地理启用标志已开启
- 静态地理拦截列表包含国家
- 动态地理拦截存储/表包含国家
Django 示例顺序:
```
MIDDLEWARE = [
"aiwaf.django.middleware.JsonExceptionMiddleware",
"aiwaf.django.middleware.GeoBlockMiddleware",
"aiwaf.django.middleware.IPAndKeywordBlockMiddleware",
"aiwaf.django.middleware.RateLimitMiddleware",
"aiwaf.django.middleware.AIAnomalyMiddleware",
"aiwaf.django.middleware.HoneypotTimingMiddleware",
"aiwaf.django.middleware.UUIDTamperMiddleware",
"aiwaf.django.middleware.HeaderValidationMiddleware",
"aiwaf.django.middleware_logger.AIWAFLoggerMiddleware",
]
```
如果 JSON API 客户端需要 JSON 格式的 403 响应体,请将 `JsonExceptionMiddleware` 保持在顶部附近。
Django 别名示例:
```
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"aiwaf.django.middleware.all",
]
```
FastAPI 快速集成:
```
from fastapi import FastAPI
from aiwaf.fast import AIWAF
app = FastAPI()
aiwaf = AIWAF(
app,
middlewares=["all"],
storage={"backend": "memory"},
header_validation={"enabled": True, "quality_threshold": 3},
rate_limiting={"enabled": True, "window_seconds": 10, "max_requests": 20},
logging_middleware={"enabled": True, "log_dir": "aiwaf_logs", "log_format": "json"},
)
```
Flask 快速集成:
```
from flask import Flask
from aiwaf.flask import AIWAF
app = Flask(__name__)
aiwaf = AIWAF(app, middlewares=["all"])
```
## 操作
Django 适配器示例:
```
python manage.py detect_and_train
python manage.py regenerate_model
python manage.py aiwaf_reset --keywords --confirm
python manage.py add_ipexemption 203.0.113.10 --reason "trusted integration"
python manage.py add_pathexemption /api/webhooks/ --reason "partner callbacks"
python manage.py aiwaf_logging --status
python manage.py geo_block_country list
python manage.py geo_block_country add US
python manage.py geo_block_country remove US
```
Flask 适配器:
- 使用 `aiwaf.flask.AIWAF` 进行中间件注册
- 使用 `aiwaf.flask.cli.AIWAFManager` 处理基于 CSV 的操作任务
FastAPI 适配器:
- 使用 `aiwaf.fast.AIWAF` 进行中间件注册
- 使用 `aiwaf fast ...` 或 `aiwaf-fast ...` 进行 CLI 操作
### Django 命令参考
常用管理命令:
```
python manage.py detect_and_train
python manage.py regenerate_model
python manage.py aiwaf_reset --confirm
python manage.py aiwaf_reset --blacklist --confirm
python manage.py aiwaf_reset --keywords --confirm
python manage.py aiwaf_reset --exemptions --confirm
python manage.py add_ipexemption --reason "optional reason"
python manage.py add_pathexemption /path/prefix/ --reason "optional reason"
python manage.py aiwaf_pathshell
python manage.py aiwaf_logging --status
python manage.py geo_block_country list
python manage.py geo_block_country add US
python manage.py geo_block_country remove US
python manage.py aiwaf_diagnose
```
`aiwaf_pathshell` 辅助工具:
```
ls # list path tree at current node
cd # enter child path node
up / cd .. # move up
pwd # current path prefix
exempt # add exemption for selected/current path
exit # quit shell
```
### Flask 适配器参考
编程式集成:
```
from flask import Flask
from aiwaf.flask import AIWAF
app = Flask(__name__)
app.config["AIWAF_USE_RUST"] = True
app.config["AIWAF_GEO_BLOCK_ENABLED"] = False
app.config["AIWAF_MIN_AI_LOGS"] = 10000
aiwaf = AIWAF(
app,
middlewares=[
"logging",
"header_validation",
"ip_keyword_block",
"rate_limit",
"geo_block",
"ai_anomaly",
"uuid_tamper",
],
)
```
可选的 Flask CLI 管理器:
```
python -m aiwaf.flask.cli list all
python -m aiwaf.flask.cli add whitelist 203.0.113.10
python -m aiwaf.flask.cli add blacklist 203.0.113.99 --reason "manual test"
python -m aiwaf.flask.cli add keyword ../etc/passwd
python -m aiwaf.flask.cli status
```
### FastAPI 适配器参考
编程式集成:
```
from fastapi import FastAPI
from aiwaf.fast import AIWAF
app = FastAPI()
AIWAF(app)
```
CLI 用法:
```
aiwaf fast --help
aiwaf-fast --help
```
### 路径特定规则
使用路径规则选择性禁用中间件或覆盖速率限制,而不会在全局上削弱防护:
```
AIWAF_SETTINGS = {
"PATH_RULES": [
{
"PREFIX": "/api/webhooks/",
"DISABLE": ["HeaderValidationMiddleware"],
"RATE_LIMIT": {"WINDOW": 60, "MAX": 2000},
},
{
"PREFIX": "/api/public/",
"RATE_LIMIT": {"WINDOW": 60, "MAX": 500},
},
]
}
```
规则按路径前缀匹配,应用最具体的匹配规则。
### 拦截行为
- 默认行为:被拦截的请求抛出 `PermissionDenied("blocked")` 并返回 `403`。
- 对于 JSON API(Django):`JsonExceptionMiddleware` 将被拦截的 JSON 请求转换为 JSON 格式的 `403` 响应体。
- 速率限制可以对软限流路径发出 `429`,同时仍将重复滥用升级至黑名单流程。
### 速率限制缓存(多 worker)
默认情况下,Flask 和 FastAPI 的速率限制使用进程内缓存(每个 worker 一个)。对于多 worker / 多实例部署,需要配置速率限制器使用 Redis,以便所有 worker 共享相同的计数器。
**Flask**
```
app.config["AIWAF_RATE_CACHE_BACKEND"] = "redis"
app.config["AIWAF_REDIS_URL"] = "redis://localhost:6379/0"
# 可选 (默认为 "aiwaf:rate:")
app.config["AIWAF_RATE_CACHE_KEY_PREFIX"] = "aiwaf:rate:"
```
**FastAPI**
```
from aiwaf.fast import AIWAF
AIWAF(
app,
rate_limiting={
"enabled": True,
"cache_backend": "redis",
"redis_url": "redis://localhost:6379/0",
"cache_key_prefix": "aiwaf:rate:", # optional
},
)
```
环境变量(适用于两个适配器):
```
set AIWAF_RATE_CACHE_BACKEND=redis
set AIWAF_REDIS_URL=redis://localhost:6379/0
set AIWAF_RATE_CACHE_KEY_PREFIX=aiwaf:rate:
```
### 日志记录与训练数据源
AIWAF 训练器可以从以下来源获取数据:
1. `AIWAF_ACCESS_LOG`(主要来源,在适用情况下支持轮换/压缩日志的解析)
2. 中间件捕获的日志(根据适配器设置存储为 CSV/数据库)
这使得在无法获取反向代理日志的情况下仍能进行训练。
## 沙盒与基准测试
`examples/sandbox/` 目录下的沙盒提供:
- `direct`(无 AIWAF)
- `protected_django`
- `protected_flask`
- `protected_fastapi`
运行完整基准测试:
```
cd examples/sandbox
python run-and-compare.py -n 5
```
生成的输出:
- `results_direct_*.json`
- `results_protected_django_*.json`
- `results_protected_flask_*.json`
- `comparison_modes_*.json`
- `comparison_aggregate_*.json`
结果解读指南:
- `direct` 模式下攻击拦截率应低/为零(基线)
- 受保护的目标应使正常流量的拦截率接近 `0%`
- 比较不同迭代中的攻击拦截率和中位数延迟,而非单次运行的平均值
## 发布清单
发布新包版本前:
1. 运行两个适配器的测试套件
2. 验证沙盒比较(至少运行 `run-and-compare.py -n 3`)
3. 在 `setup.py` 中更新包版本号
4. 构建产物(`python -m build`)
5. 在干净的虚拟环境中冒烟测试 wheel 安装
6. 验证 `README.md` 和附加组件(`django`、`flask`)与实际包行为匹配
## 重置与恢复
细粒度重置(Django 适配器):
```
python manage.py aiwaf_reset --blacklist
python manage.py aiwaf_reset --keywords
python manage.py aiwaf_reset --exemptions
python manage.py aiwaf_reset --blacklist --keywords
python manage.py aiwaf_reset --confirm
```
误报的常见恢复路径:
1. 清除已学习的关键词
2. 将合法的路由术语添加到 `AIWAF_ALLOWED_PATH_KEYWORDS`
3. 将永不拦截的术语添加到 `AIWAF_EXEMPT_KEYWORDS`
4. 重新训练
## 故障排除
### 合法页面被拦截
原因:
- 学习到的关键词包含了合法的应用程序词汇
解决方法:
```
python manage.py aiwaf_reset --keywords --confirm
python manage.py detect_and_train
```
然后调整:
- `AIWAF_ALLOWED_PATH_KEYWORDS`
- `AIWAF_EXEMPT_KEYWORDS`
### AI 模型未训练
- 检查日志路径和权限
- 检查日志量是否达到 `AIWAF_MIN_AI_LOGS` / `AIWAF_MIN_TRAIN_LOGS` 的阈值
- 仅在适当时使用 `AIWAF_FORCE_AI_TRAINING=True`
### 地理拦截未激活
- 验证 `AIWAF_GEO_BLOCK_ENABLED=True`
- 验证 `AIWAF_GEOIP_DB_PATH`
- 确认地理中间件已在您的适配器链中启用
### Rust 模式似乎未激活
- 设置 `AIWAF_USE_RUST=True`
- 验证环境可以导入 Rust 扩展
- 在 Rust 导入/运行时失败时回退到 Python 是预期行为
## 工作原理
| 层级 | 目的 |
|---|---|
| 地理拦截 | 国家级别的允许/拦截过滤 |
| IP/关键词拦截 | 已知恶意源和关键词防御 |
| 速率限制 | 在滑动窗口内进行突发/洪水控制 |
| AI 异常 | 基于机器学习的行为离群点检测 |
| 蜜罐计时 | 自动化/计时/方法误用检查 |
| UUID 篡改 | 基于评分的格式错误 UUID + 重复 UUID-404 滥用检测 |
| 头部验证 | 类机器人头部特征检测 |
| 请求日志器 | 用于分析/训练的可选遥测捕获 |
## 请求生命周期(详细)
对于一个典型的受保护请求:
1. 请求进入适配器中间件链。
2. 首先运行路径/视图/IP 豁免检查。
3. 头部验证评估必要头部和质量得分。
4. IP/关键词检查应用静态规则和学习到的规则。
5. 速率限制检查应用窗口/洪水逻辑。
6. 地理检查应用国家级别的允许/拦截规则(如果启用)。
7. AI 异常评估提取的行为特征(如果启用且模型可用)。
8. 蜜罐计时/方法检查评估表单计时和方法误用。
9. UUID 篡改检查验证 UUID 格式并应用基于评分的重复未命中检测。
10. 可选的日志器记录请求/响应元数据。
如果任何拦截阶段拒绝了请求:
- 状态码通常为 `403`(`PermissionDenied("blocked")`)
- JSON API 可以通过 JSON 异常中间件接收到 JSON 格式的 `403`
- 某些限流路径可能返回 `429`
## 中间件说明
`IPAndKeywordBlockMiddleware`:
- 快速拦截已在黑名单中的 IP
- 检查静态可疑关键词和学习到的动态关键词
- 支持豁免关键词和允许路径关键词逻辑
`RateLimitMiddleware`:
- 强制执行短时间窗口内的最大请求预算
- 可以将持续的洪水攻击者加入黑名单
- 支持路径规则覆盖
`GeoBlockMiddleware`:
- 通过 MMDB 从源 IP 解析国家
- 支持拦截列表模式和可选的允许列表模式
- 可以缓存查找以提高性能
`AIAnomalyMiddleware`:
- 需要模型加载和阈值配置
- 当模型/依赖项不可用时会优雅地自行禁用
- 根据配置/运行时,可以运行 Python 路径或 Rust 辅助路径
`HoneypotTimingMiddleware`:
- 强制执行最短提交计时
- 在启用的地方强制执行最大页面年龄语义
- 包含方法误用检测逻辑
`UUIDTamperMiddleware`:
- 保护 UUID 访问模式
- 在没有 UUID 模型规则适用的地方通常为空操作
`HeaderValidationMiddleware`:
- 根据方法检查必要头部
- 对请求真实性评分,并可以拦截低质量特征的请求
- 通常通过 `PATH_RULES` 为 API/webhook/socket 端点进行调优
## 高级配置矩阵
流量控制:
```
AIWAF_RATE_WINDOW = 10
AIWAF_RATE_MAX = 20
AIWAF_RATE_FLOOD = 10
AIWAF_WINDOW_SECONDS = 60
```
头部验证:
```
AIWAF_REQUIRED_HEADERS = None
AIWAF_HEADER_QUALITY_MIN_SCORE = 3
AIWAF_MAX_ACCEPT_LENGTH = 4096
```
AI/模型行为:
```
AIWAF_DISABLE_AI = False
AIWAF_MIN_AI_LOGS = 10000
AIWAF_MIN_TRAIN_LOGS = 50
AIWAF_FORCE_AI_TRAINING = False
AIWAF_AI_CONTAMINATION = 0.05
```
模型存储:
```
AIWAF_MODEL_STORAGE = "file" # file | db | cache
AIWAF_MODEL_PATH = "aiwaf/resources/model.pkl"
AIWAF_MODEL_CACHE_KEY = "aiwaf:model"
AIWAF_MODEL_CACHE_TIMEOUT = None
AIWAF_MODEL_STORAGE_FALLBACK = True
```
关键词与误报控制:
```
AIWAF_ALLOWED_PATH_KEYWORDS = ["profile", "user", "dashboard"]
AIWAF_EXEMPT_KEYWORDS = ["api", "health", "static", "webhook"]
AIWAF_DYNAMIC_TOP_N = 10
```
豁免:
```
AIWAF_EXEMPT_PATHS = ["/health/", "/static/", "/favicon.ico"]
AIWAF_EXEMPT_IPS = ["127.0.0.1", "::1"]
```
## 调优手册
在不全局削弱防护的情况下减少误报:
1. 重置已学习的关键词(`--keywords`)
2. 将合法的域术语添加到 `AIWAF_ALLOWED_PATH_KEYWORDS`
3. 将操作术语添加到 `AIWAF_EXEMPT_KEYWORDS`
4. 为 webhook/socket 端点添加路由级别的 `PATH_RULES`
5. 重新训练并再次进行基准测试
针对持续攻击流量进行加固:
1. 调整 `AIWAF_RATE_WINDOW`、`AIWAF_RATE_MAX`、`AIWAF_RATE_FLOOD`
2. 对公共路径保持头部验证启用
3. 保持地理规则明确且最小化
4. 启用中间件日志记录 + 定期重训练
5. 在添加宽泛的关键词规则前,先审查拦截原因
稳定实时路径:
1. 保持全局防护启用
2. 仅通过 `PATH_RULES` 禁用 `/socket.io/` 或等效路径的严格检查
3. 对非实时路径保留黑名单逻辑
4. 需要时将受信任的内部集成 IP 加入白名单
## Rust 验证
启用:
```
AIWAF_USE_RUST = True
```
运行时行为:
- Rust 扩展可用:选定路径使用 Rust 加速
- Rust 扩展不可用:自动回退到 Python
验证清单:
1. 以 `AIWAF_USE_RUST=True` 启动应用
2. 确认启动/运行时日志显示 Rust 可用性或回退路径
3. 使用多次迭代进行基准测试并比较中位数(`run-and-compare.py -n 5`)
## 故障排除决策树
页面空白但 `/` 返回 `200`:
- 检查 JS/CSS/API 请求是否返回 `403`/`4xx`
- 检查客户端 IP 是否被列入黑名单
- 确认 socket/静态资源/API 路径的 `PATH_RULES`
一次被拦截请求后立即出现大量 `403`:
- 可能是黑名单级联
- 清除黑名单并添加有针对性的豁免/路径规则
- 避免全局禁用所有中间件
AI 异常未激活:
- 验证模型是否可加载
- 验证 AI 依赖项已安装
- 验证 `AIWAF_DISABLE_AI=False`
- 验证阈值(`AIWAF_MIN_AI_LOGS`、`AIWAF_MIN_TRAIN_LOGS`)
地理拦截似乎未激活:
- 确认中间件已启用
- 确认 MMDB 路径有效
- 确认允许/拦截列表已按预期配置
## 部署模式
### 反向代理 + 应用服务器
典型的生产路径:
1. 互联网 -> CDN/WAF 边缘(可选)
2. 反向代理(Nginx/Traefik/Caddy)
3. 应用服务器(带有 AIWAF 中间件的 Django/Flask)
4. 应用数据库/缓存 + 模型/日志存储
建议:
- 正确保留客户端 IP 转发(`X-Forwarded-For`)
- 保持时钟同步(NTP)以确保日志计时功能可靠
- 轮换日志并强制执行保留限制
- 作为计划任务定期运行重训练
### 多实例部署
当运行多个应用实例时:
- 对于模型工件,首选共享存储模式(`db` 或集中式缓存)
- 确保黑名单/豁免更新能一致传播
- 如果实例会自动扩缩容,避免使用仅限主机本地的模型路径
### 蓝绿/滚动更新
为了更安全的发布:
1. 以保守的阈值部署
2. 验证拦截指标和误报率
3. 逐步收紧控制
4. 仅在稳定基准测试 + 生产金丝雀行为正常后才推广
## 可观察性与 KPI
按适配器跟踪这些指标:
- **正常流量拦截率**:目标接近 `0%`
- **攻击流量拦截率**:在重放测试套件下目标应高且稳定
- **P95/P99 响应延迟**:比较调优前后的变化
- **黑名单变动率**:突然激增可能表明规则过于嘈杂
- **主要拦截原因**:有助于调整头部/关键词/速率限制
- **重训练成功/失败次数**:检测模型流程回归
最小看板切片:
- 按端点族(`/api`、`/socket.io`、静态资源)
- 按源 ASN/国家(如果启用了地理功能)
- 按中间件原因代码
- 按部署版本
## 安全边界与注意事项
AIWAF 增强了应用层防护,但并非完整的安全边界。
重要注意事项:
- 不能替代安全编码、授权、密钥管理、打补丁或网络控制
- ML 异常检测是概率性的,可能随流量特征变化而漂移
- 激进的关键词/速率设置如果不分阶段进行,可能导致自我引发的故障
- websocket/实时路径通常需要显式的路径规则调优
- 白名单/豁免应范围严格并定期审查
## 贡献者测试策略
推荐的本地验证流程:
1. 单元测试和适配器测试
2. 沙盒启动验证(直接模式 + 受保护目标)
3. 使用多次迭代进行重放基准测试
4. 审查聚合检测率和延迟中位数
5. 检查一部分被拦截和允许的请求以查找回归
建议的基准测试命令:
```
cd examples/sandbox
python run-and-compare.py -n 5
```
回归门控(策略示例):
- 正常流量拦截率不增加
- 攻击拦截率无显著下降
- 无超出约定预算的、无法解释的延迟回归
## 常见问题解答
**为什么我在 `curl` 上看到 `403` 而浏览器可以访问?**
头部验证可能将低质量的客户端头部归类为自动化流量。
**为什么突然所有请求都开始返回 `403`?**
可能是在初始拦截事件后发生了黑名单级联;清除黑名单并添加有针对性的路径/IP 调优。
**我可以为单个路由禁用一个中间件吗?**
可以,使用 `AIWAF_SETTINGS["PATH_RULES"]` 并为该前缀设置 `DISABLE`。
**Rust 模式会改变检测结果吗?**
它应该在改善某些执行路径的同时保持行为一致;请通过 A/B 多次迭代基准测试进行验证。
**我需要 Django 才能使用 AIWAF 吗?**
不需要。核心支持 Django 和 Flask 适配器,但某些操作命令是 Django 特有的。
## CLI 入口点
```
aiwaf-detect
```
当前行为:
- 调度至 Django 训练器(`aiwaf.django.trainer.train`)
- 需要 Django 适配器可用
## 致谢
[DigitalOcean](https://www.digitalocean.com/) 提供了支撑 AIWAF 开发的云基础设施。
## 许可证
MIT。详见 `LICENSE`。
标签:Apex, AppImage, AV绕过, Django, DNS枚举, Elastic, FastAPI, Flask, IP黑名单, Python, Rust, UUID安全, Web应用防火墙, 上下文感知, 人工智能, 入侵防御系统, 关键词过滤, 可视化界面, 基于日志的安全, 威胁猎捕, 威胁防御, 安全防护, 异常检测, 性能优化, 文件探测, 无后门, 智能学习, 机器学习, 框架集成, 检测绕过, 用户模式Hook绕过, 网络安全, 网络安全工具, 网络流量审计, 自适应系统, 蜜罐技术, 路径豁免, 逆向工具, 重训练, 隐私保护