一、概述
ngx_lua_waf是一个基于ngx_lua开源强大的Web应用轻量级防火墙,它可以帮助我们提高网站的安全性和防护能力。通过安装和配置ngx_lua_waf,我们可以轻松地定制安全规则,实现灵活的安全防护。同时,WAF的实时日志记录和报警功能可以帮助我们及时发现和处理安全问题。
二、安装与使用
ngx_lua_waf使用需要基于openresty,传统的nginx对模块扩展能力支持比较弱。
1.安装openresty
建议基于源码安装(如果需要新的模块,直接重新编译即可)。
安装相关依赖:
yum install pcre-devel openssl-devel gcc curl libmaxminddb-devel -y
编译安装openresty:
mkdir -p /opt/tools/openresty
cd /opt/tools/openresty/
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
tar -xzvf openresty-1.21.4.1.tar.gz
cd openresty-1.21.4.1/
sudo ./configure
sudo make
sudo make install
useradd -m nginx
sudo usermod -a -G root nginx
配置openresty环境变量,这样就不用到sbin目录执行命令了.
vim /etc/profile
export PATH=/usr/local/openresty/nginx/sbin:$PATH
# wq保存
source /etc/profile
nginx -V
nginx -t
启动openresty:
nginx
2.安装配置ngx_lua_waf
安装依赖和编译工具:
yum install epel-release -y
yum group install "Development Tools" -y
下载ngx_lua_waf:
cd /usr/local/openresty/nginx/conf
git clone https://github.com/loveshell/ngx_lua_waf.git
mv ngx_lua_waf/ waf/
在openresty的主配置文件nginx.conf的http模块添加如下配置:
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/openresty/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/openresty/nginx/conf/waf/waf.lua;
这里需要注意的是,如果有多个lua_package_path路径,不能写多个,否则会报错lua_package_path路径重复,需要用;;隔开:
lua_package_path "/usr/local/openresty/lualib/?.lua;;/usr/local/openresty/nginx/conf/waf/?.lua;;";
修改ngx_lua_waf的配置文件:
vim /usr/local/openresty/nginx/conf/waf/config.lua
# 规则文件路径
RulePath = "/usr/local/openresty/nginx/conf/waf/wafconf/"
# 启用日志
attacklog = "on"
# 防护记录日志目录
logdir = "/usr/local/openresty/nginx/logs/hack/"
#开启拦截 cc 攻击
CCDeny="on"
#默认 1 分钟同一个 IP 只能请求同一个地址 100 次
CCrate="100/60"
创建日志目录:
mkdir -p /usr/local/openresty/nginx/logs/hack/
使用nginx -t检查配置后的语法是否正确:
配置文件没有问题,如果openresty没有启动则直接启动,如果已经启动过,则需要重新加载配置:
#未启动
nginx
#已启动,重新加载配置
nginx -s reload
这样openresty与ngx_lua_waf已经配置集成完成了,随便找个路径访问可以看到如下openresty的欢迎页面:
三、验证WAF能力
1.目录遍历攻击
访问http://站点域名/test.php?id=../etc/passwd
该请求被ngx_lua_waf拦截。
2.sql注入攻击
访问http://站点域名/index.html?id=1%20union/!/!select%201,2,3*/
请求也被ngx_lua_waf拦截到。
3.ApacheBench压力测试
使用ab命令模拟压力测试站点:
ab -n 10000 -c 100 http://站点域名/index.html
模拟100个并发请求10000次,看到如下执行结果:
可以看到大部分ab请求被拦截了。在logs/hack路径可以看到如下拦截日志:
ab压力测试的请求也被ngx_lua_waf成功拦截了。
至于其他攻击请求的拦截,这里就不做验证了,感兴趣的话可以自己研究。
四、总结
从官方文档可以看到ngx_lua_waf提供了以下防护能力:
- 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
- 防止svn/备份之类文件泄漏
- 防止ApacheBench之类压力测试工具的攻击
- 屏蔽常见的扫描黑客工具,扫描器
- 屏蔽异常的网络请求
- 屏蔽图片附件类目录php执行权限
- 防止webshell上传
ngx_lua_waf是一个比较轻量级的,简单易用的WAF防护工具,提供了相对比较丰富的防护能力,不过相比于商用的防护工具和防护方案,整体表现只能说还算不错,如下从安全内参拿到一份各个开源WAF工具的测试报告,这里只列一下ngx_lua_waf的表现。
总样本数量: 33669 成功: 33669 错误: 0
检出率: 37.04%
误报率: 69.04%
准确率: 97.51%
90%平均耗时: 0.41毫秒
99%平均耗时: 0.49毫秒
整体来看,对于相对比较简单的场景,ngx_lua_waf是一个比较不错的防护方案选择。
五、参考
https://github.com/loveshell/ngx_lua_waf
https://www.cnblogs.com/Hi-blog/p/ngx_lua_waf-with-openresty.html
https://www.secrss.com/articles/56766