在介绍Bro之前先总结一下几个常见的开放源码NIDS系统:
Snort ( http://www.snort.org/ )
目前最著名最活跃的开放源码NIDS项目,定位于轻量级的入侵检测系统,已经实现了网络探测器和许多第三方的管理及日志分析工具,广泛使用在对检测准确性要求不高的非高速网络环境下。对其进行介绍及分析资料辅天盖地,国内当前大多数的IDS产品都是在其基础上修改出来的。Snort的成功之处在于其高效的整体设计编码、简洁明了的规则描述设计及已经成一定规模的攻击检测规则集,它的规则集已经被很多其他开放源码IDS项目所兼容。
Prelude IDS ( http://www.prelude-ids.org/ )
目前比较活跃的开放源码混和IDS项目,比较注重IDS各组件的模块化设计,组件之间使用标准IDMEF格式进行通讯,从设计的方式来看定位于适应大型网络的需求,当前已经实现了网络探测器、日志分析器、告警信息集中查看分析工具。其网络探测器部分基本上翻版了Snort的功能,完全兼容 Snort的规则集。
Firestorm ( http://www.scaramanga.co.uk/firestorm/index.html )
不太出名的开放源码NIDS项目,目前仅实现了探测器部分,完全兼容Snort的规则集,功能上也基本上差不多,可以把告警信息记录到Prelude IDS的管理器,但自称性能上比Snort强很多。
NetSTAT ( http://www.cs.ucsb.edu/~rsg/STAT/ )
一个学术界的开放源码的IDS项目,基于STAT(State Transition Analysis Technique,状态迁移分析技术)描述攻击的研究成果,使用特有的STATL语言描述攻击,攻击描述文本被STATL解释工具转换为C++代码编译进检测引擎来实现检测功能,目前已经发布了STATL语言解释转换工具及一个基本的示例网络探测器部分(很少的几个检测功能例子)。要熟练使用这个IDS工具需要比较强的编程功底,但用此 IDS可以实现很复杂的检测功能。
可以看到当前大多数开放源码的NIDS项目都以Snort为基础,还有一些主要用于学术研究的IDS(比如NetSTAT),Snort是用于了解NIDS技术的很好入门方式,学术领域的IDS主要用于验证某些思想概念的可行性,这类IDS一般实现使用复杂,注重检测的严谨准确,如果商业化还需要很大的努力。Snort实现简单,使用方便,但本质上只是一个可以匹配分析数据包payload的嗅探器而已,对于有丰富网络知识的网管来说是个称手的网络流量过滤分析工具。由于只能对TCP/UDP/ICMP数据包的payload及某些数据包属性做些简单的匹配操作,而且没有特定的规则关联机制, Snort对于攻击的检测只能是粗线条的。当前的主流商业NIDS产品已经普遍采用细致的应用层协议分析技术,应用层协议分析技术不仅能够极大地提高检测准确性和效率,更能带来基于协议分析的异常检测能力,基于规则类似病毒检测的方式只能检测已知攻击,而基于异常分析的检测却可能检测到某些未知攻击,这点是新NIDS产品的发展热点和方向,基于异常并结合误用的IDS产品将会是未来IDS/IPS产品的主流。Snort虽然对一些应用层协议如HTTP、 PORTMAP、TELNET做了些简单的解码和处理,这些处理只是对匹配做的一些优化,远没有到协议分析的程度,Snort与当今主流IDS产品的差距越来越大,相对而言越来越落后,学习参考的价值越来越少。是不是存在技术上更有意思的开放源码的NIDS项目呢,我注意到了一个叫Bro的NIDS软件,它几乎提供了一切所希望见到的特性。
下面介绍一下Bro ( http://www.icir.org/vern/bro-info.html ),本文旨在分析Bro本身提供的一些很有意思且很有用的功能特性,不对其如何安装、配置、使用做介绍,那部分的内容可以参考软件包中的相关说明。
Bro是一个Vern Paxson实现的实时网络入侵检测软件,于98年对外发布,BSD license,它的最初设计目标是实现一个在100M网络下实时告警、机制与策略分离、高可扩展性的入侵检测及网络监视审计系统。
Bro的系统结构如下图示:
| 下发 ^ 实时
V 策略 | 告警
+-----------------------------+
| 策略脚本解释器 |
+-----------------------------+
| 事件 | 规则 ^ 事件
V 控制 | 控制 | 流
+--------+--------------------+
规则 +--------V-+ |
----->| 规则引擎 | 事件生成引擎 |
+----------+ |
+-----------------------------+
| Tcpdump ^ 过滤出
V 过滤器 | 的流量
+-----------------------------+
| libpcap |
+-----------------------------+
^
| 网络数据包
+-----------------------------+
| 网络 |
+-----------------------------+
Bro的设计实现遵循分层的原则,利用libpcap从网络上获取的数据包经过事件生成引擎和规则引擎被抽象成一系列的事件,这些事件被策略脚本做进一步的深入分析,基本事件本身就可以触发告警,策略脚本分析基本事件以后既可以生成新的事件也可以触发告警。如下详细描述各个组件的功能,对于Bro 提供的高级功能特性分析会穿插其间:
$ libpcap
Bro使用libpcap库来获取网络数据包,这样可以使Bro忽略具体的链路层细节,从而获得最大的可移植性。当前Bro支持FreeBSD、Solaris、Linux、Digital Unix等操作系统。
libpcap从上层的事件生成引擎获得Tcpdump格式的网络流量过滤器,从网卡上过滤出Bro感兴趣的那部分流量做进一步的分析。比如 “tcp port 80 or port 23”这个过滤器会从网络上过滤出源目的源口为80或23的TCP数据包做分析,也就是分析目标是HTTP和 TELNET协议相关的数据包。
$ 事件生成引擎
从libpcap获取的数据包经过事件生成引擎,引擎首先对数据包头做些合法性检查,生成一系列事件,比如引擎收到一个TCP包会先检查TCP头的checksum是否正确,检查通过以后引擎检查包头的标记位,如果是SYN标记引擎会启动一个定时器并生成一个connection_attempt 事件,当引擎再收到一个对方的确认包时,引擎会关掉定时器并生成一个connection_established事件,如果收到一个RST包,引擎则会生成一个connection_rejected事件。这些事件都会被提交给上层的策略脚本解释器,如果用户关心这些事件可以编写策略脚本定义相应的事件处理例程来处理。
在这一层,Bro还会对于一些应用层协议做更深层次的分析,比如对于HTTP协议,引擎会进一步分析数据包是请求还是回应、访问的对象、请求的方法等信息并生成相应的事件,比如http_request事件并包含了相关的数据字段。目前的最新版本软件支持FINGER、FTP、HTTP、 IDENT、PORTMAP、SMTP等应用层协议的分析,随着软件的开发会有更多的应用层协议分析加入进来,Bro在这一层上实现了应用层的协议分析并向上层策略脚本解释器提供抽象出来的事件。
$ 策略脚本解释器
Bro的策略脚本用于对事件生成引擎生成的事件进行分析处理,如果发现攻击特征引发相应的操作比如告警、记录或生成新的事件。Bro的策略脚本是用Bro语言编写的类似NFR N-Code的全功能解释执行的分析脚本,Bro语言提供了丰富的数据类型、流程控制手段及许多有用的分析函数,从实现上功能上与N-Code非常相似甚至有过之。如此功能强大的脚本语言可以对抽象出来的事件做充分细致的分析,组合Bro事件生成引擎中应用层协议分析和 Bro脚本的分析能力可以提供非常准确强大的入侵检测功能。