请选择 进入手机版 | 继续访问电脑版

Nginx使用 Lua模块实现WAF的原明白 析

[复制链接]
查看50 | 回复3 | 2021-9-13 18:59:55 | 显示全部楼层 |阅读模式
目次

前言 :近来 一段时间在写加密数据功能,对安全相干 知识还是缺少积累,偶尔 间打仗 到了WAF相干 知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下

一、WAF产生的背景

过去企业通常会采用防火墙,作为安全保障的第一道防线;当时的防火墙只是在第三层(网络层)有效 的阻断一些数据包;而随着web应用的功能越来越丰富的时间 ,Web服务器由于 其强盛 的计算本领 ,处理性能,蕴含较高的价值,成为重要 的被攻击目的 (第七层应用层)。而传统防火墙在克制 使用 应用程序弊端 举行 的攻击方面,却没有办法;在此背景下,WAF(Web Application Firewall)应运而生。

二、什么是WAF

Web 应用防火墙 (WAF-Web Application Firewall) 旨在保护 Web 应用免受各类应用层攻击,比方 跨站点脚本 (XSS)、SQL 注入,以及 cookie 中毒等。应用是您告急 数据的网关,因此针对应用发起的攻击就成为了造成弊端 的重要 缘故起因 。有了 WAF 就可以拦截一系列计划 通过入侵体系 来走漏 数据的攻击。

三、工作原理

Nginx使用

Lua模块实现WAF的原明白
析

1.用户通过欣赏 器向Web服务器发送网页哀求 。

2.用户的哀求 到达Web服务器之前,WAF对用户的哀求 举行 过滤

3.WAF拿到用户的HTTP哀求 参数去跟设置 文件定义的规则做比较(比如ip黑名单),假如 匹配上就返回403拒绝,否则就放行。

4.WEB服务器相应 用户哀求 ,把页面数据返回给用户。

四、WAF作用

waf是通过实行 一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

五、WAF和传统防火墙的区别

1.传统防火墙是工作在网络层(第三层)和传输层(第四层)

2.WAF是工作在应用层(第七层)

3.传统防火墙更多是对IP和端口举行 过滤

4.WAF是对HTTP哀求 举行 过滤,包括URL,IP,User-Agent等等

六、WAF和DDos

Nginx使用

Lua模块实现WAF的原明白
析

DDos的全称是Distributed Denial of service。重要 依靠 一组计算机来发起对一个单一的目的 体系 的哀求 ,从而造成目的 体系 资源耗尽而拒绝正常的哀求 。

根据OSI网络模子 ,最常见的DDos有三类,第三层(网络层)DDos、第四层(传输层)DDos和第七层(应用层)DDos。

WAF重要 处理第七层DDos攻击,它在处理第七层DDos攻击时会比别的 防护本领 更高效一些。WAF会对HTTP流量做详细 的分析,如许 WAF就能针对正常的访问哀求 举行 建模,然后使用 这些模子 来区分正常的哀求 和攻击者使用 机器人或者脚本触发的哀求

七、Nginx WAF功能

  • 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝(新增cdip功能支持ip段)
  • 支持URL白名单,将不必要 过滤的URL举行 定义
  • 支持User-Agent的过滤,匹配自定义规则中的条目,然后举行 处理
  • 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值(新增针对不同域名)
  • 支持Cookie过滤,匹配自定义规则中的条目,然后举行 处理
  • 支持URL过滤,匹配自定义规则中的条目,假如 用户哀求 的URL包含这些
  • 支持URL参数过滤,原理同上
  • 支持日志 记录,将全部 拒绝的操作,记录到日志 中去
  • 新增支持拉黑缓存(默认600秒)

八、Nginx Waf防护流程

  1. if whiteip() then
  2. elseif blockip() then
  3. elseif denycc() then
  4. elseif ngx.var.http_Acunetix_Aspect then
  5.     ngx.exit(444)
  6. elseif ngx.var.http_X_Scan_Memo then
  7.     ngx.exit(444)
  8. elseif whiteurl() then
  9. elseif ua() then
  10. elseif url() then
  11. elseif args() then
  12. elseif cookie() then
  13. elseif PostCheck then
复制代码
  • 检查IP白名单,通过就不检测;
  • 检查IP黑名单,不通过即拒绝;
  • 检查CC攻击,匹配即拒绝
  • 检查http_Acunetix_Aspect扫描是否开启
  • 检查http_X_Scan_Memo扫描是否开启
  • 检查白名单URL检查;
  • 检查UA,UA不通过即拒绝;
  • 检查URL参数检查;
  • 检查cookie;
  • 检查post;

九、基于Nginx实现的WAF

9.1安装依靠 包

  1. yum -y install gcc gcc-c++ autoconf automake make unzip
  2. yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
复制代码

9.2安装LuaJIT2.0

LuaJIT是Lua的即时编译器,简单来说,LuaJIT是一个高效的Lua假造 机。

  1. # 进入目录
  2. cd /usr/local/src/
  3. # 下载LuaJIT2.0
  4. wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
  5. # 解压
  6. tar xf LuaJIT-2.0.5.tar.gz && cd LuaJIT-2.0.5
  7. # 编译
  8. make
  9. # 安装
  10. make install PREFIX=/usr/local/lj2
  11. # 建立软连接
  12. ln -s /usr/local/lj2/lib/libluajit-5.1.so.2 /lib64/
  13. # 添加环境变量
  14. export LUAJIT_LIB=/usr/local/lj2/lib/
  15. export LUAJIT_INC=/usr/local/lj2/include/luajit-2.0/
复制代码

9.3安装ngx_devel_kit

kit模块是一个拓展nginx服务器核心功能的模块,第三方模块开发 可以基于它来快速实现。

  1. # 进入目录
  2. cd /user/local/src/
  3. # 下载v0.3.0.tar.gz
  4. wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz -O ngx_devel_kit.tar.gz
  5. # 解压
  6. tar xf ngx_devel_kit.tar.gz
复制代码

9.4安装lua-nginx-module

ngx_lua_module 是一个nginx http模块,它把 lua 分析 器内嵌到 nginx,用来分析 并实行 lua 语言编写的网页后台脚本。

ngx_lua模块的原理

  1. 1. 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
  2. 2. 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
  3. 3. 每个外部请求都由一个Lua协程处理,协程之间数据隔离;
  4. 4. Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
  5. 5. I/O等异步操作完成时还原相关协程上下文数据,并继续运行
复制代码

安装

  1. # 进入目录
  2. cd /user/local/src/
  3. # 下载v0.10.9rc7.tar.gz
  4. wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
  5. # 解压
  6. tar -xzvf v0.10.9rc7.tar.gz
复制代码

9.5安装Nginx

  1. # 进入目录
  2. cd /user/local/src/
  3. # 下载
  4. wget http://nginx.org/download/nginx-1.21.0.tar.gz
  5. # 解压
  6. tar xf nginx-1.21.0.tar.gz
  7. # 进入nginx目录
  8. cd nginx-1.21.0
  9. # 编译
  10. ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --with-stream
  11. # 安装
  12. make && make install
  13. # 添加nginx配置,在server块里添加下面内容
  14. [root@localhost_test_192.168.10.132 11:04:48 ~]# vim /usr/local/nginx/conf/nginx.conf
  15. location /lua {
  16. default_type 'text/plain';
  17. content_by_lua 'ngx.say("hello, lua")';
  18. }
  19. # 检查语法
  20. [root@localhost_test_192.168.10.132 09:59:33 /usr/local/src]# nginx -t
  21. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  22. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  23. # 启动
  24. [root@localhost_test_192.168.10.132 11:08:35 ~]# nginx
  25. # 测试
  26. curl 127.0.0.1:80/lua
复制代码

9.6安装ngx_lua_waf

  1. # 进入目录
  2. cd /user/local/src/
  3. # 把ngx_lua_waf下载到conf目录下
  4. wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
  5. # 解压命名为waf
  6. unzip master.zip -d /usr/local/nginx/conf/
  7. # 更改目录名
  8. mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf
  9. # 在nginx.conf的http段添加
  10. lua_package_path "/usr/local/nginx/conf/waf/?.lua";
  11. lua_shared_dict limit 10m;
  12. init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
  13. access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
  14. # 在nginx.conf最外层添加用户运行
  15. user www;
  16. # 创建日志目录
  17. mkdir /usr/local/nginx/logs/hack
  18. chown www /usr/local/nginx/logs/hack
  19. # Lua_waf 配置
  20. [root@localhost_test_192.168.10.132 11:33:53 /usr/local/nginx/conf/waf]# cat config.lua
  21. # 规则存放路径
  22. RulePath = "/usr/local/nginx/conf/waf/wafconf/"
  23. # 是否开启攻击信息记录,需要配置logdir
  24. attacklog = "on"
  25. # log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
  26. logdir = "/usr/local/nginx/logs/hack/"
  27. # 是否拦截url访问
  28. UrlDeny="on"
  29. # 是否拦截后重定向
  30. Redirect="on"
  31. # 是否拦截cookie攻击
  32. CookieMatch="on"
  33. # 是否拦截post攻击
  34. postMatch="on"
  35. # 是否开启URL白名单
  36. whiteModule="on"
  37. # 填写不允许上传文件后缀类型
  38. black_fileExt={"php","jsp"}
  39. # ip白名单,多个ip用逗号分隔
  40. ipWhitelist={"127.0.0.1"}
  41. # ip黑名单,多个ip用逗号分隔
  42. ipBlocklist={"192.168.10.1"}
  43. # 是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
  44. CCDeny="off"
  45. # 设置cc攻击频率,单位为秒.
  46. # 默认1分钟同一个IP只能请求同一个地址100次
  47. CCrate="100/60"
  48. # 告警内容
  49. html= []
  50. # 规则文件
  51. [root@localhost_test_192.168.10.132 11:42:12 /usr/local/nginx/conf/waf]# ll wafconf/
  52. total 24
  53. -rw-r--r-- 1 root root 749 Apr 6 2016 args
  54. -rw-r--r-- 1 root root 652 Apr 6 2016 cookie
  55. -rw-r--r-- 1 root root 733 Apr 6 2016 post
  56. -rw-r--r-- 1 root root 335 Apr 6 2016 url
  57. -rw-r--r-- 1 root root 177 Apr 6 2016 user-agent
  58. -rw-r--r-- 1 root root 8 Apr 6 2016 whiteurl
  59. args里面的规则get参数进行过滤的
  60. cookie是对请求过滤的cookie过滤
  61. url是只在get请求url过滤的规则
  62. post是只在post请求过滤的规则
  63. whiteurl是白名单,里面的url匹配到不做过滤
  64. user-agent是对user-agent的过滤规则
  65. # 加载Nginx
  66. [root@localhost_test_192.168.10.132 11:32:41]# nginx -s reload
复制代码

9.7测试结果   

访问带有参数的URL

  1. <a rel="external nofollow" target="_blank" href="http://192.168.10.132/?id=<script">http://192.168.10.132/?id=<script</a> 
复制代码

Nginx使用

Lua模块实现WAF的原明白
析

总结:Nginx使用 Lua模块实现WAF的功能很强盛 ,可以对代码举行 修改二次开发 ,修改成为本身 想要的结果 ,不妨试试看看 

到此这篇关于Nginx使用 Lua模块实现WAF的原理分析 的文章就先容 到这了,更多相干 Nginx实现WAF内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 找食的麻雀粮 | 2021-10-1 22:08:56 | 显示全部楼层
admin楼主的等级很高啊!
回复

使用道具 举报

avatar 刘金栋 | 2021-10-7 00:46:21 | 显示全部楼层
看在admin楼主的面子上,认真回帖!
回复

使用道具 举报

admin楼主发几张靓照啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则