赛题回顾
赛题链接:https://tianchi.aliyun.com/competition/entrance/532104/information
本赛题提到的安全防护能力一共包含 3 种功能:
- IP 黑名单防护
- CC 防护
- WAF 规则防护
参赛者可以选择实现一个或多个功能,对于每个功能可以分别开发一个对应的 Wasm 插件来实现。
在赛题说明中,对于每种功能,均给出了示例配置,我们的评分程序会按照示例配置的格式生成评测用的配置,然后发起 HTTP 请求去验证各类防护能力是否如配置指定的那样生效。
在功能生效的基础上,评分程序会继续考量插件的性能,主要看 CPU 和内存这两个指标。需要注意的是 Wasm 插件的内存限制只有 1 G,如果插件内存使用不当,将导致插件功能失效,也将失去功能分。
Wasm 插件可以使用 Rust/Go/C++/AssemblyScript 等语言编写,需要注意使用 Go 或者 AssemblyScript 编写时将存在额外的 GC 开销,会消耗更多的 CPU 资源。
Higress 提供了 Rust/Go/C++ 的 Wasm SDK,可以参考以下链接:
Rust SDK:https://github.com/alibaba/higress/tree/main/plugins/wasm-rust
Go SDK:https://github.com/alibaba/higress/tree/main/plugins/wasm-go
C++ SDK:https://github.com/alibaba/higress/tree/main/plugins/wasm-cpp
Wasm 插件机制简介
Higress 底层使用了 Envoy 引擎,在 Envoy Wasm 的基础上做了一些改造,从而实现插件可以路由/域名级生效,但 Wasm 插件本身依赖的 ABI 接口和 Envoy 是完全一致的,即 Proxy Wasm 规范,可以参考这份文档了解 Envoy 中 Wasm 的实现原理:
https://github.com/proxy-wasm/spec/blob/master/docs/WebAssembly-in-Envoy.md
Proxy Wasm 的 ABI 描述可以参考这份文档:
https://github.com/proxy-wasm/spec/tree/442687bb307ea7c701d5744b3f0f3e8308010238/abi-versions/vNEXT
不同语言的 SDK 其实就是这份 ABI 的实现。这份 ABI 实现核心分为两部分:
- Functions implemented in the host environment(Host Function):在 Envoy 侧实现的 Function 需要导出给 Wasm 模块使用
- Functions implemented in the Wasm module(Module Function):在 Wasm 模块侧实现的 Function 需要导出给 Envoy 使用
举两个 Function 例子:
- proxy_on_http_request_headers: 这个是 Wasm 模块提供的函数(Module Function),Envoy 将在接收到 HTTP 请求头后回调这个函数
- proxy_dispatch_http_call:这个是 Envoy 侧提供的函数(Host Function),Wasm 实现逻辑时可以调用这个函数来实现基于 Envoy 内 eventloop 机制的异步 HTTP 调用
功能实现提醒
IP 黑名单防护
实现该功能需要关注以下几个点:
- 测试时 IP 从 x-real-ip 请求头中解析
- IP 格式可能同时存在 IPv4 和 IPv6
- 评测配置将使用大批量 IP 数据,需要使用合理的数据结构存储,降低内存使用,简单粗暴的 kv map 存储将导致内存耗尽
CC 防护
实现该功能需要关注以下几个点:
- 插件最多使用 1G 内存,需要有 LRU 策略,分配一块固定的内存来统计不同 key 的访问频率,否则也将导致评测过程中内存耗尽
- 超过限制后屏蔽调用方指定时间的机制,其实就是将指定 key 放入小黑屋一段时间,可以基于 proxy wasm ABI 中 Host Function 里的 proxy_on_tick 来实现
WAF 规则防护
实现该功能需要关注以下几个点:
- 该功能实现复杂度相对较高,我们提供了基于 Go 语言的 demo,但该 demo 的性能是比较差的,如果使用 Rust/C++ 实现,性能分将远超 Go 的版本
- 这个插件无需包含配置解析逻辑,评测程序将使用 OWASP 测试集对插件防护能力进行全面评测
- 使用高性能的正则库,将对插件性能提升有较大帮助