基于ngx_lua_waf安装网站防护

Nginx/Web服务器
50
0
0
2024-10-31
标签   Lua

一、概述

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