OpenResty学习笔记03:再探WAF

这篇具有很好参考价值的文章主要介绍了OpenResty学习笔记03:再探WAF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 再谈WAF

 
我们上一篇安装的WAF来自另一位技术大神 赵舜东,花名 赵班长,一直从事自动化运维方面的架构设计工作。阿里云MVP、华为云MVP、中国SaltStack用户组发起人 、新运维社区发起人。
虽然并非安全专业出身,但根据他的自述,边学边写,只用了几天的时间就将WAF写出来了,并于2016年正式发布到GitHub。
赵班长的WAF参考了Kindle大神写的 ngx_lua_waf ,另一款基于 OpenResty 的非常优秀的开源WAF。
不得不向 章亦春(agentzh)、赵舜东(赵班长)和 Kindle 等所有开源前辈们致以最高的敬意,让我等能有这么多的学习和实践资源,respect!
 

二. 了解撸啊(Lua)

 
在真正走近WAF之前,还是有必要对 Lua 这个脚本语言进行一番了解,因为所有的业务逻辑都是基于 Lua 实现的。
推荐两个关于Lua的学习资源:

  1. Lua基础教程与实践。
  2. 菜鸟Lua教程。
     

顺便分享本人正在使用的Lua调试工具:网盘链接
解压后其中有两个文件:

  1. LuaForWindows_v5.1.4-46.exe:适用于windows环境的Lua编译器。
  2. lua51.stx:适用于EditPlus环境的Lua语法高亮模板文件。
     
    配置完成后,在EditPlus中进行Lua的编写和测试还是很方便的:
    OpenResty学习笔记03:再探WAF
     

三. 配置入口

 
我们回过头,再来看看上一篇Nginx的配置文件中关于WAF引用的几行关键代码:

lua_shared_dict    limit 50m;
lua_package_path   "/home/my/tools/waflib/?.lua";
init_by_lua_file   "/home/my/tools/waflib/init.lua";
access_by_lua_file "/home/my/tools/waflib/access.lua";

 
这四个指令都来自 lua-nginx-module,用来实现对 Nginx 的每个 Worker 线程中 Lua 环境的配置和定义。

1. lua_shared_dict

作用:声明一个共享内存区域
层级:http
格式:lua_shared_dict <name> <size>

由于各 Worker 线程中的 Lua 环境相对是独立的,无法共享数据,但在很多情况下,需要在不同的 Worker 之间共享数据,此时就可以通过该指令进行声明。
此例中的 limit 就是声明出来的一个共享变量,在 WAF 中的作用就是在 CC 攻击检测时判断当前用户的请求频次是否超限进行拦截。

2. lua_package_path

作用:设置 Lua 脚本文件的搜索路径。;; 表示原始搜索路径。
层级:http
格式:lua_package_path <lua-style-path-str>

官网描述:设置由 set_by_Lua、content_by_Lua 等指定的脚本使用的 Lua 模块搜索路径,它的默认值是LUA_PATH环境变量的内容或LUA的编译默认值。
个人理解:在 Lua 中引用其他文件时,比如 require 'config',就会将 config 替换掉路径中的问号并尝试查找这个文件并引入进来。
配置搜索路径参数时,还可以使用 $prefix 变量来表示当前 Nginx 的工作目录,该目录一般在启动时通过 -p PATH 参数进行定义。
如果有多个搜索路径,可用 ; 分割。

3. init_by_lua_file

作用:指定初始化配置文件。
层级:http
格式:init_by_lua_file <path-to-lua-script-file>

个人理解:该初始化配置文件仅在 Nginx 启动时运行一次,主要用于对全局变量进行预加载或预处理。
但经过实践,在对本篇的 WAF 进行配置时,删除该指令并未产生任何影响。

4. access_by_lua_file

作用:请求访问阶段处理。
层级:http, server, location, location if
格式:access_by_lua_file <path-to-lua-script-file>

个人理解:每个请求接入时,都会经过该文件的处理,其作用类似于前置拦截器。
本篇的 WAF 在对请求进行检查时,主要就是从这个文件切入的。
 

四. 官方文档支持

 
lua-nginx-module 模块的官方文档:https://github.com/openresty/lua-nginx-module
 
其中最重要的两个部分:

  1. 指令(Directives):https://github.com/openresty/lua-nginx-module#directives
  2. API(Nginx API for Lua):https://github.com/openresty/lua-nginx-module#nginx-api-for-lua
     
    在学习 OpenResty 之前,还是需要对指令和API进行详细了解的。
     

五. 文件说明

 
再来看一下 waflib 的目录清单:
OpenResty学习笔记03:再探WAF
 

  1. access.lua:请求入口文件;
  2. config.lua:WAF详细配置文件;
  3. init.lua:WAF初始化文件,包含IP白名单、黑名单、URL注入、CC攻击等各种检测函数;
  4. lib.lua:WAF函数库文件,包含获取IP、获取规则、写入日志等各种通用函数;
  5. resty:一个来自 /usr/local/openresty/lualib/resty/ 的软连接;
  6. rule-config:存放规则文件目录。
     

再进入到 rule-config 目录,查看其中的文件清单:
OpenResty学习笔记03:再探WAF
 
以第一个 args.rule 规则文件为例,我们查看一下具体内容:

\.\./
\:\$
\$\{
select.+(from|limit)
(?:(union(.*?)select))
having|rongjitest
sleep\((\s*)(\d*)(\s*)\)
benchmark\((.*)\,(.*)\)
base64_decode\(
(?:from\W+information_schema\W)
(?:(?:current_)user|database|schema|connection_id)\s*\(
(?:etc\/\W*passwd)
into(\s+)+(?:dump|out)file\s*
group\s+by.+\(
xwork.MethodAccessor
(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
xwork\.MethodAccessor
(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
java\.lang
\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
\<(iframe|script|body|img|layer|div|meta|style|base|object|input)
(onmouseover|onerror|onload)\=

 
该文件定义了 22 条检测规则,一行一个,熟悉正则的话会很容易看懂。
我们也可以根据实际情况添加新的规则。
 

六. 引用关系

 
OpenResty学习笔记03:再探WAF
 
4 个Lua文件和 8 个规则文件,这12个文件就是这个WAF的全部,你就说巧妙不巧妙!
 

七. 简单优化

 
赵班长向我们展示了一个迷你WAF应该具备的基本能力,从代码上也能看出来,都是点到为止。
所以有必要进行一些简单的优化。
本人优化之后的代码:点此下载
 
优化说明:

  1. 一些空值的判断逻辑;
  2. 各检测函数的跳出逻辑;
  3. 补全POST参数注入的检测逻辑;
  4. 在lib.lua中增加了get_content_type函数,用来判断请求类型;
     

八. 本篇总结

 
到这里,就已经对 OpenResty 下的 WAF 从部署到使用有了全面了解了。
如果时间允许的话,真想继续对 WAF 进行深层次的学习和定制。
 文章来源地址https://www.toymoban.com/news/detail-438113.html

到了这里,关于OpenResty学习笔记03:再探WAF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • alibaba学习笔记03(小滴课堂)

    自定义Ribbon负载均衡策略实战 启动3个视频服务和一个订单服务: 我们可以看到它是随机调用的。 也可以使用其他负载均衡策略。 讲解新一代负载均衡组件feign介绍 这种方式去写死接口肯定是不妥当的。 于是我们使用feign负载均衡组件: 改造微服务 集成Feign实现远程方法调

    2024年01月19日
    浏览(41)
  • 【动手学深度学习】课程笔记 00-03 深度学习介绍及环境配置

    目录 00-01 课程安排 02 深度学习介绍 深度学习实际应用的流程 完整的故事 03 环境配置 1. 学习了这门课,你将收获什么? 深度学习的经典和最新模型:LeNet,ResNet,LSTM,BERT; 机器学习基础:损失函数、目标函数、过拟合、优化; 学习使用Pytorch实现上述知识点。 2. 这门课的

    2024年02月07日
    浏览(81)
  • NetworkX学习笔记03:度、平均度以及度分布

    💗💗💗 💗💗💗

    2024年02月15日
    浏览(38)
  • 《Python编程从入门到实践》学习笔记03列表

    [‘trek’, ‘cannondale’, ‘redline’, ‘specialized’] trek cannondale redline specialized specialized redline ada lovelace My first bicycle was a Trek. [‘honda’, ‘yamaha’, ‘suzuki’] [‘ducati’, ‘yamaha’, ‘suzuki’] [‘honda’, ‘yamaha’, ‘suzuki’, ‘ducati’] [‘honda’, ‘yamaha’] [‘honda’, ‘yamaha’, ‘

    2024年02月07日
    浏览(38)
  • 【STM32】STM32学习笔记-软件安装(03)

    MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌入式开发工程师使用。目前最新版本为: MDK6,该版本使用 uVision5 IDE 集成开发环境,是目前针对 ARM 处理器,尤其是 Cortex M 内核处理器的最佳开发工具。 MDK5 向后兼容 MDK4 和 MDK3 等,以前的项目同样可

    2024年04月08日
    浏览(52)
  • FPGA学习笔记03——RGB LCD显示屏

    LCD屏与FPGA芯片接口如下,其中LCD_R0—R7,G0—G7,B0—B7为RGB888信号, LCD_BL:背光板使能,为高时背光板才亮 LCD_DE:RGB数据使能,为高时RGB数据有效 LCD_VSYNC:竖直(列)扫描有效 LCD_HSYNC:水平(行)扫描有效 LCD_CLK:显示器时钟 //在控制RGB LCD屏时,即可使用DE使能,也能用VSY

    2024年02月03日
    浏览(36)
  • openGauss学习笔记-03 openGauss极简版单节点安装

    openGauss支持以脚本方式进行极简安装,极简安装包括单节点安装和一主一备节点安装。 3.1 获取安装包 3.1.1 下载对应平台的安装包 从openGauss开源社区下载对应平台的安装包 登录openGauss开源社区,选择对应平台的最新安装包下载。对于个人开发者或非企业级环境,下载极简安

    2024年02月13日
    浏览(41)
  • Unity学习笔记(零基础到就业)|Chapter03:C#核心

    这系列的学习笔记主要是根据唐老狮的unity实战路线课程整理的,加入了自己的一些补充和理解,该课程涉及的知识内容非常多,我并未学完,而是根据就业需求挑选学习的,也对后续框架部分进行了一些修改,希望能通过整理并时常阅读这些笔记巩固开发知识,也希望能跟

    2024年02月20日
    浏览(60)
  • k8s学习笔记-03(Pod yaml文件编写)

    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。 邮箱:yinwanit@163.com Pod在k8s中归属apiVersion版本为v1。在编写yaml文件中apiVersion应该设置为v1。kind才能设置成Pod。 编写Pod的yaml文件时可以参考  kubectl explain --api-version=v1  pod. 一级一级查看具体的配置项

    2024年02月14日
    浏览(44)
  • 机器学习32:《推荐系统-V》再谈召回、打分和重排

    在《推荐系统(一)概述》一文中,笔者概述了推荐系统的基本术语和一般架构,通过【推荐系统 I~IV】系列课程的学习,相信读者对推荐系统已经有了一定的理解。本节,我们再来回顾一下推荐系统的核心环节——召回、打分、重排。 目录 1.召回-Retrieval 1.1 大规模检索

    2024年02月17日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包