Nginx使用Lua模块实现WAF的原理解析

目录
  • 一、WAF产生的背景
  • 二、什么是WAF
  • 三、工作原理
  • 四、WAF作用
  • 五、WAF和传统防火墙的区别
  • 六、WAF和DDos
  • 七、Nginx WAF功能
  • 八、Nginx Waf防护流程
  • 九、基于Nginx实现的WAF
    • 9.1安装依赖包
    • 9.2安装LuaJIT2.0
    • 9.3安装ngx_devel_kit
    • 9.4安装lua-nginx-module
    • 9.5安装Nginx
    • 9.6安装ngx_lua_waf
    • 9.7测试效果  

前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下

一、WAF产生的背景

过去企业通常会采用防火墙,作为安全保障的第一道防线;当时的防火墙只是在第三层(网络层)有效的阻断一些数据包;而随着web应用的功能越来越丰富的时候,Web服务器因为其强大的计算能力,处理性能,蕴含较高的价值,成为主要的被攻击目标(第七层应用层)。而传统防火墙在阻止利用应用程序漏洞进行的攻击方面,却没有办法;在此背景下,WAF(Web Application Firewall)应运而生。

二、什么是WAF

Web 应用防火墙 (WAF-Web Application Firewall) 旨在保护 Web 应用免受各类应用层攻击,例如跨站点脚本 (XSS)、SQL 注入,以及 cookie 中毒等。应用是您重要数据的网关,因此针对应用发起的攻击就成为了造成漏洞的主要原因。有了 WAF 就可以拦截一系列企图通过入侵系统来泄漏数据的攻击。

三、工作原理

1.用户通过浏览器向Web服务器发送网页请求。

2.用户的请求到达Web服务器之前,WAF对用户的请求进行过滤

3.WAF拿到用户的HTTP请求参数去跟配置文件定义的规则做比较(比如ip黑名单),如果匹配上就返回403拒绝,否则就放行。

4.WEB服务器响应用户请求,把页面数据返回给用户。

四、WAF作用

waf是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

五、WAF和传统防火墙的区别

1.传统防火墙是工作在网络层(第三层)和传输层(第四层)

2.WAF是工作在应用层(第七层)

3.传统防火墙更多是对IP和端口进行过滤

4.WAF是对HTTP请求进行过滤,包括URL,IP,User-Agent等等

六、WAF和DDos

DDos的全称是Distributed Denial of service。主要依靠一组计算机来发起对一个单一的目标系统的请求,从而造成目标系统资源耗尽而拒绝正常的请求。

根据OSI网络模型,最常见的DDos有三类,第三层(网络层)DDos、第四层(传输层)DDos和第七层(应用层)DDos。

WAF主要处理第七层DDos攻击,它在处理第七层DDos攻击时会比其它防护手段更高效一些。WAF会对HTTP流量做详细的分析,这样WAF就能针对正常的访问请求进行建模,然后使用这些模型来区分正常的请求和攻击者使用机器人或者脚本触发的请求

七、Nginx WAF功能

  • 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝(新增cdip功能支持ip段)
  • 支持URL白名单,将不需要过滤的URL进行定义
  • 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理
  • 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值(新增针对不同域名)
  • 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理
  • 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些
  • 支持URL参数过滤,原理同上
  • 支持日志记录,将所有拒绝的操作,记录到日志中去
  • 新增支持拉黑缓存(默认600秒)

八、Nginx Waf防护流程

if whiteip() then
elseif blockip() then
elseif denycc() then
elseif ngx.var.http_Acunetix_Aspect then
    ngx.exit(444)
elseif ngx.var.http_X_Scan_Memo then
    ngx.exit(444)
elseif whiteurl() then
elseif ua() then
elseif url() then
elseif args() then
elseif cookie() then
elseif PostCheck then

  • 检查IP白名单,通过就不检测;
  • 检查IP黑名单,不通过即拒绝;
  • 检查CC攻击,匹配即拒绝
  • 检查http_Acunetix_Aspect扫描是否开启
  • 检查http_X_Scan_Memo扫描是否开启
  • 检查白名单URL检查;
  • 检查UA,UA不通过即拒绝;
  • 检查URL参数检查;
  • 检查cookie;
  • 检查post;

九、基于Nginx实现的WAF

9.1安装依赖包

yum -y install gcc gcc-c++ autoconf automake make unzip
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

9.2安装LuaJIT2.0

LuaJIT是Lua的即时编译器,简单来说,LuaJIT是一个高效的Lua虚拟机。

# 进入目录
cd /usr/local/src/

# 下载LuaJIT2.0
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz

# 解压
tar xf LuaJIT-2.0.5.tar.gz && cd LuaJIT-2.0.5

# 编译
make

# 安装
make install PREFIX=/usr/local/lj2

# 建立软连接
ln -s /usr/local/lj2/lib/libluajit-5.1.so.2 /lib64/

# 添加环境变量
export LUAJIT_LIB=/usr/local/lj2/lib/
export LUAJIT_INC=/usr/local/lj2/include/luajit-2.0/

9.3安装ngx_devel_kit

kit模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。

# 进入目录
cd /user/local/src/

# 下载v0.3.0.tar.gz
wget  https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz -O ngx_devel_kit.tar.gz

# 解压
tar xf ngx_devel_kit.tar.gz

9.4安装lua-nginx-module

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等异步操作完成时还原相关协程上下文数据,并继续运行

安装

# 进入目录
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

9.5安装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

# 编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --with-stream

# 安装
make && make install

# 添加nginx配置,在server块里添加下面内容
[root@localhost_test_192.168.10.132 11:04:48 ~]# vim /usr/local/nginx/conf/nginx.conf

location /lua {
    default_type 'text/plain';

    content_by_lua 'ngx.say("hello, lua")';
}

# 检查语法
[root@localhost_test_192.168.10.132 09:59:33 /usr/local/src]# 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_test_192.168.10.132 11:08:35 ~]# nginx

# 测试
curl 127.0.0.1:80/lua

9.6安装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;

# 在nginx.conf最外层添加用户运行
user www;

# 创建日志目录
mkdir /usr/local/nginx/logs/hack
chown www /usr/local/nginx/logs/hack

# Lua_waf 配置
[root@localhost_test_192.168.10.132 11:33:53 /usr/local/nginx/conf/waf]# 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_test_192.168.10.132 11:42:12 /usr/local/nginx/conf/waf]# 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_test_192.168.10.132 11:32:41]# nginx -s reload

9.7测试效果  

访问带有参数的URL

http://192.168.10.132/?id=<script 

总结:Nginx使用Lua模块实现WAF的功能很强大,可以对代码进行修改二次开发,修改成为自己想要的效果,不妨试试看看 

到此这篇关于Nginx使用Lua模块实现WAF的原理解析的文章就介绍到这了,更多相关Nginx实现WAF内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx添加lua模块的实现方法

    安装 lua wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX=/usr/local/LuaJIT etc/profile 加入 # lua export LUAJIT_LIB=/usr/local/LuaJIT/lib export LUAJIT_INC=/usr/local/LuaJIT

  • Linux下给nginx安装waf模块

    最近上新项目,搭建nginx的时候为保证安全,决定安装下waf模块,以下是具体步骤,首先下载需要的安装包,进行每个安装: wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz tar -zxvf LuaJIT-2.0.3.tar.gz cd LuaJIT-2.0.3 make make install 然后下载nginx, wget http://nginx.org/download/nginx-1.7.6.tar.gz tar -zxvf ng

  • Nginx使用Lua模块实现WAF的原理解析

    目录 一.WAF产生的背景 二.什么是WAF 三.工作原理 四.WAF作用 五.WAF和传统防火墙的区别 六.WAF和DDos 七.Nginx WAF功能 八.Nginx Waf防护流程 九.基于Nginx实现的WAF 9.1安装依赖包 9.2安装LuaJIT2.0 9.3安装ngx_devel_kit 9.4安装lua-nginx-module 9.5安装Nginx 9.6安装ngx_lua_waf 9.7测试效果 前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了

  • Python正则re模块使用步骤及原理解析

    python中使用正则表达式的步骤: 1.导入re模块:import re 2.初始化一个Regex对象:re.compile() 3.刚刚创建的Regex对象调用search方法进行匹配,返回要给March对象 4.刚刚的March对象调用group方法,展示匹配到的字符串 下面例子的知识点: 对正则表达式分组用:(),正则里的分组计数从1开始,不是从0,切记~~ group(数字):去对应的分组的值 groups():返回所有分组的元组形式 \d表示一个数字 regex_obj = re.c

  • Python logging模块进行封装实现原理解析

    1. 简介       追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情 一个事件可以用一个可包含可选变量数据的消息来描述 事件有自己的重要性等级 2. 使用logging日志系统四大组件 loggers日志器 提供应用程序代码直接使用的接口 handlers处理器 用于将日志记录发送到指定的目的位置 filters过滤器 过滤, 决定哪些输出哪些日志记录, 其余忽略 formatters格式器 控制日志输出格式 使用代码如下 import os, time,

  • Nginx利用Lua+Redis实现动态封禁IP的方法

    一.背景 我们在日常维护网站中,经常会遇到这样一个需求,为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 本文给大家介绍的是Nginx利用Lua+Redis实现动态封禁IP的方法,下面话不多说了,来一起看看详细的介绍吧 二.架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求: 2.在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者

  • Nginx+Tomcat实现负载均衡、动静分离的原理解析

    一.Nginx 负载均衡实现原理 1.Nginx 实现负载均衡是通过反向代理实现 反向代理(Reverse Proxy) 是指以 代理服务器(例:Nginx) 来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器(例:Tomcat),并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器(例:Nginx)对外就表现为一个反向代理服务器. 我们从客户端的视野来看,实际上客户端并不知道真实的服务提供者是哪台服务器,它只知道它请求了反向代理服务器.因

  • Nginx+ModSecurity安全模块部署的实现

    目录 一.下载 二.部署 1.Nginx部署 2.ModSecurity部署 3.添加ModSecurity模块 4.配置Nginx虚拟主机 为演示已安装Nginx而未添加ModSecurity的情况,以下操作为先安装Nginx,后添加ModSecurity模块. ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,,完美兼容nginx,是nginx官方推荐的WAF,并且支持支持OWASP规则. 中文网站:http://www.modsecurity.cn 应用实战可参考

  • nginx 集成lua操作mysql的过程解析

    目录 前言 实现思路 ngx_lua模块概念 OpenRestry安装步骤 1.下载OpenRestry 2.解压缩文件 3.进入OpenResty目录执行配置 4. 执行命令:make && make install 5.进入OpenResty的目录配置nginx 6.启动nginx并测试 ngx_lua常用指令 代码实现 lua操作redis lua-resty-redis环境准备 lua-resty-redis常用API ngx_lua操作Mysql lua-resty-mysql

  • nginx安装第三方模块的方法

    nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装模块方面,nginx显得没有apache安装模块方便,当然也没有php安装扩展方便.在原生的nginx,他不可以动态加载模块,所以当你安装第三方模块的时候需要覆盖nginx文件.接下来看看如何安装nginx第三模块吧. nginx第三方模块安装方法: 复制代码 代码如下: ./configure -

  • Nginx为已安装nginx动态添加模块

    这里以安装第三方ngx_http_google_filter_module模块为例 nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so 1. 下载第三方扩展模块ngx_http_google_filter_module # cd /data/software/ # git clone https://github.com/cuber/ngx_http_google_filter_module 2. 查看nginx编译安装时安装了哪些模块 将命令行切换到nginx

随机推荐