WAF代码剖析之初识openresty
字数 1937 2025-08-15 21:32:10
OpenResty WAF开发指南
1. OpenResty简介
OpenResty是一个基于Nginx与Lua的高性能Web平台,它集成了大量精良的Lua库、第三方模块以及大多数依赖项。OpenResty通过Lua脚本语言扩展了Nginx的功能,使其能够处理更复杂的业务场景。
1.1 为什么选择OpenResty开发WAF
- 性能优势:相比原生Nginx,OpenResty性能更优
- 开发便利:Lua脚本语言比C语言更易编写和维护
- 功能强大:支持复杂的处理场景
- 兼容性:本质仍是Nginx,兼容现有Nginx生态
2. OpenResty处理阶段
OpenResty有11个处理流程阶段,理解这些阶段对于WAF开发至关重要:
| 阶段 | 作用域 | 功能作用 |
|---|---|---|
| init_by_lua* | http | 初始化Nginx和预加载Lua(nginx启动和reload时执行) |
| init_worker_by_lua* | http | 每个工作进程被创建时执行,用于启动定时任务 |
| ssl_certificate_by_lua* | server | 对HTTPS请求的处理 |
| set_by_lua* | server, location | 流程分支处理判断变量初始化 |
| rewrite_by_lua* | http, server, location | 转发、重定向、缓存等功能 |
| access_by_lua* | http, server, location | 内容处理(WAF规则处理) |
| content_by_lua* | location | 内容生成,相当于response |
| balancer_by_lua* | upstream | 负载均衡 |
| header_filter_by_lua* | http, server, location | 对响应头(headers)进行处理 |
| body_filter_by_lua* | http, server, location | 对响应体(body)进行处理 |
| log_by_lua* | http, server, location | 日志记录 |
3. WAF开发配置详解
3.1 关键配置指令
lua_ssl_trusted_certificate /etc/pki/tls/certs/ca-bundle.crt;
lua_ssl_verify_depth 3;
lua_shared_dict limit_req 100m;
lua_shared_dict limit_req_count 100m;
lua_shared_dict limit_attack_ip 100m;
lua_shared_dict limit_bot 100m;
lua_shared_dict waf_common_conf 100m;
lua_shared_dict black_attack_ip 100m;
rewrite_by_lua_no_postpone on;
lua_code_cache on;
3.2 配置说明
- lua_ssl_trusted_certificate:指定受信任CA证书的文件路径
- lua_ssl_verify_depth:设置服务器证书链中的验证深度
- lua_shared_dict:声明共享内存区域,用于存储变量字典数据
- rewrite_by_lua_no_postpone:控制rewrite_by_lua的执行时机
- lua_code_cache:开发时可关闭以实时更新代码,生产环境必须开启
4. 开发环境搭建
4.1 OpenResty安装(CentOS 7)
yum install -y readline-devel pcre pcre-devel openssl openssl-devel gcc curl GeoIP-devel wget
wget https://openresty.org/download/openresty-1.15.8.3.tar.gz
tar -xvf openresty-1.15.8.3.tar.gz
cd openresty-1.15.8.3
./configure -j2
make -j2
make install
4.2 Windows安装
下载Windows版本:https://openresty.org/download/openresty-1.15.8.3-win64.zip
4.3 开发工具
推荐使用VSCode配合以下插件:
- Lua插件:用于语法高亮和语法说明
- Lua Debug:用于调试和运行Lua代码
5. 测试示例
5.1 测试配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
lua_code_cache off;
server {
location /test {
default_type 'text/plain';
content_by_lua_file 'D:/waf/test.lua';
}
}
}
5.2 测试Lua脚本(test.lua)
local name = "Anonymous"
ngx.say("Hello, ", name, "!")
ngx.say("test")
6. 开源WAF参考
- jxwaf:本文主要分析的WAF实现
- openstar:另一个流行的开源WAF
- ngx_lua_waf:基于Nginx+Lua的WAF
7. 开发建议
- 性能优化:充分利用共享内存减少磁盘I/O
- 阶段选择:根据功能需求选择合适的处理阶段
- 规则管理:设计灵活的规则加载机制
- 调试技巧:开发时可关闭lua_code_cache方便调试
- 安全考虑:注意Lua脚本的安全性,避免注入漏洞
8. 进阶主题
- 多阶段协同:如何在不同阶段间传递数据
- HTTPS处理:ssl_certificate_by_lua*的深入使用
- 负载均衡:balancer_by_lua*的实现
- 响应处理:header_filter_by_lua和body_filter_by_lua的应用
- 日志分析:log_by_lua*的高级用法
通过掌握这些知识,您将能够基于OpenResty开发出高性能、可维护的WAF系统。