当前位置: 首页 > 科技观察

ngx_lua_waf适配多站点情况的研究

时间:2023-03-18 21:51:34 科技观察

0x00前言在之前的文章《基于ngx_lua模块的waf开发实践》(链接:http://drops.wooyun.org/tips/5136)中,提出了三个后续研究方向,其中一个是多站点下waf分离的研究,现在把这个研究分享给大家。0x01问题分析最初的思路是直接在nginx中配置多个站点,然后在每个站点加载一个waf代码。流程图如下:这种情况下,如果站点很多,nginx配置会比较乱,当nginx配置多个站点时,会出现一些问题。这里借用安宝的一张对照表来说明一下。当然在实际应用中,一般不会应用到那么多站点,这里只是做个说明。但上述问题确实存在。0x02需求分析需求一:nginx只能监控一个站点,所有站点都可以转发需求二:每个站点都可以独立控制,包括waf开发,日志切换,使用规则0x03需求实现基于需求一,流程图表如下:nginx.conf关键代码:waf.lua关键代码:访问流程分析:当用户访问waf服务器时,首先获取host参数,根据url配置查询对应的upstream,给出预定义的变量$upstream,从而达到正确转发的目的。而且网站信息也可以后期先存入数据库,第一次访问时再加载到内存中,从而达到动态加载的目的。对于需求2:URL配置代码如下:规则配置代码如下:这样每个网站都可以配置一个单独的规则集,在URL配置中指定。在URL配置中,可以指明每个网站的waf开关,是否记录日志,采用什么规则。在规则配置中,您可以指定是允许还是阻止规则,以及启用或禁用日志。0x04需要解决后续问题。这种方式对于站点来说是一个不错的思路,但是这种方式还是依赖于在nginx中配置各个站点的upstream,后续考虑直接在lua代码中配置。对于多站点的情况,***可以与数据库结合,将网站信息存储在数据库中,实现动态加载。nginx的每一次变化,都需要重新加载。后面考虑写一个控制页面动态控制,比如开启或关闭规则,显示waf的各种状态,处理和显示日志等。当然不是我想出来的,也是参考了各种资料。最重要的是在现在大流量大并发的网络环境下,包括我们公司在内的很多公司都有这样的需求,所以分享出来,希望分享给更多的人交流,学习。