从实现角度看Openresty + LUA = WAF

作者:糖果

1.WAF存在形态

WAF就是WEB防火墙,Nginx Lua和Openresty的出现,让基于LUA开发的WAF更有可能。对所有 会造成安全威胁的HTTP请求数据,都应该成为安全检查策略应该关注的内容,笼统上来讲OR WAF的式样要求的输入数据,就是可以在WEB服务器端见到的所有的HTTP数据,而这些数据对 OpenResty这种WEB服务器来讲,几乎都是可见的。

常见的WEB开发是不能关注所有的安全式样,比如XSS、SQL注入、CC等所有的这些涉及安全的 功能需求,并且这些需求随着外部安全气象发生变化的,需要不断的更新策略,这些是安全 共通业务而不是产品业务。

基于大日志数据分析的WEB安全分析模块,是一种接近实时拦截,而不是准实时的安全防火墙 机制。常见的OR(OpenResty)更多的是针对正则的实时拦截策略。基于LOG日志分析是一种异 步的处理机制实时读取日志,不会直接对产品业务线的性能有太多的干扰,而基于OR(OpenResty) LUA WAF大多数时是以代理的形式,串行的部署在正常的WEB业务前进行拦截的,是影响业务 响应时间的,在应急事件响应中与日常安全防护过程中,这两种形式各有利弊。

OpenResty + LUA = WAF目前的天花板,是带宽的上限和自身性能扩展的限制。

2.WAF需求与实现

从实现的角度,整体上可以把WAF看成是一个WEB请求数据的过滤器,在HTTP文本流中过滤威 胁字符串和恶意访问模式。而策略是什么?就是定义, 对HTTP请求中的数据,按那些“关键字” 、“正则”等规则定义进行查找,然后做出预定的响应的描述。

所以,对规则与响应动作的描述成为WAF实现的一个重点项目之一。

把WAF分成几大块的话,有以下枝干机能:

  1. 数据取得与组织(Stream、Pipeline等)。
  2. 规则与响应定义的解析(正则、JSON、YAML等)。
  3. 响应动作的执行发生。(Nginx状态、IP Table)。

如果OR + LUA = WAF是以代理形式存在的, 那业务的WEB服务一般是放在UpStream上的。 WAF就是一个与否判断状态机, True:有威胁进行拦截。 False:无威胁放行请求给上游 业务服务。

对于最小化的开源WAF来讲,就是要实现上面提及的功能特性。软件实现的过程,就是把 需求式样翻译成程序语言的过程,代码是对需求式样的一种计算机语言描述。Candy WAF 的由来就是为了对以上WAF式样进行程序语言实例化。

有Dashboard就会有针对策略的维护操作, Dashboard的后台的产出是数据定义,所以后台 的实现可以有更多解决方案选择,如Python、PHP、GO这些WEB开发语方和框架工具。

对Openresty来说,OR抽象出了高级别的几个处理阶段,如下:

Openresty执行阶段

3.WAF与一般WEB业务框架的差异

一般的OR + LUA的WEB框架,主要活劝处理阶段是在Content_by_lua阶段,主杆的框架功能 构成部分,比如说路由、HTTP Request请求数据集、Response响应模板渲染等。而这些功能 是一般WEB开发阶段需求的机能,和WAF存在部分的交集,但不同的地方是,WAF不只是在 content_by_lua阶段工作,其它常见的阶段比如说,在init阶段处理WAF数据初始化,在log阶段 输出log日志等阶段都做处理。

而如果WAF的功能是REST化的,那么WAF就需要WEB框架提供的JSON REST路由支持,这些功能 可以用固定模式的硬编码在WAF与直接实现,也可以抽出一个简单的WEB框架独立完成,这样 WAF就主要集中处理安全策略相关的代码实现,被抽出成共通框架的WAF代码更精简,抽出的 框架代码也可以被复用,如果写成固定的代码,更多的是可被编辑,而不是被独立的复用。

4.WAF处理数据的先后流程

a. Init阶段

a-1). 初始化解析策略规则定义。

b. Content阶段

b-1). HTTP请求数据取得与数据结构定义组织,往往WAF更高级的业务处理抽象概念会在这个 阶段产生(Stream、Pipeline等)。这个阶段的抽象更多的是类设计模式的抽象,而不是共 通机能的抽出。

b-2). 请求数据的过滤检索模式,模糊的看WAF是一个放大很多倍的大规模的字符串处理函 数集合(Input、Filter等)。

b-3). 拦截响应,WAF可以直接执行拦截动作,而可以产生成一个有意定义的数据操作定义 让基它守护程序去实执行。

c. Log段段

c-1). 产生日志与流量监控数据。

5.WAF后台

WAF后台的作用是对WAF策略定义的维护,包括新建、编辑、撤销等操作,可以做到与WAF数据 相关,功能不依赖,Dashboard的输出,是WAF在Init阶段的输入,需要被初始化的策略数据。 当然除此之外,还有其它功能,涉及状态显示、日志分析、分布调度。

以上是一个简单的功能规划,还可以更多的发散扩展功能。

原文

和我司实习生的工作日常 和我司实习生的工作日常

糖果

糖果
LUA教程

Apache APISIX在SAE应用市场发布

Apache APISIX在SAE应用市场发布 Continue reading

APISIX后台管理路由创建接口

Published on December 06, 2019

Openresty Nginx Tengine添加动态so库

Published on October 11, 2019