安装lua-nginx-module实现WAF功能
1、首先NGINX安装lua模块,参考前面文章
Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP-CSDN博客
ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。
ngx_lua模块的原理
1. 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
2. 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
3. 每个外部请求都由一个Lua协程处理,协程之间数据隔离;
4. Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
5. I/O等异步操作完成时还原相关协程上下文数据,并继续运行
2、安装
# 进入目录
cd /user/local/src/
# 下载v0.10.9rc7.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
# 解压
tar -xzvf v0.10.9rc7.tar.gz
#安装Nginx和依赖模块
# 进入目录
cd /user/local/src/
# 下载
wget http://nginx.org/download/nginx-1.21.0.tar.gz
# 解压
tar xf nginx-1.21.0.tar.gz
# 进入nginx目录
cd nginx-1.21.0
# 编译加入如下语句
--add-module=/usr/local/src/lua-nginx-module-0.10.9rc7
# 安装
make
make install #这步视情况执行,之前编译过NGINX不需要执行,没编译过需执行
# 添加nginx配置,在server块里添加下面内容
[root@localhost]# vim /usr/local/nginx/conf/nginx.conf
location /lua {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
# 检查语法
[root@localhost]# 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
# 测试
curl 127.0.0.1/lua
#安装ngx_lua_waf
# 进入目录
cd /user/local/src/
# 把ngx_lua_waf下载到conf目录下
wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
# 解压命名为waf
unzip master.zip -d /usr/local/nginx/conf/
# 更改目录名
mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf
# 在nginx.conf的http段添加
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
# 创建日志目录
mkdir /usr/local/nginx/logs/hack
chown www /usr/local/nginx/logs/hack
# Lua_waf 配置
[root@localhost]# cat config.lua
# 规则存放路径
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
# 是否开启攻击信息记录,需要配置logdir
attacklog = "on"
# log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
logdir = "/usr/local/nginx/logs/hack/"
# 是否拦截url访问
UrlDeny="on"
# 是否拦截后重定向
Redirect="on"
# 是否拦截cookie攻击
CookieMatch="on"
# 是否拦截post攻击
postMatch="on"
# 是否开启URL白名单
whiteModule="on"
# 填写不允许上传文件后缀类型
black_fileExt={"php","jsp"}
# ip白名单,多个ip用逗号分隔
ipWhitelist={"127.0.0.1"}
# ip黑名单,多个ip用逗号分隔
ipBlocklist={"192.168.10.1"}
# 是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCDeny="off"
# 设置cc攻击频率,单位为秒.
# 默认1分钟同一个IP只能请求同一个地址100次
CCrate="100/60"
# 告警内容
html= []
# 规则文件
[root@localhost]# ll wafconf/
total 24
-rw-r--r-- 1 root root 749 Apr 6 2016 args
-rw-r--r-- 1 root root 652 Apr 6 2016 cookie
-rw-r--r-- 1 root root 733 Apr 6 2016 post
-rw-r--r-- 1 root root 335 Apr 6 2016 url
-rw-r--r-- 1 root root 177 Apr 6 2016 user-agent
-rw-r--r-- 1 root root 8 Apr 6 2016 whiteurl
args里面的规则get参数进行过滤的
cookie是对请求过滤的cookie过滤
url是只在get请求url过滤的规则
post是只在post请求过滤的规则
whiteurl是白名单,里面的url匹配到不做过滤
user-agent是对user-agent的过滤规则
# 加载Nginx
[root@localhost]# nginx -s reload
#测试效果
访问带有参数的URL
http://192.168.20.205/?id=<script
知识点:
如果我想自定义规则怎么办?
1:比如说,我想拦截带admin的访问,怎么做?
在url规则里面加入admin
效果展示:
总结:
Nginx使用Lua模块实现WAF的功能很强大,可以对代码进行修改二次开发,修改成为自己想要的效果,不妨试试看看。同样Nginx+Lua实现的WAF也能完成xss、sql注入等注入型的web攻击。