安装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攻击。

相关推荐
Lvan的前端笔记8 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
姜鱼问生8 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存
Joy T21 小时前
从 Nginx 到 Gateway 再到微服务:一次 AI 请求的完整链路
nginx·微服务·gateway·controller·路由转发·ai service·接口错误排查
小匠石钧知21 小时前
07_在k8s集群中安装ingress-nginx
nginx·容器·kubernetes·ingress
百度一下吧1 天前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JAVA面经实录9172 天前
Java高级后端 · 全套面试通关手册(Nginx)
java·nginx·面试
二喵❥(^_-)2 天前
接口测试流程的三个核心环节
开发语言·lua
众链网络3 天前
大客流票务系统怎么防超卖:库存并发、候补队列与幂等设计的工程取舍
junit·架构
lpfasd1234 天前
WinSW在Win7上失败真相-实测与修复
windows·nginx
lpfasd1234 天前
nginx服务化五套方案原理解剖与选型
运维·nginx