xwaf是利用lua+nginx作为web服务接入层,结合管理平台xwaf_admin进行管理的一款轻量级低成本防火墙。
xwaf_admin管理平台的功能主要是对接入的应用,建立一套安全防护、防刷限流的规则、黑白名单等规则进行管理维护,waf防护的规则参考开发web安全项目组织【owsp】的核心规则集【crs】。nginx实例从xwaf_admin管理平台读取配置、配置及规则信息并写进nginx的内存。 该防火墙的开发思路思想借鉴了modesecurity、openresty和x-waf中的waf模块思路,并完善改良。防刷限流核心策略采用:固定窗口、令牌桶、漏桶算法,并结合当前防刷限流中的一些不足之处进行改进。
其中,xwf在工作中有进行过大范围的使用、在安全性、稳定性、性能、可用性都得到过实际验证,效果显著,其中nginx+lua采用pcre-git来进行处理,性能有了极大的提升。在部署了xwaf的nginx单个实例上,qps达到了5000+,响应及状态码、机器性能和xwaf部署前相差不大,cpu及负载甚至还有略微的降低。
主要功能简单说明如下: web防护:可以拦截简单的xss、sql注入、webshell、cc攻击、ip/ua/referer/cookie的黑白名单等。 防刷限流:对于大量爬取数据,大量IP、大量ua来刷量的情况进行拦截限制,限制抓取的频率、速度等。 报表分析:将各种攻击类型及日志入库elasticsearch进行汇总分析并画图。 日志查询:将拦截的日志入库到elasticsearch,并进行实时查询。
/usr/local/xwaf
Col1 | Col2 |
---|---|
403.html | 入侵被拦截时返回的友好提示页,默认用这页面 |
405.html | 入侵被拦截时返回的友好提示页,未使用 |
503.html | 请求被限流时返回的友好提示页 |
access.lua | nginx引入的防火墙入口文件 |
conf/appname.json | 配置接入的应用名 |
config.lua | 加载配置到内存 |
init.lua | 初始化防火墙模块 |
lib/* | lua库文件 |
nginx_xwaf.conf | nginx接入引入的配置文件 |
timer.lua | 更新防火墙配置的定时器、触发配置更新。 |
version.txt | 版本号 |
util.lua | 防火墙核心控制模块,作用是配置更新、限流拦截、日志处理、规则同步等功能 |
waf.lua | 防火墙规则控制模块,作用是用于拦截请求并进行分析,并根据防火墙规则进行处理。 |
include /usr/local/xwaf/nginx_xwaf.conf; init_worker_by_lua_file /usr/local/xwaf/timer.lua; resolver 192.168.xx.xx; 参考下图:
首先了解nginx 的请求处理的工作流程:
结合nginx的工作流程,nginx的lua模块在nginx中划分了如下8个阶段:
waf模块的工作流程如下:
1、在init_by_lua阶段读取原始默认配置,并将配置写入nginx的table和词典。
2、在set_by_lua阶段和rewrite_by_lua没有定义变量和rewrite,此阶段不做处理。
3、在access_by_lua阶段对请求头里的各个参数进行判断,判断范围包括如下几个重要的信息:【url,args,useragent,remoteaddress,x-forward-for,cookies,request_body】。当请求头里的信息是否符合定义的防火墙规则,然后再根据规则是允许还是阻止进行相应的动作。
4、结合公司的业务特色会做如下几个判断并觉得是否排除:【1】针对广告的post请求忽略,【2】针对上传文件忽略,【3】针对静态文件是否进行拦截判断,【4】针对内网请求是否进行拦截判断。
5、如果被拦截则返回403,并返回自定义返回页面。如果放行则请求进入下一阶段或者进入后端处理。
1.防刷限流的判断流程也是在access_by_lua阶段进行处理。 2.防刷限流是利用nginx的词典、固定窗口策略,通过分析请求头里的信息并利用词典进行计数统计,达到限定的阀值则返回503。 3.nginx 词典功能类似redis或mc,是一个内存型nosql的数据存储数据库,具备set过期时间的功能,利用该过期时间可以在周期范围内的请求数据量进行判断。 4.支持令牌桶、漏桶策略的防刷限流功能扩展。
1、xwaf具备在平台设置配置,定义防火墙规则、防刷限流规则,并将规则和接入的应用进行管理。而nginx+lua的客户端则需要从管理平台读取配置及规则过来写入词典和table里才能实现拦截判断。 2、对于每个接入的应用都有一个独立的应用名称。管理平台对每个独立的应用启用一套独立的防火墙配置或规则。然后再提供一个接口供nginx+lua客户端读取配置。 3、nginx+lua客户端利用timer定时器通接口进行判断配置是否更新,有更新则读取配置,没有更新则忽略。 4、nginx+lua客户端读取配置以后,将配置set进词典。 5、有些需要set进table的配置,则利用timer根据版本标签进行判断,如需更新则加载到nginx 各个worker的内存。
1、首先lua中将日志进行json序列化。 2、利用lua+kafka客户端将日志推送到kafka,日志采集支持本地文件、http、kafka。默认设置为kafka。 2、然后再利用logkit将kafka中的日志采集入库elasticsearch。
1.kibana分析拦截的信息及走势图
2.xwaf_admin中的安全分析大盘
3.线上应用存在的一些漏洞来进行测试
4.上线xwaf后的拦截效果的日志记录
5.上线xwaf后的拦截后,机器负载下降
6.上线xwaf后的拦截后,服务趋于稳定,出现超时的状态码减少
7.上线xwaf后的拦截后,总体数据汇总
答:经过大规模的应用验证,单nginx的实例【4核、4G】最高达到20w+/分的请求时,机器负载和内存占用和部署xwaf之前相差不大。
答:nginx实例在加载xwaf防火墙时、默认情况下防火墙开关是关闭的。在这种情况下是不对请求做任何的分析或拦截的。只有当nginx是从控制台读取到正确的配置时才开始工作。而当防火墙的配置或规则被加载成功以后。中途如果出现控制台挂掉无法加载配置时,就会按照上一次加载成功的配置执行。 如果控制台挂了,就会出现加载配置出错的日志打印,但不会影响服务运行。此时可以通过注释nginx中的xwaf配置,然后relod。
答:经过近一年的大规模应用情况来看,在waf拦截效果上,能有效拦截业务90%+左右的攻击,而在防刷限流上,能将原本刷量、爬虫的量拦截90%+,如果在通过精细话的规则,可以接近100%的拦截,特别是当防刷开启限制响应速度、或者开启限制带宽后,可以将对方的请求有效进行阻断,从而导致对方需要消耗更多的资源来进行爬取,这在一定程度上就进行了有效的拦截。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。