一、背景介绍

为了更好的防护系统,降低系统被攻击的可能性,在无第三方商业版web应用防火墙的前提下,针对nginx添加lua实现WAF防火墙。


二、工具版本

nginxluajitngx_devel_kitlua-nginx-module备注
V1.16.0V2.2.1v0.3.1v0.10.14rc5建议lua-nginx-module使用这个版本v0.10.14rc5

注意:这里需要特别强调一下,lua-nginx-module版本V0.10.20、V0.10.19 、V0.10.15均进行了尝试,均报如下错误,这里换成了v0.10.14rc5版本,则正常。
在这里插入图片描述


三、工具下载

完整工具下载


四、安装步骤

4.1、编译安装Nginx

#1、安装依赖包
yum install wget vim dos2unix lrzsz unzip zip -y
yum -y install pcre-devel
yum -y install openssl openssl-devel
yum install gcc* -y

#2、编译安装
wget http://nginx.org/download/nginx-1.16.0.tar.gz
tar axf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module --with-http_v2_module \
--with-http_stub_status_module --with-pcre --with-stream
make && make install

如下图所示:
在这里插入图片描述


4.2、安装LuaJIT

LuaJIT的意思是Lua Just-In-Time,是即时的Lua代码解释器。必须去github下载否则运行是会出现报错,项目地址:https://github.com/openresty/luajit2

#1、下载软件包
wget https://github.com/openresty/luajit2/archive/refs/heads/v2.1-agentzh.zip
unzip v2.1-agentzh.zip
cd luajit2-2.1-agentzh
make install PREFIX=/usr/local/luajit

#2、添加环境变量
vim /etc/profile
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1
source /etc/profile

#3、加载lua库到ld.so.conf文件
echo "/usr/local/luajit/lib/" >> /etc/ld.so.conf

#4、执行ldconfig让动态函式库加载到缓存中
ldconfig

如下图所示,则表示编译成功
在这里插入图片描述


4.3、下载解压ngx_devel_kit

wget https://github.com/vision5/ngx_devel_kit/archive/v0.3.1.tar.gz
tar axf v0.3.1.tar.gz

4.4、下载解压lua-nginx-module

wget https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.14rc5.zip
unzip v0.10.14rc5.zip

4.5、重新编译安装Nginx

#1、备份(必须)
cp -r /usr/local/nginx /usr/local/nginx_`date +%F`

#2、重新编译安装
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module --with-http_v2_module \
--with-http_stub_status_module --with-pcre --with-stream \
--add-module=/data/pkgs/lua-nginx-module-0.10.14rc5 \
--add-module=/data/pkgs/ngx_devel_kit-0.3.1
make && make install

如下图所示,则表示编译成功
在这里插入图片描述


4.6、验证lua模块

#1、调用lua测试,编辑Nginx.conf 添加/lua
[root@localhost nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf
        location /lua {
            default_type 'text/plain';
            content_by_lua 'ngx.say("Hi,欢迎来到英雄联盟")';
        }

[root@localhost nginx-1.16.0]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx-1.16.0]# /usr/local/nginx/sbin/nginx 

如下图所示
在这里插入图片描述
测试结果如下图:
在这里插入图片描述


4.7、WAF模块安装

项目地址:https://github.com/loveshell/ngx_lua_waf

4.7.1、下载waf模块

#1、下载waf模块
wget https://github.com/loveshell/ngx_lua_waf/archive/refs/heads/master.zip
unzip master.zip
mkdir /usr/local/nginx/conf/waf
mv ngx_lua_waf-master/* /usr/local/nginx/conf/waf

如下图:
在这里插入图片描述


4.7.2、在nginx.conf的http段添加

vim /usr/local/nginx/conf/nginx.conf
    lua_shared_dict limit 50m;
    lua_package_path "/usr/local/nginx/conf/waf/?.lua";
    init_by_lua_file "/usr/local/nginx/conf/waf/init.lua";
    access_by_lua_file "/usr/local/nginx/conf/waf/waf.lua";

如下图:
在这里插入图片描述


4.7.3、配置config.lua

说明:根据实际情况修改config.lua文件。
在这里插入图片描述


4.8、简单验证

说明:过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割。

浏览器访问:http://192.168.1.212/lua?id=1 or 1=1

1、默认规则没有这点的防护,访问结果如下图所示:
在这里插入图片描述
2、配置规则
在args规则中添加比如\sor\s+,然后/usr/local/nginx/sbin/nginx -s reload

vim /usr/local/nginx/conf/waf/wafconf/args
\sor\s+
/usr/local/nginx/sbin/nginx -s reload

如下图所示:
在这里插入图片描述
3、配置规则防护后,访问结果如下图所示:
在这里插入图片描述


4.8、测试ccdeny

yum install 
ab -n1000 -c 100 http://192.168.1.212/lua

1、不添加waf规则的时候,对网站进行ab压力测试,再次访问是没有问题的

如下图所示:
在这里插入图片描述

2、开启ccdeny防护规则

vim /usr/local/nginx/conf/waf/config.lua
CCDeny="on"  #开启ccdeny的功能 
CCrate="100/60" #限制每分钟100次访问

如下图所示:
在这里插入图片描述
3、通过ab工具对网站进行压力测试,再次访问就变成503了
如下图所示:
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐