WAF与IPS的区别总结

谁是最佳选择?

Web应用防护无疑是一个热门话题。由于技术的发展成熟和人们对便利性的期望越来越高,Web应用成为主流的业务系统载体。在Web上“安家”的关键业务系统中蕴藏的数据价值引起攻击者的青睐,网上流传的Web漏洞挖掘和攻击工具让攻击的门槛降低,也使得很多攻击带有盲目和随机性。比如利用GoogleHacking原理的批量查找具有已知漏洞的应用程序,还有SQL批量注入和挂马等。但对于重要的Web应用(比如运营商或金融),始终有受利益驱动的黑客进行持续的跟踪。

如果说传统的“大而全”安全防护产品能抵御大多数由工具产生的攻击行为,那么对于有针对性的攻击行为则力不从心。而WAF正是应需求而生的一款高端专业安全产品,这也是市场需求细化的必然趋势。但由于其部署和功能方面与IPS有类似,有人提出疑问,为什么不能用IPS,或者说WAF与IPS有什么异同?谁更适合保护Web服务器?

这些疑问其实是有道理的,差异化的产生在于高端需求是不同的,从而需要细化功能贴合具体需求和符合应用现状的产品,这也是用户需求是随着业务自身的发展所决定的。

保镖和保安

为了更好的理解两款产品差异性,我们先用这个保镖(WAF)和保安(IPS)比喻来描述。

大楼保安需要对所有进出大楼人员进行检查,一旦发现可疑人员则禁止他入内,但如果混进“貌似忠良”的坏人去撬保险柜等破坏行为,大楼保安是无能为力的。

私人保镖则是指高级别、更“贴身”的保护。他通常只保护特定的人员,所以事先需要理解被保护人的身份、习惯、喜好、作息、弱点等,因为被保护人的工作是需要去面对不同的人,去不同的场合,保镖的职责不能因为危险就阻止、改变他的行为,只能去预见可能的风险,然后量身定做合适的保护方案。

这两种角色的区别在于保安保护的是整个大楼,他不需要也无法知道谁是最需要保护的人,保镖则是明确了被保护对象名单,需要深刻理解被保护人的个性特点。

图 1.1 保镖和保安

通过上面的比喻,大家应该明白两者的之所以会感觉相似是因为职责都是去保护,但差异在于职能定位的不同。从技术原理上则会根据定位来实现。下面通过几个层面来分析WAF和IPS的异同。

事件的时间轴

对于安全事件的发生,有三个时间点:事前、事中、事后。传统的IPS通常只对事中有效,也就是检查和防护攻击事件,其他两个时间点是WAF独有的。

图 1.2 事件时间轴

如上图所示,事前是指能在事件发生之前通过主动扫描检测Web服务器来发现漏洞,通过修复Web服务器漏洞或在前端的防护设备上添加防护规则等积极主动手段来预防事件发生。事后则是指即使Web服务器被攻击了,也必须有网页防篡改功能,让攻击者不能破坏网站数据。

为什么不能具备事中的100%防护能力?其实从以下几个方面就知道对于事中只能做到相对最佳防护而不能绝对,因为:

1. 软件先天是有缺陷的,包括应用到第三方的组件和函数库无法控制其安全性;

2. 应用程序在更新,业务是持续发展的、动态的,如果不持续监控和调整安全策略,也是会有疏漏的;

3. 攻击者永远在暗处,可以对业务系统跟踪研究,查找漏洞和防护缺陷,用各种变形繁杂的手法来探测,并用于攻击;

4. 任何防护设备都难以100%做到没有任何缺陷,无论是各种算法还是规则,都是把攻击影响降低到最小化。

所以需要用一个可闭环又可循环的方式去降低潜在的威胁,对于事中疏漏的攻击,可用事前的预发现和事后的弥补,形成环环相扣的动态安全防护。事前是用扫描方式主动检查网站并把结果形成新的防护规则增加到事中的防护策略中,而事后的防篡改可以保证即使疏漏也让攻击的步伐止于此,不能进一步修改和损坏网站文件,对于要信誉高和完整性的用户来说,这是尤为重要的环节。

图 1.3 WAF安全闭环

如果仅仅是对于事件的时间轴有区别,那么还是可以采用其他产品来进行辅助,但关键的是事中的防护也是有深度的差异,那么下面我们来谈谈对于事中的差异。

事中,也就是实时防护,两者的区别在于一个是纵横度,一个是深度。IPS凸显的优势在于纵横度,也就是对于网络中的所有流量进行监管,它面对的是海量数据,下图的TCP/IP模型中网络流量从物理层到应用层是逐层递交,IPS主要定位在分析传输层和网络层的数据,而再往上则是复杂的各种应用层协议报文,WAF则仅提供对Web应用流量全部层面的监管。 

图 1.4 数据结构图

监管层面不同,如果面对同样的攻击,比如SQL注入,它们都是可以防护的,但防护的原理有区别,IPS基本是依靠静态的签名进行识别,也就是攻击特征,这只是一种被动安全模型。如下是一个Snort的告警规则:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 
(msg:“SQL Injection - Paranoid”; flow:to_server,
established;uricontent:“.asp”;pcre:“/
(\%27)|(\‘)|(\-\-)|(%23)|(#)/i”; 
classtype:Web-application-attack; sid:9099; rev:5;)

这里主要是检查在SQL注入中提交的元字符,包括单引号( ’ )和双横( – ),从而避免注入’1 or 1=1— 之类的攻击发生,但同时又要考虑这些元字符转换成Hex值来逃脱过滤检查,于是又在规则里增加了其对应的十六进制编码后的字符串。

当然,要从签名特征来识别攻击要考虑的东西还很多,不仅元字符还有SQL关键字,包括:select insert update等,以及这些关键字的大小写变形和拼接,利用注释逃脱过滤,如下所示例:

使用大小写混杂的字符 :SeLecT fRom“

把空格符替换为TAB符或回车符 :select[TAB]from

关键词之间使用多个空格 :select from

字符串的数值编码 :0×414141414141 或 0×41004100410041004100

插入被数据库忽略的注释串 :sel/**/ect fr/**/om select/**/ from

使用数据库支持的一些字符串转换功能 :char(65) 或 chr(65)

使用数据支持的字符串拼接操作 :’sel’+'ect ’+'fr’+'om’” 、“‘sel’||’ect ’||’fr’||’om’可以设想一下,如果要检测以上的变形字符后的攻击则需要增加相应的签名特征,但更重要的是要充分考虑转换编码的种类,上面示例的snort的规则把可疑字符以及其转换后的Hex值放入同一条规则里检查,如果对于变形后繁多的攻击种类,这是滞后的并且会造成签名臃肿。

对于比较粗浅的攻击方式两者都能防护,但市面上大多数IPS是无法对报文编码做多重转换的,所以这将导致攻击者只需构建诸如转换编码、拼接攻击语句、大小写变换等数据包就可绕过输入检查而直接提交给应用程序。

而这恰恰又是WAF的优势,能对不同的编码方式做强制多重转换还原成攻击明文,把变形后的字符组合后在分析。那为什么IPS不能做到这个程度?同样还有对于HTTPS的加密和解密,这些我们在下节的产品架构中会解释。

产品架构

大家知道IPS和WAF通常是串联部署在Web服务器前端,对于服务器和客户端都是透明的,不需要做任何配置,似乎都是一样的组网方式,其实有很大差异。首先我们看看市面主流WAF支持的部署方式:

1、 桥模式

2、 路由模式

3、反向代理

4、旁路模式(非串联)

这两者串联部署在Web服务器前端时,市面上的大多数IPS均采用桥模式,而WAF是采用反向代理模式,IPS需要处理网络中所有的流量,而WAF仅处理与Web应用相关的协议,其他的给予转发,如下图: 

 

图 1.5 多协议图

桥模式和反向代理模式的差异在于:桥模式是基于网络层的包转发,基本都没有协议栈,或只能简单的模拟部分协议栈,分析网络报文流量是基于单包的方式,所以要处理分片报文、数据流重组、乱序报文、报文重传、丢包都不具备优势。同时网络流量中包括的协议种类是非常多的,每种应用层协议都有自身独特的协议特征和格式要求,比如Ftp、SSH、Telnet、SMTP等,无法把各种应用流量放到应用层协议栈来处理。

绿盟科技WAF系统内嵌的协议栈是经过修改和优化的,能完全支持Http应用协议的处理,这意味着必须遵循RFC标准(Internet Requests For Comments)来处理Http报文,包括如下主要RFC:

◆ RFC 2616 HTTP协议语法的定义

◆ RFC 2396 URL语法的定义

◆ RFC 2109 Cookie是怎样工作的

◆ RFC 1867 HTTP如何POST,以及POST的格式

RFC中对Http的request行长度、URL长度、协议名称长度、头部值长度等都是有严格要求的,以及传输顺序和应用格式,比如Html参数的要求、Cookie的版本和格式、文件上传的编码 multipart/form-data encoding等,这些应用层内容只能在具有完整应用层协议栈的前提下才可正确识别和控制,对于不完整的丢包,重传包以及伪造的畸形包都会通过协议校验机制来处理。

上一节提到的WAF对Https的加解密和多重编码方式的解码正是由于报文必须经过应用层协议栈处理。反之,IPS为什么做不到?是由于其自身的桥模式架构,把Http会话”打碎“成多个数据包在网络层分析,而不能完整地从应用层角度来处理和组合多个报文,并且应用层协议繁多,全部去支持也是不现实的,产品的定位并不需要这样。下一节的学习模式更是两者的截然不同的防护机制,而这一机制也是有赖于WAF的产品架构。

基于学习的主动模式

在前面谈到IPS的安全模型是应用了静态签名的被动模式,那么反之就是主动模式。WAF的防御模型是两者都支持的,所谓主动模式在于WAF是一个有效验证输入的设备,所有数据流都被校验后再转发给服务器,能增加应用层逻辑组合的规则,更重要的是具备对Web应用程序的主动学习功能。

学习功能包括:

1. 监控和学习进出的Web流量,学习链接参数类型和长度、form参数类型和长度等;

2. 爬虫功能,爬虫主动去分析整个Web站点,并建立正常状态模型;

3. 扫描功能,主动去扫描并根据结果生成防护规则。

基于学习的主动模式目的是为了建立一个安全防护模型,一旦行为有差异则可以发现,比如隐藏的表单、限制型的Listbox值是否被篡改、输入的参数类型不合法等,这样在面对多变的攻击手法和未知的攻击类型时能依靠安全防护模型动态调整防护策略。

结尾

WAF更多的特性,包括安全交付能力、基于cache的应用加速、挂马检查、抗DDOS攻击、符合PCIDSS的防泄密要求等都表明这是一款不仅能攻击防护,同时又必须在满足客户体验和机密数据防护的高度集成的专业产品。本文仅从产品特征的对比角度来分析了WAF的部分技术原理,但没否定IPS的价值,毕竟两者在部署场景和功能上具有很大差异。

摘自:http://hi.baidu.com/wenglsqs/item/dcac0c18e1201addbe90420a

转载于:https://www.cnblogs.com/milantgh/p/3603127.html

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

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

相关文章

企业微信:腾讯的“佛系”办公江湖

、 在协同办公领域,近几年来移动办公伴随着智能手机蓬勃发展起来,特别是腾讯和阿里的入场,改变了业内中小微市场群雄逐鹿的大混战态势,开启了楚汉争霸的局面。相比于钉钉强势的攻城略地,企业微信的“淡定”让人感觉很佛…

for语句中声明变量

在C语言中,局部变量应该在函数的可执行语句之前定义,但在C中变量可在任何语句位置定义,只要允许程序语句的地方,都允许定义变量。 在C99标准中C同C一样允许在for循环语句中定义变量。并且这个变量作用域被限定在for循环中,在for循环外就成为了未定义变量(C也是&…

Eclipse安装STS插件

Eclipse安装STS插件 1、下载STS插件 地址:https://spring.io/tools/sts/all/ 最上面是已经安装好STS插件的Eclipse软件,可以点击上图红框中的“previous Spring Tool Suite™ versions”,查看其它版本的Eclipse。下面依次为更新文件、更新站…

转载:CSS hack技巧大全

原文地址:http://www.duitang.com/static/csshack.html part2 —— CSS hack技巧大全 ——作者:吴雷君兼容范围:IE:6.0,FireFox:2.0,Opera 10.0,Sarari 3.0,Chrome参考资料: 各游览器…

Eclipse安装STS插件并解决安装缓慢问题

原 Eclipse安装STS插件并解决安装缓慢问题 2018年11月20日 10:22:29 MyronCham 阅读数 1198 标签: sts 更多 个人分类: 开发工具 Eclipse安装springsource Tool Suite(STS)插件:

TextBox控件中只输入整数的几种方法

方法一. if(e.KeyChar!8&&!Char.IsDigit(e.KeyChar)&&e.KeyChar!.) { e.Handled true; } 方法二: if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar ! 8) &&e.KeyChar!.) { e.Handled true; } 方法三:if (!Cha…

InvalidCharacterError: Failed to execute 'setAttribute' on 'Element': ')' is not a valid

问题描述&#xff1a; 在webStorm开发angular应用时候 或者vue等&#xff0c;页面没内容&#xff0c;浏览器控制台报错&#xff0c;报诸如题目类似的错误&#xff0c;无误定位性。没找到问题。 查错过程&#xff1a; 1、检查程序有误明显异常 2、检查依赖是否正常 3、检查对应…

Sencha touch API

Sencha touch API http://docs.sencha.com/touch/2.3.1/#!/guide/getting_started 转载于:https://www.cnblogs.com/wuyida/p/6300382.html

eclispe Springboot项目修改html,jsp 页面不能及时刷新

Springboot静态文件不更新的解决办法,以及Springboot实现热部署 正确答案是把菜单 Project > Build Automatically 。&#xff08;之前不知道怎么手瞎把这个给去了&#xff09;。否则再怎么设置缓存&#xff0c;devtools都是白瞎。

Java后台生成NO2016012701(代码+年月日+流水号)这样的流水编号

记录今日较大的点。 参考文章&#xff1a; https://blog.csdn.net/weixin_44538107/article/details/87740611 https://blog.csdn.net/jianqiangdexiaohai/article/details/81240176 项目过程中需要自动生成编号&#xff0c;不在数据库生成&#xff0c;而是在后台代码生成&am…

TFS架构

转载http://www.biaodianfu.com/taobao-tfs.html&#xff0c;感谢原作者标点符。 一、淘宝网的困境 对于淘宝网这样的大型电子商务网站&#xff0c;对于图片服务的要求特别的高。而且对于卖家来说&#xff0c;图片远胜于文字描述&#xff0c;因此卖家也格外看重图片的显示质量、…

(转载)WebStorm 2018.3.2 激活方式(永久)亲测好用!!!!!!

转载链接&#xff1a;https://blog.csdn.net/qq_31279347/article/details/85225234 前言&#xff1a; 总觉的注册码很费事&#xff0c;过一会儿就失效了&#xff0c;博主觉得还是打补丁的方式一劳永逸&#xff0c;很简单&#xff0c;两分钟。 博主版本如下&#xff1a; 第一…

Loaders

Loaders&#xff0c;获取数据的东西。 总体流程是&#xff1a;通过getLoaderManager().initLoader(0,null,this)获得Loader&#xff0c;如果没有&#xff0c;那么就会调用接口函数获取&#xff0c;注意&#xff1a;有ID&#xff0c;所以要在获取的接口函数里进行相应的选择。 会…

Linux内核模块开发常用内核接口

http://pan.baidu.com/s/1sjCqohv 转载于:https://www.cnblogs.com/pengdonglin137/p/3623827.html

vue 循环遍历 搜寻资料

写vue 循环遍历的 大全例子解释 转载连接 &#xff1a;https://www.cnblogs.com/xulei1992/p/6015416.html https://www.jqhtml.com/49765.html https://blog.csdn.net/qq_37591637/article/details/89072542 https://blog.csdn.net/zbw18297786698/article/details/6046673…

Qt 字符串QString arg()用法总结

原文&#xff1a;http://qimo601.iteye.com/blog/1420750 1、QString::arg()//用字符串变量参数依次替代字符串中最小数值 Cpp代码 QString i "iTest"; // current files number QString total "totalTest"; // number of files to pr…

安卓系统开机过程中logo和动画

安卓系统在开机过程中有多处会显示logo或动画&#xff0c;每个都会被next覆盖&#xff1a; boot这个是可选的&#xff0c;和硬件平台相关。boot运行过程非常短暂&#xff0c;显示logo也是一闪而过&#xff0c;所以一般不会使用。 kernel这个是内核提供的功能&#xff0c;和boot…

SVN登录时不断弹出用户名密码输入

** svn换了地址&#xff0c;所以重新定位&#xff0c;在输入账号时&#xff0c;重复报下图&#xff0c;也没有报错&#xff0c;所以就一直无效尝试。期间什么setting clear数据&#xff0c;注册表动文件&#xff0c;搜到的差不多都试了。始终一直报图一的结果。 然后最终结果…

Android Sqite数据库 6

想来想去又坑爹了,数据保存到json中去了,如何拿出来使用了,所以这一篇又要实现和上一篇相反的过程, 将Json转换成java各种对象: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Lan…

jqgrid 列表条件查询的几步关键操作

jqgrid列表条件查询 记录一下我自己老忘的几个点 这次记录一下使用jqgrid在列表查询时的关键点&#xff0c;过一段时间不用就是忘 1】在html页面用 v-model“q.xxx” xxx是在js处定义。 2】这是js里 在jqgrid查询列表时的模块使用postData 承载参数 3】 这是在定义vue对象时…