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

  1. 性能优势:相比原生Nginx,OpenResty性能更优
  2. 开发便利:Lua脚本语言比C语言更易编写和维护
  3. 功能强大:支持复杂的处理场景
  4. 兼容性:本质仍是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 配置说明

  1. lua_ssl_trusted_certificate:指定受信任CA证书的文件路径
  2. lua_ssl_verify_depth:设置服务器证书链中的验证深度
  3. lua_shared_dict:声明共享内存区域,用于存储变量字典数据
  4. rewrite_by_lua_no_postpone:控制rewrite_by_lua的执行时机
  5. 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配合以下插件:

  1. Lua插件:用于语法高亮和语法说明
  2. 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参考

  1. jxwaf:本文主要分析的WAF实现
  2. openstar:另一个流行的开源WAF
  3. ngx_lua_waf:基于Nginx+Lua的WAF

7. 开发建议

  1. 性能优化:充分利用共享内存减少磁盘I/O
  2. 阶段选择:根据功能需求选择合适的处理阶段
  3. 规则管理:设计灵活的规则加载机制
  4. 调试技巧:开发时可关闭lua_code_cache方便调试
  5. 安全考虑:注意Lua脚本的安全性,避免注入漏洞

8. 进阶主题

  1. 多阶段协同:如何在不同阶段间传递数据
  2. HTTPS处理:ssl_certificate_by_lua*的深入使用
  3. 负载均衡:balancer_by_lua*的实现
  4. 响应处理:header_filter_by_lua和body_filter_by_lua的应用
  5. 日志分析:log_by_lua*的高级用法

通过掌握这些知识,您将能够基于OpenResty开发出高性能、可维护的WAF系统。

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 关键配置指令 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) 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 测试配置 5.2 测试Lua脚本(test.lua) 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系统。