NG+WAF实现应用安全访问

一、基本概念

什么是waf?

Web应用防火墙(waf)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。

什么是ngx_lua_waf?

ngx_lua_waf是一个基于ngx_lua的web应用防火墙,Nginx支持开启waf模块,主要功能有:

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

二、为啥要做NG+WAF

原有网络架构中硬件waf是侧挂在防火墙上,在现网防护过程中,请求中https解析,攻击防护等操作会经常出现大量的占用cpu的使用情况,导致waf的cpu利用率居高不下,严重时甚至会影响正常业务的使用。 

Nginx加载waf插件后,客户端流量先经防火墙,再到LVS四层负载均衡分发到应用层Nginx上 ,然后将请求流量先传到WAF,WAF通过检测后,再允许Web节点的响应返回 。Nginx还可根据地址端口配置,分发到不同的WAF上;不同Nginx流量也可以分发到同一个WAF。如果WAF发生故障超时后Nginx直接响应,不会造成业务中断 。

三、安装加载ngx_lua_waf模块

1、安装系统依赖软件包

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

2、下载ng支持模块

安装过程中需要的LuaJIT、lua-nginx-module和ngx_dev_kit模块、以及nginx和waf模块放在资源中,可下载离线安装。

https://download.csdn.net/download/vincent0920/88752133

3、将下载的离线包拷贝至/usr/local/src目录中

4、安装LuaJIT2.0
LuaJIT是Lua的即时编译器,简单来说,LuaJIT是一个高效的Lua虚拟机。

# 进入目录
cd /usr/local/src/ 
# 解压
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/

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

# 进入目录
cd /user/local/src/
# 解压
unzip xf ngx_devel_kit.gz

6、安装lua-nginx-module
ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。

安装

# 进入目录
cd /user/local/src/
# 解压
unzip  lua-nginx-module.gz

7、 安装Nginx

# 进入目录
cd /user/local/src/
# 解压
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 --add-module=/usr/local/src/ngx_devel_kit --with-stream
 
# 安装
make && make install


 # 添加nginx配置,在server块里添加下面内容
# vim /usr/local/nginx/conf/nginx.conf
 
location /lua {
    default_type 'text/plain';
 
    content_by_lua 'ngx.say("hello, lua")';
}
 
# 检查语法
# /usr/local/nginx/sbin/nginx -t

# 启动
# nginx
# 测试
curl 127.0.0.1:80/lua 

8、安装ngx_lua_waf

# 进入目录
cd /user/local/src/
#解压目录
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;

#操作系统新增www用户

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

9、waf规则文件介绍

/usr/local/nginx/conf/waf/wafconf

 args里面的规则get参数进行过滤的
cookie是对请求过滤的cookie过滤
url是只在get请求url过滤的规则
post是只在post请求过滤的规则
whiteurl是白名单,里面的url匹配到不做过滤
user-agent是对user-agent的过滤规则

/usr/local/nginx/conf/waf/ 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= []

10、启动测试验证

# 加载Nginx
# nginx -s reload 

#访问带有参数的URL

四、经验总结

在NG+WAF使用过程中,可以做到接收方向的流量全检测,但是响应方向的流量暂不支持检测,也不支持防篡改功能, http flood功能,无法做反向探测。改造后的架构对性能影响较小,默认1秒超时,若超时waf依然没有响应,nginx自动转发.对nginx的压力暂时未达到瓶颈,且在当前架构中nginx支持横向扩容,所以不会影响nginx的并发。
同时nginx和waf之间的交互对http/1.1流量利用率有了提高,且所有的流量解析工作都是nginx完成,大大降低了waf的工作量。另外通过XXF头来记录源地址,保证了溯源的顺利进行。

     There are many things that can not be broken!

     如果觉得本文对你有帮助,欢迎点赞、收藏、评论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年开年的荣誉--来自国产数据库

上周在北京参加了阿里云的开发者大会,我因为去年做了一点小贡献。非常荣幸的获得了阿里云的MVP的这个殊荣。(期间也认识了一些大神级的人物)还有就是一些网上认识的打卡们线下见面。 这个也是我一直追求的荣誉。 几乎在同时P(Ping…

单机zk--数据恢复,处理客户端接入,两种超期机制,处理客户端请求,客户端主动断开

1.概述 zk是一个分布式内存数据库。既然是数据库,就需要处理客户端发送过来的读,写请求。随着请求执行,不断更改数据实体。 作为内存数据库,数据实体全部加载到内存,在内存修改。我们把客户端发来的请求叫做事务&…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装,在微服务中的服务调用发送网络请求起到了重要的作用,简化了开发,可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

代码随想录二刷 | 回溯 | 组合优化

代码随想录二刷 &#xff5c; 回溯 &#xff5c; 组合优化 剪枝优化 剪枝优化 在遍历的过程中有如下代码&#xff1a; for (int i startIndex; i < n; i) {path.pop_back();backtracking(n, k, i 1);path.pop_back(); }n 4&#xff0c;k 4的话&#xff0c;那么第一层f…

SQL注入实战:盲注

盲注&#xff1a; 1、当攻击者利用SQL注入漏洞进行攻击时&#xff0c;有时候web应用程序会显示&#xff0c;后端数据库执行SQL查询返回的错误信息&#xff0c;这些信息能帮助进行SQL注入&#xff0c;但更多时候&#xff0c;数据库没有输出数据web页面&#xff0c;这是攻击者会…

flutter 实现定时滚动的公告栏的两种不错方式

相同的部分 自定义一个类继承StatefulWidget 所有公告信息存放在list里 第一种 scrollControllerAnimatedContainer 逻辑如下 我们可以发现启动了一个timer计时器计时5秒&#xff0c;hasClients检查其目标对象&#xff08;我们用的是listview&#xff09;是否被渲染&#x…

文件重命名技巧:如何使用编号快速高效地重命名大量文件的方法

在处理大量文件时&#xff0c;我们经常需要对其进行重命名&#xff0c;以便更好地组织和管理。然而&#xff0c;手动重命名每个文件既耗时又容易出错。为了解决这个问题&#xff0c;我们可以利用一些简单的编号技巧来快速高效地重命名大量文件。下面将介绍一种简单而实用的方法…

【好文翻译】JavaScript 中的 realm 是什么?

本文由体验技术团队黄琦同学翻译。 原文链接&#xff1a; https://weizmangal.com/2022/10/28/what-is-a-realm-in-js/ github仓库地址&#xff1a; https://github.com/weizman/weizman.github.io/blob/gh-pages/_posts/2020-02-02-what-is-a-realm-in-js.md 前言 作为我对…

前端安全相关

请求后端接口必须带上sign 以上主要是解决&#xff1a;除了数据泄露外&#xff0c;一些重要功能的接口如果没有做好保护措施也会被恶意调用造成DDoS、条件竞争等攻击效果 一些营销活动类的Web页面&#xff0c;领红包、领券、投票、抽奖等活动方式很常见。此类活动对于普通用户…

LOSS损失函数值是什么意思?

环境&#xff1a; Bert-VITS2-v2.3 问题描述&#xff1a; LOSS损失函数值是什么意思&#xff1f; 解决方案&#xff1a; 在机器学习和深度学习中&#xff0c;损失函数&#xff08;Loss Function&#xff09;用来衡量模型预测值与实际值之间的差异或误差。LOSS损失函数值是…

Kaggle之旅3

Kaggle之旅3 文章目录 Kaggle之旅3前言一、Predict survival on the Titanic and get familiar with ML basics二、开始1.基础知识构造随机森林的4个步骤 2.结合教程继续 总结 前言 今天继续Kaggle之旅&#xff0c;尝试Titanic - Machine Learning from Disaster 一、Predict…

java eazyexcel 实现excel的动态多级联动下拉列表(1)使用名称管理器+INDIRECT函数

原理 将数据源放到一个新建的隐藏的sheet中将选项的子选项的对应字典设置到名称管理器中&#xff08;名称是当前选项的内容&#xff0c;值是他对应的子菜单的单元格范围&#xff0c;在1里面的sheet中&#xff09;子菜单的数据根据INDIRECT函数去左边那个单元格获取内容&#x…

如何实现 H5 秒开?

我在简历上写了精通 H5&#xff0c;结果面试官上来就问&#xff1a; 同学&#xff0c;你说你精通 H5 &#xff0c;那你能不能说一下怎么实现 H5 秒 由于没怎么做过性能优化&#xff0c;我只能凭着印象&#xff0c;断断续续地罗列了几点&#xff1a; 网络优化&#xff1a;http2、…

5G_射频测试_测试模式解读(三)

Downlink test models FR1 test model 1.1 (NR-FR1-TM1.1)&#xff08;满PRB&#xff0c;QPSK&#xff09;FR1 test model 1.2 (NR-FR1-TM1.2)( QPSK/boosted/40% QPSK)FR1 test model 2 (NR-FR1-TM2)(64QAM 只有1个PRB 功率最低)FR1 test model 2a (NR-FR1-TM2a) )(256QAM 只…

最小二乘平面拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘平面拟合 背景 ptb认证 ptb是对几何体拟合算法的认证。 主要涉及3D直线&#xff0c;3D圆&#xff0c;平面&#xff0c;球&#xff0c…

零食折扣店,注定昙花一现?

年终岁末&#xff0c;又到了各类休闲零食产品一年一度的销售旺季。与过去不同的是&#xff0c;近年来的休闲零食赛道正因大量零食折扣店的涌现而显得热闹非凡。 随着主打折扣、低价的零食折扣店成为消费者特别是三四线下沉市场消费者的新宠&#xff0c;资本开始涌入并快速推动…

com域名注册腾讯云价格

腾讯云com域名首年价格&#xff0c;企业新用户注册com域名首年1元&#xff0c;个人新用户注册com域名33元首年&#xff0c;非新用户注册com域名首年元85元一年&#xff0c;优惠价75元一年&#xff0c;com域名续费85元一年。腾讯云百科txybk.com分享腾讯云com域名注册优惠价格&a…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

找不到vcruntime140_1.dll无法继续执行怎么办?全面分析修复方法

当系统提示vcruntime140_1.dll文件出现错误时&#xff0c;可能会引发一系列影响计算机正常运行的问题。这个特定的动态链接库文件&#xff08;DLL&#xff09;是Microsoft Visual C Redistributable的一部分&#xff0c;对于许多基于Windows的应用程序来说至关重要。一旦vcrunt…