本文安装的WAF已不推荐,请移步Zhongkui-WAF,功能更多、更高效。
WAF简介
Web应用防火墙(英文:Web Application Firewall,简称: WAF)。
WAF用来防止Sql注入、XSS、SSRF、CC攻击、IP黑白名单、URL拦截访问等,从而保护我们的应用安全。
安装lua模块
因为使用的WAF模块是基于lua
的,所以要先安装lua模块
,让Nginx
支持lua
。
安装lua
的库:
yum install -y lua lua-devel
下载lua即时编译器LuaJIT:
wget -P /usr/local/src /download/LuaJIT-2.0.5.tar.gz
这里有个坑,安装官网版本的LuaJIT,在后面安装lua-nginx-module
模块时会报错,所以改成openresty版本的:
wget -O /usr/local/src/LuaJIT-2.1-0411.tar.gz /openresty/luajit2/archive/v2.1-0411.tar.gz
解压:
cd /usr/local/srctar -zxvf LuaJIT-2.1-0411.tar.gz
安装LuaJIT:
cd /usr/local/src/LuaJIT-2.1-0411make && make install PREFIX=/usr/local/luajit2-2.1
编辑/etc/profile文件,添加LuaJIT
环境变量:
export LUAJIT_LIB=/usr/local/luajit2-2.1/libexport LUAJIT_INC=/usr/local/luajit2-2.1/include/luajit-2.1
加载lua库到ld.so.conf文件:
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
执行动态链接库管理命令,让动态链接库为系统所共享:
ldconfig
下载Nginx模块,ngx_devel_kit
和lua-nginx-module
:
wget -O /usr/local/src/ngx_devel_kit-0.3.1.tar.gz /simplresty/ngx_devel_kit/archive/v0.3.1.tar.gzwget -O /usr/local/src/lua-nginx-module-0.10.14.tar.gz /openresty/lua-nginx-module/archive/v0.10.14.tar.gz
这里还有个坑,lua-nginx-module
模块要下载v0.10.14
版本,之后的版本在启动Nginx时会报错。
分别解压两个模块到/usr/local/nginx-modules/
目录:
tar -zxvf ngx_devel_kit-0.3.1.tar.gz -C /usr/local/nginx-modules/tar -zxvf lua-nginx-module-0.10.14.tar.gz -C /usr/local/nginx-modules/
安装Nginx时,通过configure
命令添加上面这两个模块:
./configure --prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_sub_module \--with-http_stub_status_module \--with-http_auth_request_module \--with-http_secure_link_module \--with-stream \--with-stream_ssl_module \--with-stream_realip_module --without-http_fastcgi_module \--without-select_module \--without-poll_module \--add-module=/usr/local/nginx-modules/ngx_devel_kit-0.3.1 \--add-module=/usr/local/nginx-modules/lua-nginx-module-0.10.14 \--with-ld-opt=-Wl,-rpath,/usr/local/luajit2-2.1/lib
在Nginx配置文件中添加配置:
location /lua {default_type 'text/html'; content_by_lua 'ngx.say("hello lua")'; }
浏览器访问项目地址/lua
,如果可以看到hello lua
,说明lua模块安装成功。
安装WAF
本文安装的是GitHub上一款开源的、基于lua-nginx-module
的WAF,GitHub地址。
wget -O /usr/local/src/ngx_lua_waf-master.zip /loveshell/ngx_lua_waf/archive/refs/heads/master.zip
将WAF压缩包解压到Nginx目录下并命名为waf:
unzip -d /usr/local/nginx /usr/local/src/ngx_lua_waf-master.zipmv /usr/local/nginx/ngx_lua_waf-master /usr/local/nginx/waf
修改nginx.conf,在http模块下添加waf相关配置:
lua_package_path "/usr/local/nginx/waf/?.lua";lua_shared_dict limit 10m;init_by_lua_file /usr/local/nginx/waf/init.lua; access_by_lua_file /usr/local/nginx/waf/waf.lua;
waf目录下的config.lua
是配置文件,修改下waf配置文件所在的目录:
RulePath = "/usr/local/nginx/waf/wafconf/"
根据作者文档:
ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。
修改init.lua
和waf.lua
两个文件,把ngx.re.match
替换为ngx.re.find
。
这里给一个已经修改好了的:
链接: /s/1qeI9lbnhphThXelIrsLvPA
提取码: 2vgf
重载Nginx配置文件:
nginx -s reload
浏览器访问测试:
http://xxxx/test?id=../etc/passwd
如果出现如下提示,说明waf配置生效:
配置文件说明:
RulePath = "/usr/local/nginx/conf/waf/wafconf/"--规则存放目录attacklog = "off"--是否开启攻击信息记录,需要配置logdirlogdir = "/usr/local/nginx/logs/hack/"--log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限UrlDeny="on"--是否拦截url访问Redirect="on"--是否拦截后重定向CookieMatch = "on"--是否拦截cookie攻击postMatch = "on" --是否拦截post攻击whiteModule = "on" --是否开启URL白名单black_fileExt={"php","jsp"}--填写不允许上传文件后缀类型ipWhitelist={"127.0.0.1"}--ip白名单,多个ip用逗号分隔ipBlocklist={"1.0.0.1"}--ip黑名单,多个ip用逗号分隔CCDeny="on"--是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)CCrate = "100/60"--设置cc攻击频率,单位为秒.--默认1分钟同一个IP只能请求同一个地址100次html=[[Please go away~~]]--警告内容,可在中括号内自定义备注:不要乱动双引号,区分大小写