NGWAF 由 @yupengfei、@zhangbosen、@matthewng 和 @elizabethlim 创建。
特别感谢 @ruinahkoh 在 NGWAF 初始阶段所做的贡献。
NGWAF 是一个实验性概念验证,目前尚未准备好投入生产使用。
目录
自21世纪初以来,随着Web应用的爆炸式增长,基于Web的攻击也日益猖獗。一种常见的解决方案是Web应用防火墙(WAF)。然而,调整当前WAF的规则以改进检测机制可能复杂且困难。NGWAF旨在通过一种新颖的机器学习和隔离到蜜罐架构来解决这些缺点。
受运营WAF时实际痛点的启发,NGWAF旨在通过以下流程简化并重新构想WAF操作:
| 痛点 | NGWAF 特性 |
|---|---|
| 检测机制和规则的维护可能很复杂 | 利用机器学习来自动化创建和更新检测机制的过程 |
| 立即阻止恶意流量减少了从威胁行为者行为中学习以改进未来WAF的机会 | 通过重定向隔离消除威胁,而非传统的丢弃和阻止恶意流量 |
为了简化部署并使其可移植,我们使用docker将架构中的不同组件容器化,并在docker-compose文件中进行了配置。这使得在新安装系统上运行变得快速而简单,因为依赖项由docker自动处理。该部署可以扩展为部署到本地或云提供商的kubernetes集群中,从而使其具有可扩展性,用户可以通过增加节点/容器(pod)数量来处理大量流量。
该部署已在 macOS(Docker Desktop)和 Linux(Ubuntu)上测试。
NGWAF 开箱即用,包含三个关键组件,这些组件如上所述均已容器化,并且可根据预期用途进行扩展。 受保护的资源可以通过在设置中进行部署更改来自定义。
NGWAF 的高层架构,展示了不同参与方的预期流量流向
NGWAF 的设计考虑了以下关键用户优势:
NGWAF 用深度学习模型取代了传统的规则集,以降低管理和更新规则的复杂性。NGWAF 的机器学习不是手动编辑规则,而是自动从恶意数据中学习模式。从隔离环境中收集的数据会自动清洗并分批处理,如果需要,可以重新训练到我们的检测模型中。
NGWAF 采用了一种新颖的架构,包含一个交互式隔离环境,用于隔离潜在的攻击者。与传统WAF在检测到威胁时直接阻止不同,NGWAF 将威胁行为者引导至仿真系统,将其困住以减轻其恶意行为的影响。该环境还充当收集当前攻击方法的陷阱,从而能够观察和收集恶意数据。这些数据可用于进一步提高 NGWAF 的检测能力。
NGWAF 运行中:检测到 SQL 注入后,NGWAF 将攻击重定向到我们的隔离环境,而不是丢弃或阻止该尝试。
创建 NGWAF 的指导原则是防范开放Web应用程序安全项目(OWASP)标准意识文档 The OWASP Top 10 2021 中强调的风险。
NGWAF 的训练数据和合规性检查均基于此要求进行收集和执行。
有了神经网络,谁还需要手动操作
传统的规则集需要分析师随着时间的推移手动识别和添加规则,而 NGWAF 则利用端到端的机器学习管道进行检测,大大降低了 WAF 规则管理的复杂性,尤其是在检测复杂负载时。
为此,我们首先需要创建一个基础模型和架构,供用户开始使用,之后用户可以使用从自己应用收集的数据进行重新训练和微调:
基础模型的通用架构是一个带双向LSTM模块的简单RNN,如下所示:
图片来自 Tensorflow(链接)
通过使用这种RNN架构,我们在性能上比简单模型有所提升:
| 模型架构 | 准确率 | F1 分数 |
|---|
尽管我们包含了来自各种应用的日志以提高基础模型的泛化能力,但进一步的模型维护和重新训练对于以下方面至关重要:
为了解决这个问题,NGWAF 的用户受益于我们打包的端到端模型重新训练管道,可以通过几个简单的步骤轻松触发模型维护,而无需深入研究底层细节。(参见下面的第3节)。
别让他们走,拘留他们!
与传统的WAF在检测到恶意流量时直接阻止或丢弃不同,NGWAF 采取更灵活的方法。它将恶意行为者重定向并拘留在一个隔离环境中。该环境包含各种交互式仿真蜜罐,以尝试收集更多的攻击方法/数据,这些数据将用于潜在地提高 NGWAF 对更现代和复杂攻击的检测率。
目前,NGWAF 的隔离环境会将被困攻击者提交的所有数据转发到我们的 ELK 堆栈进行分析和可视化。 数据会被自动清洗为 HTTP 请求的不同组件,然后以 JSON 格式在环境的后端内部打包,之后再转发。 这有助于降低在启动重新训练过程时清理和索引数据所需的人力成本。
NGWAF 目前允许用户更改隔离环境中蜜罐的前端外观(基于 Drupot 的自定义版本)。用户只需将 docker volume 中的 assets 文件夹替换为他们选择的前端资源即可。
NGWAF 也允许用户将自有的蜜罐作为隔离环境的一部分进行链接。用户只需将蜜罐的 HTTP 请求转发到环境的后端服务器(后端进程会自动清洗数据并将其转发到分析仪表板 - ELK 堆栈)。
不学习就不算真正的聪明
随着新的负载和攻击向量不断出现,为了确保安全,升级检测能力至关重要。因此,NGWAF 内置了一个重新训练功能,以确保防御者能够训练机器学习模型来检测这些更新的负载。即使不熟悉数据科学或神经网络,用户也能通过这个简单界面微调模型,因为复杂的步骤已经由系统处理。
用户只需上传一小部分来自自己实时系统的已标记数据(例如,几千条),这些数据将用于在后端微调现有模型:
训练完成后,用户还会收到一些简要的模型诊断信息(例如,在测试集上的性能以及在不同分数阈值下的表现),以评估新模型。
要触发重新训练过程,请访问仪表板并按照以下步骤操作:
创建一个用于上传的新数据集(.csv),包含以下列:
payload [str]:这应该是来自你系统的负载,或一些基于字符串的示例(例如 SQL 注入示例)label [int]:非恶意示例为 0,恶意示例为 1is_url [bool]:如果负载来自你的系统(即包含路径和设备等其他系统信息),则为 TRUE;如果是基于字符串的示例(例如 "1==1"),则为 FALSE导航到 http://localhost:8088 查看 NGWAF 管理面板。
选择“导入数据集”选项卡,上传你创建的训练集。
NGWAF 使用 ELK 堆栈捕获通过 NGWAF 的网络数据日志,允许用户监控通过 NGWAF 的流量以进行进一步分析。
NGWAF 还带有实时 Telegram 通知,以通知所有者 NGWAF 检测到的实时恶意威胁。
已测试的操作系统
在运行 Docker 的情况下,使用以下命令运行以下文件:
./run.sh
要替换目标,请将 /waf/WafApp/waf.py 文件中的 dest_server 和 honey_pot_server 变量指向正确的目标:
# 替换我
dest_server = "dvwa"
honey_pot_server = "drupot:5000"
一旦 Docker 容器启动,你可以访问本地主机,以下端口正在运行这些服务:
还需要在 waf-secrets.env 文件中设置以下内容:
# ML 模型 API 端点
API_ENDPOINT="https://xxxxx.xxx"
API_KEY="******************"
# Telegram 配置
TELEGRAM_CHAT_ID="-57893457893457345"
TELEGRAM_TOKEN="******************"
同时需要在 waf-admin-secrets.env 文件中设置以下内容:
# ML 模型 API 端点
API_ENDPOINT="https://xxxxxx.xxx"
API_KEY="******************"
BUCKET_NAME="******************"
ACCESS_KEY_ID="******************"
SECRET_ACCESS_KEY="******************"
SQL_USERNAME="******************"
SQL_PASSWORD="******************"
SQL_SERVER="******************"
SQL_DATABASE_NAME="******************"
NGWAF 是一个正在进行的开源项目,功能和特性可能会在每次补丁中发生变化。 如果你有兴趣贡献,请随时创建 issue 或 pull request!
| 我们的最终模型 | 0.995 | 0.993 |
| 无LSTM模块的神经网络 | 0.956 | 0.891 |
| 决策树 | 0.878 | 0.840 |
| 逻辑回归 | 0.946 | 0.914 |
| 端口 | 服务 | 备注 | 凭据(如有) |
|---|
| 8080 | DVWA | WAF 所在位置 | admin:password |
| 5601 | Elasticsearch | 查看日志 | elastic:changeme |
| 8088 | 管理仪表板 | 管理 WAF 模型的仪表板 | |
| 5001 | Drupot | 蜜罐 |