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

相关推荐
苹果醋38 小时前
Redis | 第3章 对象《Redis设计与实现》
java·运维·spring boot·mysql·nginx
yangshuo128114 小时前
Docker-Compose 快速部署安装 Nginx 或其他应用
运维·nginx·docker
.Ayang16 小时前
【vulhub】nginx解析漏洞(nginx_parsing_vulnerability)
计算机网络·nginx·安全·web安全·网络安全·系统安全·网络攻击模型
小韩加油呀18 小时前
nginx配置不缓存资源
nginx·缓存
半夏知半秋1 天前
lua-lru缓存算法解析
笔记·学习·算法·缓存·lua
最后一个bug2 天前
C语言执行Lua进行错误处理
linux·服务器·c语言·开发语言·嵌入式硬件·lua
袁庭新2 天前
Lua如何连接MySQL数据库?
redis·mysql·lua·lua5.4·袁庭新
红黑色的圣西罗2 天前
Lua 实现继承的一种方式
开发语言·lua
pcj_8882 天前
Nginx解决跨域问题的案例演示
nginx
海绵波波1072 天前
集群聊天服务器(12)nginx负载均衡器
服务器·nginx·负载均衡