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

相关推荐
攻城有术5 小时前
专项攻克——redis分布式锁-用LUA脚本解决setNX锁不释放问题
redis·分布式·lua
牧码岛7 小时前
阿里云服务器新端口上线SOP(Windows+Nginx+HTTPS)
服务器·nginx·阿里云
xixingzhe221 小时前
nginx无网络升级
服务器·nginx
你住过的屋檐2 天前
【Nginx】linux上安装nginx
linux·运维·nginx
lhldsg2 天前
家政派单系统开发实战:从需求分析到智能调度全流程指南
java·junit·小程序·uni-app·需求分析
liangshanbo12152 天前
Nginx 进程管理命令深度面试题解析
java·nginx·面试
weixin_511255212 天前
NGINX常用配置
linux·服务器·nginx
痕迹运维2 天前
Nginx Docker容器化安装
nginx
烬羽2 天前
Dockerfile 是"做奶茶的配方"?用 todos 全栈项目看懂 Docker 构建与发布
nginx·docker·nestjs
meilindehuzi_a2 天前
从浏览器输入 URL 到页面显示:DNS、Nginx、后端与 CDN 全链路解析
运维·nginx