WEBKT

Envoy WASM Filter 实战:打造基于机器学习的下一代 WAF

327 0 0 0

“哥们,还在为传统 WAF 的误报和漏报头疼吗?”

“是啊,规则引擎太死板,跟不上 Web 攻击的进化速度。”

“试试 Envoy 的 WASM Filter 吧!它能让你用任何支持 WASM 的语言编写自定义安全逻辑,甚至集成机器学习模型,打造真正的下一代 WAF!”

什么是 WASM?为什么选择它?

WebAssembly(WASM)是一种可移植、体积小、加载快的二进制格式,可以在现代 Web 浏览器和服务器环境中运行。它最初是为了解决 JavaScript 在性能敏感场景下的瓶颈而设计的,但现在已经发展成为一个通用的沙盒执行环境。

选择 WASM 来扩展 Envoy 的理由有很多:

  • 性能: WASM 接近原生代码的执行速度,远超传统的脚本语言。
  • 安全: WASM 运行在沙盒环境中,与宿主环境隔离,即使 WASM 模块存在漏洞,也不会影响 Envoy 的稳定性。
  • 灵活性: 你可以用 C、C++、Rust、Go 等多种语言编写 WASM 模块,充分利用现有的代码库和工具链。
  • 生态: WASM 社区非常活跃,有大量的工具和库可供选择。

Envoy WASM Filter 架构

Envoy 通过 Filter 机制来扩展其功能。WASM Filter 是一种特殊的 Filter,它允许你加载和执行 WASM 模块,从而在请求处理流程中插入自定义逻辑。

Envoy WASM Filter 的架构大致如下:

  1. WASM 虚拟机: Envoy 内置了 WASM 虚拟机(目前支持 V8 和 Wasmtime),用于加载和执行 WASM 模块。
  2. ABI(应用程序二进制接口): Envoy 和 WASM 模块之间通过 ABI 进行通信。ABI 定义了一组函数和数据结构,用于在 Envoy 和 WASM 模块之间传递请求和响应数据,以及进行各种操作,例如访问请求头、修改响应体、发送日志等。
  3. SDK(软件开发工具包): Envoy 提供了多种语言的 SDK,用于简化 WASM Filter 的开发。SDK 封装了 ABI 的细节,提供了更友好的 API。

构建基于机器学习的 WAF

传统的 WAF 主要基于规则引擎,通过匹配预定义的规则来检测和阻止恶意请求。这种方法的缺点是规则更新滞后,容易被绕过,而且误报率较高。

基于机器学习的 WAF 则可以克服这些缺点。通过训练机器学习模型来识别恶意请求的特征,可以更准确地检测和阻止攻击,而且能够自动适应新的攻击模式。

下面我们来看看如何使用 Envoy WASM Filter 来构建一个基于机器学习的 WAF:

1. 选择机器学习框架和模型

你可以选择任何支持 WASM 的机器学习框架,例如 TensorFlow Lite、ONNX Runtime 等。选择模型时,需要考虑模型的性能、大小和准确性。对于 WAF 场景,常用的模型包括:

  • 逻辑回归: 简单、高效,适用于二分类问题。
  • 支持向量机(SVM): 在高维空间中表现良好,适用于复杂的分类问题。
  • 随机森林: 能够处理大量特征,具有较好的鲁棒性。
  • 神经网络: 能够学习复杂的非线性关系,但需要更多的计算资源。

2. 训练和导出模型

使用你选择的机器学习框架和数据集来训练模型。训练完成后,将模型导出为 WASM 兼容的格式。例如,TensorFlow Lite 模型可以导出为 .tflite 文件,ONNX 模型可以导出为 .onnx 文件。

3. 编写 WASM Filter

使用 Envoy 提供的 SDK 编写 WASM Filter。Filter 的主要逻辑包括:

  1. 加载机器学习模型: 在 Filter 初始化时,加载导出的机器学习模型。
  2. 提取请求特征: 从请求中提取用于模型推理的特征,例如 URL、请求头、请求体等。
  3. 模型推理: 使用提取的特征进行模型推理,得到预测结果。
  4. 执行安全策略: 根据预测结果执行相应的安全策略,例如允许、阻止、重定向、记录日志等。

以下是一个使用 C++ 和 Envoy Proxy WASM SDK 的示例:

#include "proxy_wasm_intrinsics.h"

#include <string>
#include <vector>

// 假设你有一个名为 MyWafModel 的类,用于加载和执行机器学习模型
class MyWafModel {
public:
 MyWafModel(const std::string& model_path) {
 // 加载模型
 }

 bool predict(const std::vector<float>& features) {
 // 执行模型推理
 return true; // 假设预测结果为 true 表示恶意请求
 }
};

class MyWafFilter : public Context {
public:
 explicit MyWafFilter(uint32_t id, RootContext* root) : Context(id, root) {}

 FilterHeadersStatus onRequestHeaders(uint32_t, bool) override {
 // 获取请求头
 auto headers = getRequestHeaderPairs();

 // 提取特征
 std::vector<float> features;
 for (auto& header : headers->pairs()) {
 // ... 提取特征,例如将请求头的值转换为数值 ...
 }

 // 模型推理
 bool is_malicious = my_waf_model_->predict(features);

 // 执行安全策略
 if (is_malicious) {
 logWarn("Malicious request detected!");
 sendLocalResponse(403, "Forbidden", "", {});
 return FilterHeadersStatus::StopIteration;
 }

 return FilterHeadersStatus::Continue;
 }

private:
 std::unique_ptr<MyWafModel> my_waf_model_;
};

class MyWafFilterRootContext : public RootContext {
public:
 explicit MyWafFilterRootContext(uint32_t id, std::string_view) : RootContext(id) {}

 bool onConfigure(size_t config_size) override {
 // 获取配置
 auto config = getConfiguration();
 // 解析配置,获取模型路径
 std::string model_path = "/path/to/your/model.tflite"; // 从配置中获取

 // 初始化模型
 my_waf_model_ = std::make_unique<MyWafModel>(model_path);

 return true;
 }

 std::unique_ptr<Context> createRootContext(uint32_t id) override {
 return std::make_unique<MyWafFilterRootContext>(id, this);
 }

 std::unique_ptr<Context> createContext(uint32_t id, RootContext* root) override {
 return std::make_unique<MyWafFilter>(id, root->getRootContext());
 }

private:
 std::unique_ptr<MyWafModel> my_waf_model_;
};

static RegisterContextFactory register_MyWafFilter("my_waf_filter", []() {
 return std::make_unique<MyWafFilterRootContext>(0, "");
});

4. 编译 WASM Filter

使用 WASM 工具链将 Filter 代码编译为 WASM 模块。例如,使用 Emscripten 编译 C/C++ 代码:

emcc -O2 -s WASM=1 -s EXPORTED_FUNCTIONS="_malloc,_free" -o my_waf_filter.wasm my_waf_filter.cpp

5. 部署 WASM Filter

在 Envoy 配置文件中配置 WASM Filter:

static_resources:
 listeners:
 - address:
 socket_address:
 address: 0.0.0.0
 port_value: 8080
 filter_chains:
 - filters:
 - name: envoy.filters.http.wasm
 typed_config:
 "@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
 config:
 name: my_waf_filter
 vm_config:
 vm_id: my_waf_vm
 runtime: envoy.wasm.runtime.v8 # 或者 envoy.wasm.runtime.wasmtime
 code:
 local:
 filename: /path/to/your/my_waf_filter.wasm
 root_id: my_waf_filter
 - name: envoy.filters.http.router
 typed_config:
 "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
 clusters:
 - name: my_service
 connect_timeout: 0.25s
 type: strict_dns
 lb_policy: round_robin
 load_assignment:
 cluster_name: my_service
 endpoints:
 - lb_endpoints:
 - endpoint:
 address:
 socket_address:
 address: 127.0.0.1
 port_value: 8081

6. 测试和调优

部署完成后,使用各种工具和方法测试 WAF 的效果,例如:

  • 模拟攻击: 使用 OWASP ZAP、Burp Suite 等工具模拟常见的 Web 攻击,检查 WAF 是否能够正确检测和阻止。
  • 性能测试: 使用 wrk、ab 等工具进行性能测试,评估 WAF 对 Envoy 性能的影响。
  • 日志分析: 分析 Envoy 的日志,检查 WAF 的误报和漏报情况,并根据分析结果调整模型和策略。

总结

Envoy WASM Filter 为构建下一代 WAF 提供了强大的支持。通过集成机器学习模型,你可以打造更智能、更灵活、更安全的 WAF,有效保护你的 Web 应用程序免受各种攻击。

“还在等什么?快来试试 Envoy WASM Filter,让你的 WAF 进化吧!”

技术老炮儿 EnvoyWASMWAF

评论点评