软WAF的另一种思路:基于Openresty+Naxsi的WAF实现
字数 1460 2025-08-18 11:37:16
基于OpenResty+Naxsi的WAF实现详解
1. WAF概述
本文介绍了一种结合OpenResty(基于Nginx+Lua)和Naxsi的软WAF实现方案,通过将两种技术优势互补,构建高性能的Web应用防火墙。
1.1 技术选型背景
- 传统Lua WAF的不足:基于Lua正则匹配HTTP请求内容时,加载大量防护规则会导致Nginx性能显著下降
- Naxsi的优势:专门为WAF设计的Nginx模块,能高效处理HTTP请求内容防护策略
- Lua的优势:适合实现复杂的安全防护策略和业务逻辑
2. WAF功能架构
2.1 功能划分
Naxsi负责的防护:
- SQL注入攻击
- XSS攻击
- 目录遍历漏洞
- 命令注入攻击
- 虚拟补丁
- 扫描器攻击
Lua负责的防护:
- CC攻击防护
- 全局IP访问频率限制
- 特定URL访问频率限制
- IP黑白名单
- URL白名单
- HTTP请求转发
2.2 部署模式
- 云WAF模式部署
- 直接嵌入应用现有Nginx的方式部署
3. WAF管理后台
3.1 配置文件管理
由于使用了两个独立Nginx模块,需要两套不同的配置文件:
- Naxsi模块:防护规则以文件形式下发
- Lua模块:代码以文件形式下发
配置文件同步机制:
- WAF节点定期通过HTTP从管理端下载配置文件
- 配置文件分开存放:naxsi配置与lua代码分离
配置文件更新流程:
def check_rules():
# 检查nginx配置是否正确
check = commands.getstatusoutput("/usr/local/nginx/sbin/nginx -t")
if check[0] == 0:
pattern = re.compile(r'test is successful')
match = pattern.search(check[1])
if match:
# 更新规则文件
get_rules_file(rulesdir,naxsi_rulesfile)
naxsi_rulesfile.close()
calc_files_md5(rulesdir,naxsi_md5_file)
get_rules_file(lua_waf_dir, lua_waf_file)
lua_waf_file.close()
calc_files_md5(lua_waf_dir,lua_wafi_md5_file)
# 重载nginx
commands.getstatusoutput("/usr/local/nginx/sbin/nginx -s reload")
3.2 Naxsi配置文件结构
每个站点的naxsi配置由三个文件组成:
**_rules.conf:站点防护规则主配置**_active-mode.rules:站点防护模式配置**.rules:站点规则配置文件(主要配置白名单规则)
3.3 Lua模块配置管理
- 采用Redis+Django实现配置管理
- 通过Web管理后台直接修改配置
- 功能包括:
- WAF节点状态展示
- URL访问频率限制配置
- 站点防护功能配置
- 实时拦截情况展示
4. Naxsi配置详解
4.1 全局配置
在nginx的http段include naxsi全局配置文件:
include /path/to/rules.conf;
rules.conf文件包含:
naxsi_core.rules:核心规则doxi-rules:naxsi rules的发布版本,包括:- web_server.rules
- web_apps.rules
- scanner.rules
- app_server.rules
4.2 Server段配置
在每个server段加入:
set $naxsi_extensive_log 1; # 开启扩展日志记录
4.3 Location段配置
在每个server的location段加入:
include /etc/nginx/naxsi-rules/**_rules.conf;
4.4 拦截处理配置
在每个server加入拦截跳转配置:
location /RequestDenied {
rewrite ^ http://security.example.com/block?type=1&msec=$msec&url=$scheme://$host$request_uri redirect;
}
5. Lua配置详解
5.1 主配置文件
在nginx的http段include lua配置文件:
lua_package_path "/etc/nginx/lua_waf/?.lua;/usr/local/lib/lua/?.lua;;";
init_by_lua '
waf = require("waf");
app_name = "cc"; # 根据应用名称修改
';
init_worker_by_lua '
cron = require("cron");
';
access_by_lua_file /etc/nginx/lua_waf/access.lua;
log_by_lua_file /etc/nginx/lua_waf/sendlog.lua;
6. 日志管理
- 使用Kibana展示Naxsi拦截日志
- 可视化HTTP请求分析
7. 实现要点总结
- 性能优化:将规则匹配这种CPU密集型操作交给Naxsi处理,Lua负责复杂业务逻辑
- 配置管理:通过版本控制和MD5校验确保配置更新安全
- 模块化设计:Naxsi规则和Lua代码分离,便于维护和扩展
- 可视化监控:集成Kibana实现日志可视化分析
8. 扩展建议
- 规则自动更新:实现规则库的自动更新机制
- 机器学习集成:结合异常检测算法提高防护能力
- API安全:增加针对API的特定防护规则
- 性能监控:增加WAF自身性能监控指标
通过这种OpenResty+Naxsi的组合方案,可以在保证高性能的同时实现全面的Web应用防护。