Nginx添加开源防火墙(waf)防护

Nginx添加开源防火墙(waf)防护
王先森项目背景介绍
需求产生
由于原生态的Nginx的一些安全防护功能有限,就研究能不能自己编写一个WAF,参考Kindle大神的ngx_lua_waf,自己尝试写一个了,使用两天时间,边学Lua,边写。不过不是安全专业,只实现了一些比较简单的功能:
功能列表:
- 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
- 支持URL白名单,将不需要过滤的URL进行定义。
- 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
- 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
- 支持URL参数过滤,原理同上。
- 支持日志记录,将所有拒绝的操作,记录到日志中去。
- 日志记录为JSON格式,便于日志分析,例如使用ELK进行攻击日志收集、存储、搜索和展示。项目背景介绍
WAF实现
WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。
安装部署
以下方案选择其中之一即可:
- 选择1: 可以选择使用原生的Nginx,增加Lua模块实现部署。
- 选择2: 直接使用OpenResty
Nginx + Lua源码编译部署
准备必备Nginx环境
1 | mkdir /server/tools -p |
解压NDK和lua-nginx-module
1 | tar zxvf v0.3.1.tar.gz |
安装LuaJIT
1 | tar zxvf LuaJIT-2.0.5.tar.gz |
安装Nginx并加载模块
1 | tar xf nginx-1.20.1.tar.gz |
报错:
1 | 如果不创建符号链接,可能出现以下异常: |
测试安装
安装完毕后,下面可以测试安装了,修改nginx.conf 增加第一个配置。
1 | location /hello { |
启动nginx
1 | /application/nginx-1.20/sbin/nginx -t |
浏览器访问
然后访问http://10.1.1.10/hello 如果出现hello,lua。表示安装完成,然后就可以。
WAF部署
1 | git clone https://github.com/5279314/waf.git |
重启
1 | /application/nginx-1.20/sbin/nginx -t |
实现效果
攻击日志存放目录
1 | cat /tmp/2022-08-15_waf.log |
OpenResty安装
Yum安装OpenResty(推荐)
源码安装和Yum安装选择其一即可,默认均安装在/usr/local/openresty目录下。
1 | [root@opsany ~]# vim /etc/yum.repo.d/openresty.repo |
测试OpenResty和运行Lua
[root@opsany ~]# vim /usr/local/openresty/nginx/conf/nginx.conf
#在默认的server配置中增加
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty-1.19.9.1/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty-1.19.9.1/nginx/conf/nginx.conf test is successful
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果