一、概述
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