使用 Openresty 来实现 WAF 防火墙功能
在 Linux
上使用 Openresty
来实现 WAF
防火墙功能
实验平台:CentOS Linux release 7.4
OpenResty版本: openresty-1.17.8.2
Openresty 简介
OpenResty®
是一个结合了 Nginx
与 Lua
的高性能 Web
平台,其内部集成了大量精良的 Lua
库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web
应用、Web
服务和动态网关。OpenResty®
通过汇聚各种设计精良的 Nginx
模块(主要由 OpenResty
团队自主开发),从而将 Nginx
有效地变成一个强大的通用 Web
应用平台。这样,Web
开发人员和系统工程师可以使用 Lua
脚本语言调动 Nginx
支持的各种 C
以及 Lua
模块,快速构造出足以胜任 10K
乃至 1000K
以上单机并发连接的高性能 Web
应用系统。OpenResty®
的目标是让你的Web
服务直接跑在 Nginx
服务内部,充分利用 Nginx
的非阻塞 I/O
模型,不仅仅对 HTTP
客户端请求,甚至于对远程后端诸如 MySQL
、PostgreSQL
、Memcached
以及 Redis
等都进行一致的高性能响应。
Openresty
官网
一、Openresty安装
1.安装依赖开发组件
2.创建 nginx
用户组 nginx
的 Master
主进程以 root
用户身份运行,而 worker
子进程我们指定它为 nginx
用户运行
3.下载编译并安装Openresty
4.为 Openresty
添加环境变量
5.添加 location
配置确认结合了 Nginx
与 Lua
的 Openresty
部署成功
上面已经实现了 Openresty
的部署,下面将结合 WAF
实现防火墙
二、WAF介绍及实现
1.什么是 WAF
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall
,简称:WAF
)。利用国际上公认的一种说法:Web应用防火墙
是通过执行一系列针对 HTTP/HTTPS
的安全策略来专门为 Web
应用提供保护的一款产品。
2.实现 WAF
的方式有两种:
- 使用nginx+lua来实现WAF,须在编译nginx的时候配置上lua
- 部署OpenResty,不需要在编译nginx的时候指定lua
这里我们采用的是第二种
WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。
3.WAF
的功能
- 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
- 支持URL白名单,将不需要过滤的URL进行定义。
- 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
- 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
- 支持URL参数过滤,原理同上。
- 支持日志记录,将所有拒绝的操作,记录到日志中去。
- 日志记录为JSON格式,便于日志分析,例如使用ELKStack进行攻击日志收集、存储、搜索和展示.
4.部署 WAF
WAF
已经有人通过lua写出了这个开源的功能,在此直接拿来用即可。
GitHub地址:
5.下载 waf
模块
6.waf
文件介绍
三、Openresty引入WAF模块
1.修改 nginx
配置来引入 WAF
模块
2.重启Openrestyd
上面环境变量操作了可以直接用以下命令
如没有操作环境变量
3.查看报错
4.解决办法如下 上面告警是缺少 lua-resty-core
模块,从而找不到这些信息,所以我们要下载 lua-resty-core
模块然后引入到 Openresty
5.然后保存退出重启看日志
确保日志无异常后则成功引入WAF模块
四、WAF模块配置文件详解及拦截规则
1.waf/config.lua
配置文件中的内容
2.IP黑名单
配置
需要在 config.lua
中开启 config_black_ip_check = "on"
参数,默认打开
IP黑名单
配置非常简单,这个与 Nginx
的 ngx_http_access_module
模块原理是一致的,只需要把拒绝的地址加入到 waf/rule-config/blackip.rule
文件中即可
3.IP白名单
配置
需要在 config.lua
中开启 config_white_ip_check = "on"
参数 ,默认打开
IP白名单
与IP黑名单
相反,添加到IP白名单
中的 IP
不受 WAF
限制
4.CC攻击
过滤
需要在 config.lua
中开启 config_cc_check = "on"
参数,默认打开。然后指定 config_cc_rate = "10/60"
速率和时间 CC攻击
只需要在 config.lua
配置文件中指定这两个参数即可
如下指定在 60秒
内对于单个 IP地址
访问单个页面的次数最大 10次
,超过 10次
则自动拉入 黑名单
,60秒
后自动解除
然后进行测试,如下刷新 10次
以后就变为 403
(前提你的 IP
不要上面的 IP白名单配置
里)
换个页面再次刷新,换个页面可以正常访问,不过连续对一个页面 60秒
内刷新 10次
以后将也被拉入黑名单
注:以上的请求速率和时间只能作为参考,大家线上使用具体还要根据相应环境进行调整
5.异常URL
策略配置
需要在 config.lua
中开启 config_url_check = "on"
参数,默认打开。然后定义 rule-config/url.rule
文件,url.rule
文件默认为如下,如果匹配到规则的将跳转到由 config.lua
中 config_waf_output = "html"
参数指定的页面
- 禁止URL访问 .htaccess|.bash_history 的文件
- 禁止URL访问包含带有phpmyadmin|jmx-console|admin-console|jmxinvokerservlet地址
- 禁止URL访问包含 java.lang 的地址
禁止URL访问包含 .svn/ 的地址
假如你不想让别人访问根下的 /login
,那么就可以写入到配置中
然后进行重启后访问,如下就跳转到了我们在 config.lua
中指定的页面,此页面可根据需求进行修改。如果上面默认的 url
规则匹配到了你的地址,那么你就可以把相应配置去掉
5.异常UserAgent
策略配置
需要在 config.lua
中开启 config_user_agent_check = "on"
参数,默认打开。
WAF
模块中默认封锁了以下UserAgent
,如 HTTrack网站下载 namp网络扫描 audit网络审计 dirbuster网站目录扫描 pangolin SQL注入工具 scan网络扫描 hydra密码暴力破解 libwww漏洞工具 sqlmap自动SQL注入工具 w3af网络扫描 Nikto Web漏洞扫描 ...
等等
我们正常访问 URL
是没问题的,下面来模拟一个非法的 UserAgent
进行访问
模拟网站下载
模拟 nmap
网络扫描
添加禁止 Chrome
浏览器访问的 UserAgent
然后重启 Openrestry
,通过 Chrome
浏览器进行访问
6.异常 Get
参数策略配置
需要在 config.lua
配置中开启config_url_args_check = "on"参数,默认打开。
默认封锁了如下:
我们进行访问 http://192.168.31.219/hello?aa=select id from mysql
,得到如下,进行匹配
我们也可以根据自己需求去配置,如下最后添加linlikesi
然后我们进行访问 http://192.168.31.219/hello?aa=linlikesi
也会匹配到规则
7.异常POST参数策略配置
需要在 config.lua
中开启 config_post_check = "on"
选项,默认打开
默认 POST
请求封禁如下,POST
封禁内容与 GET
相似
直接对 POST
策略进行提交请求,通过 curl -XPOST
来进行提交 POST
请求
如上命中规则,我们查看 Openrestry
日志,查看是否为 POST
请求
Over ~
版权协议须知!
本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
1803 0 2020-07-30
博主卡片
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。
现在时间 2025-04-26
今日天气
随机推荐
站点统计
- 文章总数:241篇
- 分类总数:29个
- 评论总数:15条
- 本站总访问量 406524 次
@ymidsuwfoa 这篇文章不错!
@svmuvwpuqi 真棒!
@smdxydrauu 博主太厉害了!
@xiaozi 最后的分享的镜像下载地址打不开 服务器没有开机吗?
@yuanyuan 为什么我的4b安装centos7.9 插上tf卡 显示不兼...
@Wong arrhenius 牛比
@MakerFace 厉害了!
@TongSir 老哥 更新下我的友链链接 https://blog.ton...