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!

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC数据校验

导包 配置springmvc.xml <bean id"validator" class" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name"providerClass" value"org.hibernate.validator.HibernateValidator ">…

App 设计工具中的回调

目录 创建回调函数 回调函数编程 回调输入参数 在回调函数之间共享数据 在多个组件之间共享回调 以编程方式创建和分配回调 在代码中搜索回调 更改回调或断开与回调的连接 删除回调 示例&#xff1a;具有滑块回调的 App 回调是在用户与 App 中的 UI 组件交互时执行的…

5G_系统同步机制(八)

BBU和RRU的同步机制 为什么要做到系统同步 在TDD模式下工作时&#xff0c;为了避免相邻小区之间的干扰&#xff0c;近距离的所有gNB在任何时间点都必须具有相同的传输方向(DL或UL)。这样做的必要条件是在BTS之间同步SFN (System Frame number)和time Slot。此外&#xff0c;由…

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…

决策树的分类

概念 决策树是一种树形结构 树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树的建立过程 1.特征选择&#xff1a;选取有较强分类能力的特征。 2.决策树生成&#xff1a;根据选择的特征生…

《ORANGE’S:一个操作系统的实现》读书笔记(三十五)内存管理(三)

内存管理到目前为止实现了fork()、exit()和wait()&#xff0c;而我们的目标是实现一个可以执行命令的shell&#xff0c;可无论Init进程fork出多少进程&#xff0c;它也都只是Init而已。所以我们还需要一个系统调用&#xff0c;它就是exec()&#xff0c;这篇文章就来记录exec()的…

最长公共前缀(Leetcode14)

例题&#xff1a; 分析&#xff1a; 我们可以先定义两个变量 i &#xff0c; j&#xff0c; j表示数组中的每一个字符串&#xff0c; i 表示每个字符串中的第几个字符。一列一列地进行比较&#xff0c;先比较第一列的字符&#xff0c;若都相同&#xff0c;则 i &#xff0c;继…

成功解决「MySQL问题1」启动mysql时:发生系统错误5拒绝访问

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; ✈️公众号 | 热爱技术的小郑 。文章底部有个人公众号二维码。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G 教程资…

【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表 1、顺序表的定义&#xff1a; 线性表的顺序存储结构&#xff0c;即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的&#xff0c;可以通过数据元素的物理存储位置来反映其逻辑关系。…

漫漫数学之旅009

文章目录 经典格言数学习题古今评注拓展学习&#xff08;一&#xff09;大数定理&#xff08;二&#xff09;伯努利级数 经典格言 真正的问题&#xff0c;不在于机器是否思考&#xff0c;而在于人们是否思考。——BF斯金纳&#xff08;B. F. Skinner&#xff09; BF斯金纳&…

2024首更---Web Service 教程

Web Services 简介 Web Services 可使您的应用程序成为 Web 应用程序。 Web Services 通过 Web 进行发布、查找和使用。 您应当具备的基础知识 在继续学习之前&#xff0c;您需要对下面的知识有基本的了解&#xff1a; HTMLXML 如果您希望首先学习这些项目&#xff0c;请在…

2024年华数杯国际赛A题:放射性废水处理建模 思路模型代码解析

2024年华数杯国际赛A题&#xff1a;放射性废水处理建模&#xff08;Radioactive Wastewater from Japan&#xff09; 一、问题描述 2011年3月&#xff0c;日本东海岸发生了地震&#xff0c;引发了福岛第一核电站事故&#xff0c;导致三个核反应堆熔毁&#xff0c;并在一场巨大…

[java基础揉碎]基本数据类型转换

介绍 当java程序在进行赋值或者运算时&#xff0c;精度小的类型自动转换为精度大的数据类型&#xff0c; 这个就是自动类型转换。 数据类型按精度&#xff08;容量&#xff09;大小排序为: 自动类型转换注意和细节 1.有多种类型的数据混合运算时&#xff0c;系统首先自动…

如何在浏览器上设置 VPN 网络虚拟专用网络

如何在DT浏览器上设置 VPN 网络 虚拟专用网络&#xff08;VPN&#xff09;是一种用公用网络架设专用网络的技术。如何在DT浏览器上设置 VPN 呢&#xff0c;先下载DT浏览器&#xff0c;建议在官方网站下载最新版&#xff0c;安装&#xff0c;在DT浏览器首页点更多&#xff0c;网…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的使用 定义&#xf…

HTML以及CSS相关知识总结(一)

近日就开始回顾html和css相关知识啦&#xff0c;并且会学习html5和css3的新知识&#xff0c;以下是我对记忆不太深刻的地方以及新知识点的总结&#xff1a; Web标准&#xff1a; 结构&#xff1a;用于对网页元素进行整理和分类&#xff0c;即HTML 表现&#xff1a;用于设置网页…

使用 Node 创建 Web 服务器

Node.js 提供了 http 模块&#xff0c;http 模块主要用于搭建 HTTP 服务端和客户端&#xff0c;使用 HTTP 服务器或客户端功能必须调用 http 模块&#xff0c;代码如下&#xff1a; var http require(http); 以下是演示一个最基本的 HTTP 服务器架构(使用 8080 端口)&#x…

Python实现稳健线性回归模型(rlm算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 稳健回归可以用在任何使用最小二乘回归的情况下。在拟合最小二乘回归时&#xff0c;我们可能会发现一些…

python写完程序怎么运行

python有两种运行方式&#xff0c;一种是在python交互式命令行下运行; 另一种是使用文本编辑器直接在命令行上运行。 注&#xff1a;以上两种运行方式均由CPython解释器编译运行。 当然&#xff0c;也可以将python代码写入eclipse中&#xff0c;用JPython解释器运行&#xff0c…

Spring MVC的原理

Spring MVC中的MVC即模型-视图-控制器&#xff0c;该框架围绕一个DispatcherServlet设计而成&#xff0c;DispatcherServlet会把请求分发给各个处理器&#xff0c;并支持可配置的处理器映射和视图渲染等功能。Spring MVC的具体工作流程如下&#xff1a; &#xff08;1&#xff…