独乐乐,不如众乐乐,分享给大家一篇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. SVG路径动画解密

    原文:SVG路径动画解密 原文链接:http://www.gbtags.com/gb/share/5581.htm SVG路径动画效果现在貌似越来越多网站都使用了,给我的感觉就像是一段时间的流行而已, ...

  2. Go 的文件系统抽象 Afero

    Afero 是一个文件系统框架,提供一个简单.统一和通用的 API 和任何文件系统进行交互,作为抽象层还提供了界面.类型和方法.Afero 的界面十分简洁,设计简单,舍弃了不必要的构造函数和初始化方法 ...

  3. redis的简介和使用

    简介 redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统,它经常被拿来和Memcached相比较,但是Memcached不 ...

  4. sklearn文本特征提取——TfidfVectorizer

    什么是TF-IDF IF-IDF(term frequency-inverse document frequency)词频-逆向文件频率.在处理文本时,如何将文字转化为模型可以处理的向量呢?IF-ID ...

  5. UAC就不能一次添加、永久信任吗?

    每次都要点击确定,感觉好麻烦. 而且阻碍了某些功能的实现.

  6. Qt使用windows API获取程序运行时占用内存 good

    使用的是psapi.h中的GetProcessMemoryInfo函数,但是运行到该函数时就强制退出了. 后来,百度到原因是 原来Qt编译时加了-mthread,createprocess时要使的Ha ...

  7. C++的标准库函数默认都是操作字节,而不是字符,非常痛苦,所以引入了u16string和u32string(Linux上的wchar_t是32位的原因,utf16对unicode的支持是有缺陷的)good

    时至今日,字符串使用unicode已经是不需要理由的常识,但对一些有着悠久历史的编程语言来说,这仍然是个头痛的问题.如果抛开第三方库的支持,C++其实并不能实际有效地支持unicode,即使是utf8 ...

  8. c# log4net 配置使用

    新增配置文件log4net.config,内容如下 <?xml version="1.0" encoding="utf-8" ?> <conf ...

  9. SYN5104型 时间综合测试仪

    SYN5104型  时间综合测试仪 gps时钟测试仪时间/频率测量仪器使用说明视频链接: http://www.syn029.com/h-pd-73-0_310_6_-1.html 请将此链接复制到浏 ...

  10. 数据管理工具Flux、Redux、Vuex的区别

    目录 为什么要进行数据管理? 怎么有效地进行数据管理? 数据管理工具 1. Flux 2. Redux 3. Vuex 使用数据管理工具的场景 相关资料 主要讲解一下前端为什么需要进行数据管理,有效的 ...