独乐乐,不如众乐乐,分享给大家一篇WEB应用防火墙的文章,基于Lua+ Nginx实现。以下是ngx_lua_waf的作者全文输出。

Github地址:https://github.com/loveshell/ngx_lua_waf

ngx_lua_waf

ngx_lua_waf是我刚入职趣游时候开发的一个基于ngx_lua的web应用防火墙。

代码很简单,开发初衷主要是使用简单,高性能和轻量级。

现在开源出来,遵从MIT许可协议。其中包含我们的过滤规则。如果大家有什么建议和想fa,欢迎和我一起完善。

用途:

防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等

web攻击 防止svn/备份之类文件泄漏

防止ApacheBench之类压力测试工具的攻击

屏蔽常见的扫描黑客工具,扫描器

屏蔽异常的网络请求

屏蔽图片附件类目录php执行权限

防止webshell上传

推荐安装:

推荐使用lujit2.1做lua支持

ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。

使用说明:

nginx安装路径假设为:/usr/local/nginx/conf/

把ngxluawaf下载到conf目录下,解压命名为waf

在nginx.conf的http段添加


  1. lua_package_path "/usr/local/nginx/conf/waf/?.lua";

  2. lua_shared_dict limit 10m;

  3. init_by_lua_file  /usr/local/nginx/conf/waf/init.lua;

  4. access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

配置config.lua里的waf规则目录(一般在waf/conf/目录下)


  1. RulePath = "/usr/local/nginx/conf/waf/wafconf/"

绝对路径如有变动,需对应修改

然后重启nginx即可

配置文件详细说明:


  1. RulePath = "/usr/local/nginx/conf/waf/wafconf/"

  2. --规则存放目录

  3. attacklog = "off"

  4. --是否开启攻击信息记录,需要配置logdir

  5. logdir = "/usr/local/nginx/logs/hack/"

  6. --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限

  7. UrlDeny="on"

  8. --是否拦截url访问

  9. Redirect="on"

  10. --是否拦截后重定向

  11. CookieMatch = "on"

  12. --是否拦截cookie攻击

  13. postMatch = "on"

  14. --是否拦截post攻击

  15. whiteModule = "on"

  16. --是否开启URL白名单

  17. black_fileExt={"php","jsp"}

  18. --填写不允许上传文件后缀类型

  19. ipWhitelist={"127.0.0.1"}

  20. --ip白名单,多个ip用逗号分隔

  21. ipBlocklist={"1.0.0.1"}

  22. --ip黑名单,多个ip用逗号分隔

  23. CCDeny="on"

  24. --是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)

  25. CCrate = "100/60"

  26. --设置cc攻击频率,单位为秒.

  27. --默认1分钟同一个IP只能请求同一个地址100次

  28. html=[[Please go away~~]]

  29. --警告内容,可在中括号内自定义

  30. 备注:不要乱动双引号,区分大小写

检查规则是否生效

部署完毕可以尝试如下命令:


  1. curl http://xxxx/test.php?id=../etc/passwd

  2. 返回"Please go away~~"字样,说明规则生效。

注意:默认,本机在白名单不过滤,可自行调整config.lua配置

效果图如下:

规则更新:

考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和redis之类东西做动态管理。

规则更新可以把规则文件放置到其他服务器,通过crontab任务定时下载来更新规则,nginx reload即可生效。以保障ngx_lua_waf的高性能。

只记录过滤日志,不开启过滤,在代码里在check前面加上--注释即可,如果需要过滤,反之

一些说明:

过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割


  1. args里面的规则get参数进行过滤的

  2. url是只在get请求url过滤的规则    

  3. post是只在post请求过滤的规则      

  4. whitelist是白名单,里面的url匹配到不做过滤    

  5. user-agent是对user-agent的过滤规则

默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可,日志文件名称格式如下:虚拟主机名_sec.log

附:笔者已在测试环境测试,你如果有兴趣的话也可以试用一下,这只是WEB应用防火墙的一个开源实现,还有实现方案仅可应用于实战中,如果你还不了解WAF的话,建议去google下,必有不小的收获。

基于lua-nginx-module(openresty)的WEB应用防火墙的更多相关文章

  1. 用lua nginx module搭建一个二维码

    用lua nginx module搭建一个二维码(qr code)生成器 作者 vinoca 發布於 2014年10月31日 如果有VPS,或者开源的路由器,安装一个nginx,添加lua-nginx ...

  2. 基于lua+nginx的abtest系统

    指定一个参数 这个参数可以标识客户端唯一id的,比如用户id等 拿到这个id根据系统的hash算法会hash出一个bucket,目前支持的桶总数为10 根据后台设定的map关系(redis或配置文件) ...

  3. 打破基于OpenResty的WEB安全防护(CVE-2018-9230)

    原文首发于安全客,原文链接:https://www.anquanke.com/post/id/103771 0x00 前言 ​ OpenResty® 是一个基于 Nginx 与 Lua 的高性能 We ...

  4. 给lnmp一键包中的nginx安装openresty的lua扩展

    lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...

  5. 基于 orange(nginx+openresty) + docker 实现微服务 网关功能

    摘要 基于 orange(nginx+openresty) + docker 实现微服务 网关功能 ;以实现 docker 独立容器 来跑 独立语言独立环境 在 同一个授权下 运行相关组合程序..年初 ...

  6. 使用NGINX+Openresty和unixhot_waf开源防火墙实现WAF功能

    使用NGINX+Openresty实现WAF功能 一.了解WAF1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: ...

  7. Nginx、OpenResty和Kong的基本概念与使用方法

    Nginx.OpenResty和Kong的基本概念与使用方法 2018年10月10日 22:46:08 李佶澳 阅读数 322更多 分类专栏: kubernetes   版权声明:本文为博主原创文章, ...

  8. OpenResty高性能web平台

    openresty高性能web平台安装使用 简介:OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用 ...

  9. Emiller's Advanced Topics In Nginx Module Development

    Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...

随机推荐

  1. 数据绑定(十一)多路绑定MultiBinding

    原文:数据绑定(十一)多路绑定MultiBinding 有时候UI要显示的信息又不止一个数据来源决定,就需要使用MultiBinding,MultiBinding具有一个名为Bindings的属性,其 ...

  2. github page的两种类型

    1. 什么是Github ? Github 官方主页 简单说,Github是一个基于git的社会化代码分享社区. 你可以在Github上创建免费的远程仓库(remote repository),分享你 ...

  3. Qt官方对OpenSSL的编译方法的描述,单独下载的Qt library则一般不带SSL(包括QT FAQ)

    https://wiki.qt.io/MSYS2http://wiki.qt.io/Compiling_OpenSSL_with_MinGWhttps://wiki.qt.io/MinGW-64-bi ...

  4. golang1.8 通过plugin方式build so

    golang1.83只有linux下支持plugin方式生成so package main // // No C code needed. import "C" import ( ...

  5. Qt 5.9对Mac的图形显示有许多改进

    We have some platform specific improvements as well as support for new platforms and compilers comin ...

  6. SQLServer2005数据库快照的简单使用

    原文:SQLServer2005数据库快照的简单使用                                                  SQLServer2005数据库快照的简单使用 ...

  7. 有什么很好的软件是用 Qt 编写的?(尘中远)

    作者:尘中远链接:http://www.zhihu.com/question/19630324/answer/19365369来源:知乎 http://www.cnblogs.com/grandyan ...

  8. C#二分查找法 破洞百出版本

    二分查找法在数据繁多的数据中查找是一种快速的方法,每次查找最多需要的次数 为2的n次方小于总个数. 当然是有前提的,就是需要把数据先排好序,这里指的都是数值型的数据. 基本思想就是把需要找的值与排序好 ...

  9. 基于 libevent 开发的 C++ 11 高性能网络服务器 evpp(360的作品)

    evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库. 特性: 现代版的C++11接口 非阻塞异步接口都是C++ ...

  10. IntelliJ IDEA Maven工程保证JDK版本不变

    创建maven项目后修改pom文件idea会默认将jdk版本调回到1.5,这是因为没有在pom里面设置项目的jdk版本 解决方法: 在pom文件中设定jdk版本即可,以下这种写法会自动更新idea中的 ...