概述:
Snort实现简单,使用方便,原本只是一个可以匹配分析数据包payload的嗅探器,但是版本2.0后升级改进了很多,也实现了一些根据应用层协议来实现特征匹配。Bro事件生成引擎中实现的应用层协议功能比Snort多, 目前版本0.9a11版本支持的应用分析器有DNS Analyzer, Finger Analyzer, Ftp Analyzer, Http Analyzer, Ident Analyzer, Irc Analyzer, Login Analyzer, Pop3 Analyzer, RPC Analyzer, SSL Analyzer.等.应用层协议分析技术不仅能够极大地提高检测准确性和效率,更能带来基于协议分析的异常检测能力。Snort也对一些应用层协议如HTTP、PORTMAP、TELNET,FTP做了些简单的解码和处理(也即Snort预处理器功能),这些处理先对匹配做了一些优化(相比bro的事件生成引擎机制要简单得多),然后再根据不同的协议特征进行匹配. Bro提供了一些关键的高级特性:强大的用于对事件做深入分析的策略脚本、规则与策略脚本的交互,相比来说Snort检测方式还是简单粗糙的,但是Snort新的版本2.0后也支持了很多高级特性:如支持正则表达式的数据匹配、规则关联等。
Bro和Snort概要设计图:
策略 脚本 警报/记录 警报/记录
输出插件
策略脚本解析器
检测引擎
事件控制 事件流
事件生成引擎,规则引擎
预处理器插件
解码引擎
过滤器
数据包截获(libpcap)
网络目标
网络目标
数据包截获
Bro系统设计
Snort系统设计
功能上:
1. 两者都提供了强大的入侵检测功能,如根据规则特征发现病毒,木马等攻击行为.产生报警日志.同时2者都可以提供IPS的功能。Snort用一种Inline模式结合Iptable能提供对所有攻击数据包进行拦截的功能(drop掉数据包),但是这种情况下Snort通过Iptable截获数据包而不是通过libpcap库获取数据包的拷贝,自己特征匹配后再交给Iptable处理,作为防火墙来说,势必严重影响其处理速度,我们这里还是不宜使用。 Bro通过rst应用程序直接给对方发送TCP RST包中断和对方的连接,但是细读帮组说明文档,没有看到其对udp包如何拦截(个人感觉仅仅关闭tcp还谈不上IPS功能)。而仅仅对于tcp的连接关闭,Snort也有更好的支持,用关键字resp可以关闭双方或者单方的连接。
2. snort由于知名度比较高,使用广泛,国内几乎成为IDS的代名词,所以相关的辅助工具很多,比如报警日至分析工具(SnortSnarf),数据库浏览分析工具(ACID),bro的分析工具bro Report目前还在开发阶段,仍然没有完成! 还有Snort有一个很好的规则配置以及智能升级工具IDS Policy Manager(Windows2000/xp平台),用来升级配置规则都很简单.
3. 监视数据库的应用,snort支持很多检查数据库(Oracle,my_sql,ms_sql)攻击的规则,如删除Oracle数据库中表的企图等,Bro对数据攻击支持几乎没有.
4. 由于snort由一个专业的商业公司(Sourcefire)支持维护, 其VRT(Vulnerability Research Team) 项目组专们跟踪当前网络攻击,提供了攻击特征库的实时升级(并且负责测试规则),目前(2006-2-5)的特征规则数目达到5600多条,Bro的版权是the University of California, through Lawrence Berkeley National Laboratory(加州大学劳伦斯-贝克莱国家实验室),目前还在不断的开发完善中,,其特征规则库只有随Bro版本升级时候一起升级发布!Bro推出了一个工具Snort2Bro,将Snort的规则转化为Bro的脚本语言,这个工具能转化大部分规则!
5.Snort还可以直接写到Syslog或者数据库oracle,my sql,ms sql,Bro不行。Bro可以直接通过e-mail报警,Snort必须通过第三方工具Swatch。
6.Snort基本上只能简单的匹配一个个规则,Bro可以在事件处理(Event handle)中对一个个网络行为进行分析,可以分析出一些异常行为!但是对于一般常见的行为如tcp的连接,端口扫描,snort利用sfPortScan,stream4预处理插件也可以检测出ip,tcp,udp的portscan,以及ddos攻击等。
使用上:
1 .Bro策略脚本的编写需要不少时间和精力的投入,Bro的作者提供了完整的使用手册,包括各种特定数据类型的说明、引擎本身支持的函数说明、如何使用的示例,用户必须经过一定时间的学习可以完全掌握。实际上bro策略脚本提供了一个基本框架,里面定义了一些事件处理器(event handle)和函数,感觉类似于windows下的消息驱动机制,事件生成引擎用一个类似message queue的event queue,然后会根据应用层协议自动调用这些event handle, 第三方可以补充修改它扩充功能。
Snort 规则脚本简单的多,一条规则仅仅是简单的包括规则头和规则体,头部制定一个动作行为,如alert,log,pass等. 规则体就是一些关键字构成动作的条件.
这样当用户对规则进行配置的时候,一般也就是使用不使用这条规则,这样只要提供一个索引文件,把所有得规则对应的文件名,位置记录下来,用户配置好了后,就根据这个文件找到规则所在文件去注释或者启用一条规则,很方便简单。 Bro由于规则是写在脚本语言程序里,要修改脚本程序(一般也就是注释掉一段代码),相比snort注释一行代码要麻烦点。
2 Snort每条规则都有一个说明文档,对该规则功能,特征作了详细的说明,bro的规则必须自己读懂一个个脚本语言程序,自己分析程序代码提供的功能! 不过bro的规则一般也都是Snort的子集,有Snort作为参考,bro的规则好理解多了!Bro缺少的规则我们可以用其工具Snort2Bro,将Snort的规则转化为Bro的。
3.Snort使用普及的多,网上中文资料很多,bro还在发展状态,网上的中文资料很少,必须自己去看提供的user-mannul,reference-mannul,总共400多页!完全是英文的,对于英文不是很好的读者,看懂理解要花费不少时间.本人就是在读这些英文手册以及研究自带脚本提供的功能上浪费了大量时间(主要是英文看得太累,一句话要看n遍才看的是懂非懂,看着看着人就发懒,看看其他东西调节去了^_^)!不过最痛苦的时候基本已经过去,现在对IDS有了一定理解回头再查看也简单容易理解多了!
测试性能上:
目前测试的时候snort(版本2.4.3)规则脚本有3.25M(支持5600条左右规则),bro(版本0.9a11)规则脚本只有1.06M(支持2600条左右规则).注意,bro要有perl支持才能使用,Bro语言内嵌支持perl语法。
测试结果如下(机器配置cpu:Cyrix 600,mem:128M):
1. 20M流量测试:
cpu men
bro 1.4% 25%
Snort 82.5% 41.3%
2.。40M流量测试:
cpu mem
Snort 83% 41.3%
Bro 1.4% 26%
2.。80M流量测试:
cpu mem
Snort 81.6% 41.4%
Bro 1.4% 25%
测试结果很奇怪,发现bro的cpu一直没有什么变化,仔细分析其日至发现原来bro是基于应用层协议来分析的,libpcap的filter条件(capture_filter)仅仅是定义的的一些协议(如http,ftp,telnet,netbios等),而我们测试发送的包都不是他所支持的协议要分析的包,所以基本没有分析(也就不用消耗cpu了)!后来仔细分细脚本程序,修改代码使得capture_filter为”tcp or udp”来抓所有tcp和udp包来分析,cpu马上达到90%左右.测试数据如下:
cpu mem
80M 92.6% 27.0%
40M 92% 27.2%
20M 92% 26.9%
(bro抓所有tcp和udp包测试)
但这样就破坏了bro的基本原理了!变得和snor差不多了!还有就是流量大小变化的时候,snort cpu占用也几乎不变,原因是snort的规则匹配也是根据一定的协议特征来进行的,我们的数据包不符合规则链中应用协议特征,也就没有根据协议来进行匹配运算了,基本上cpu都是消耗在libpcap抓包上.另外snort消耗内存大多了,原因是snort要把规则都读到一个三维链表里,比较消耗内存,但是snort启动脚本支持一种lowmem启动方式,启用了后,cpu也就稳定在25%左右了!测试数据如下:
cpu mem
80M 74.8% 25.0%
40M 73.8% 25.0%
20M 72.5% 25.0%
(Snort低消耗内存模式下测试)
总结:从开发使用上的不便看, Bro说明文档少,中文资料只有简单的几遍介绍,相反snort手册被翻译成中文,还有snort开发者们写的参考书也被翻译成中文书籍出版,对于开发短期短,时间比较匆忙还是使用Snort简单方便的多!目前来说对bro使用,脚本语言也基本了解得差不多,但是由于其功能没有snort完善,要修改的东西还是比较多!比如要提供报警,日志分析工具,输出到syslog等。但是snort要抓取所有的包来分析,这样占用cpu太多,bro只对特定的包分析,占用cpu要少,要是网络上都是特定协议的包,比如http包,那2者估计也没什么区别了(测试比较感觉2者性能都差不多)!这样还不如修改一下snort源代码,使得snort 抓取取的包和bro一样有过滤条件,否则抓了包不用匹配运算还是白抓了!