WFT

WAF

  • 使用Nginx+Lua实现自定义WAF(Web application firewall)

  • 最近发现使用的人越来越多了,计划开始维护和增加新功能 2020.7.29 赵班长

项目背景介绍

需求产生

由于原生态的Nginx的一些安全防护功能有限,就研究能不能自己编写一个WAF,参考Kindle大神的ngx_lua_waf,自己尝试写一个了,使用两天时间,边学Lua,边写。不过不是安全专业,只实现了一些比较简单的功能:

功能列表:

  1. 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。

  2. 支持URL白名单,将不需要过滤的URL进行定义。

  3. 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。

  4. 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。

  5. 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。

  6. 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。

  7. 支持URL参数过滤,原理同上。

  8. 支持日志记录,将所有拒绝的操作,记录到日志中去。

  9. 日志记录为JSON格式,便于日志分析,例如使用ELK进行攻击日志收集、存储、搜索和展示。

WAF实现

WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。

安装部署

以下方案选择其中之一即可:

  • 选择1: 可以选择使用原生的Nginx,增加Lua模块实现部署。

  • 选择2: 直接使用OpenResty

OpenResty安装

1 Yum安装OpenResty(推荐)

源码安装和Yum安装选择其一即可,默认均安装在/usr/local/openresty目录下。

  1. 测试OpenResty和运行Lua

  1. 测试访问

WAF部署

附录

Nginx + Lua源码编译部署(不推荐)

  1. Nginx安装必备的Nginx和PCRE软件包。

  1. 最后,创建Nginx运行的普通用户

  1. 解压NDK和lua-nginx-module

  1. 安装LuaJIT Luajit是Lua即时编译器。

  1. 安装Nginx并加载模块

如果不创建符号链接,可能出现以下异常:

  1. 测试安装

安装完毕后,下面可以测试安装了,修改nginx.conf 增加第一个配置。

然后访问http://xxx.xxx.xxx.xxx/hello 如果出现hello,lua。表示安装完成,然后就可以。

OpenResty源码编译部署(不推荐)

  1. 安装依赖软件包

  1. 安装OpenResty

2.1 下载并编译安装OpenResty

Last updated