作者:糖果

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阶段的输入,需要被初始化的策略数据。
当然除此之外,还有其它功能,涉及状态显示、日志分析、分布调度。

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

原文

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