作者:北京理工大学计算机科学工程系 薛静锋 李志强
一、入侵检测系统分析
1.1 什么是入侵检测系统
所谓入侵,是指任何试图危及计算机资源的完整性、机密性或可用性的行为。而入侵检测,顾名思义,便是对入侵行为的发觉。它通过从计算机网络或系统中的若干
关键点收集信息,并对这些信息进行分析,从而发现网络或系统中是否有违反安全策略的行为和遭到袭击的迹象。进行入侵检测的软件与硬件的组合便是入侵检测系统(简称IDS)。与其他安全产品不同的是,入侵检测系统需要更多的智能,它必须可以将得到的数据进行分析,并得出有用的结果。一个合格的入侵检测系统能大大简化管理员的工作,保证网络安全地运行。
1.2 入侵检测系统的分类
按检测所使用数据源的不同可以将IDS分为基于主机的IDS和基于网络的IDS。
基于主机的IDS使用各种审计日志信息(如主机日志、路由器日志、防火墙日志等)作为检测的数据源。通常,基于主机的IDS可监测系统、事件和操作系统下的安全记录以及系统记录。当有文件发生变化时,IDS将新的记录条目与攻击标记相比较,看它们是否匹配。如果匹配,系统就会向管理员报警,以采取措施。
基于网络的入侵检测系统使用原始网络分组数据包作为数据源。基于网络的IDS通常利用一个运行在混杂模式下的网络适配器来实时监视并分析通过网络的所有通信业务。一旦检测到了攻击行为,IDS的响应模块就会对攻击采取相应的反应,如通知管理员、中断连接、终止用户等。
1.3 入侵检测的检测方法
入侵检测技术通过对入侵行为的过程与特征的研究,使安全系统对入侵事件和入侵过程能做出实时响应,从检测方法上分为两种:误用入侵检测和异常入侵检测。
在误用入侵检测中,假定所有入侵行为和手段都能够表达为一种模式或特征,那么所有已知的入侵方法都可以用匹配的方法发现。误用入侵检测的关键是如何表达入侵的模式,把真正的入侵与正常行为区分开来。其优点是误报少,局限性是它只能发现已知的攻击,对未知的攻击无能为力。
在异常入侵检测中,假定所有入侵行为都是与正常行为不同的,这样,如果建立系统正常行为的轨迹,那么理论上可以把所有与正常轨迹不同的系统状态视为可疑企图。比如,通过流量统计分析将异常时间的异常网络流量视为可疑。异常入侵检测的局限是并非所有的入侵都表现为异常,而且系统的轨迹难于计算和更新。
对比这两种检测方法可以发现,异常检测难于定量分析,这种检测方式有一种固有的不确定性。与此不同,误用检测会遵循定义好的模式,能通过对审计记录信息做模式匹配来检测,但仅可检测已知的入侵方式。所以这两类检测机制都不完美。就具体的检测方法来说,现在已经有了很多入侵检测的方法,但任何一种方法都有它的局限性,都不能解决所有问题。因而对于入侵检测方法的研究仍然是当前入侵检测研究的一个重点。
二、Linux下的实现
在对入侵检测技术研究的基础上,我们在Linux系统下设计并实现了一个基于网络的入侵检测系统。
2.1 系统的组成结构
该系统的组成结构如图1所示。数据采集模块负责从网络上收集原始的网络数据流,在经过一定的预处理后,这些数据被送到数据分析模块,由数据分析模块进行分析,以便判断是否有违反安全策略的入侵行为发生。并及时将分析结果送到告警模块,由告警模块向控制台产生告警信息。用户可以通过用户界面与控制台交互,通过控制台,一方面可以对各个模块进行配置,另一方面也可以接收告警信息。
图1 系统的组成结构
2.2 系统的功能描述
该系统实现了入侵检测的主要功能,包括数据采集、数据预处理、入侵分析以及告警。具体来说,可以完成以下功能:
● 捕获符合指定条件的网络数据包。
● 进行IP重组,提供IP包数据。
● 重组TCP流,提供TCP流数据。
● 重组应用层数据流,提供HTTP数据流。
● 实现基于规则的入侵检测方法。
● 向控制台提交分析结果。
● 接受控制台的配置和管理。
由于该系统功能的实现主要体现在数据采集模块和数据分析模块中,所以下面将对这两个模块加以详细说明。
2.3 数据采集模块
数据采集是入侵检测的基础,入侵检测的效率在很大程度上依赖于所采集信息的可靠性和正确性。在基于网络的入侵检测系统中,数据采集模块需要监听所保护网络的某个网段或某几台主机的网络流量,经过预处理后得到网络、系统、用户以及应用活动的状态和行为信息。数据采集需要在网络中的若干关键点进行。
具体来说,数据采集模块需要监听网络数据包,进行IP重组,进行TCP/UDP协议分析,同时也要进行应用层协议数据流分析。采集到的数据要经过预处理才能提交给数据分析模块。由于不同的分析方法所需要的数据源是不同的,所以预处理也会有很大的不同。但是,一般来说,分析模块所分析的数据都是基于某个网络协议层的数据信息,或是直接采用这些数据的某些部分。因此在该系统的设计中,数据采集模块除了采集数据外,还要对这些信息进行协议分析。协议分析是指将网络上采集到的基于IP的数据进行处理,以便得到基于某种协议的数据。在本系统中主要是针对TCP/IP协议族的分析。
网络数据采集是利用以太网络的广播特性实现的,以太网数据传输通过广播实现,但是在系统正常工作时,应用程序只能接收到以本主机为目标主机的数据包,其他数据包将被丢弃。为了采集到流经本网段的所有数据,我们需要首先将网卡设置为混杂模式,使之可以接收目标MAC地址不是自己MAC地址的数据包,然后直接访问数据链路层,截获相关数据,由应用程序对数据进行过滤处理,这样就可以监听到流经网卡的所有数据。
在进行数据捕获时,我们采用的是libpcap,libpcap是一个与实现无关的访问操作系统所提供的分组捕获机制的分组捕获函数库,用于访问数据链路层。该库提供的C函数接口可用于需要捕获经过网络接口数据包的系统开发上。这个库为不同的平台提供了一致的编程接口,在安装了libpcap的平台上,以libpcap为接口写的程序,可以自由地跨平台使用。
Libpcap在网上捕获到的是数据帧,我们还需要对数据帧进行协议分析,协议分析的处理过程为:首先根据预先定义的过滤规则从网络上获取所监听子网上的数据包,然后进行TCP/IP栈由下至上的处理过程,主要是IP重组和TCP/UDP层协议处理,最后进行应用层协议分析。
协议分析的工作在每个操作系统里都有,在这里,我们选择了libnids函数库。libnids是在libnet和libpcap的基础上开发的,它封装了开发网络入侵检测系统的许多通用型函数。libnids提供的接口函数除了可以监视流经本地的所有网络通信、检查数据包外,还具有重组TCP数据段、处理IP分片包的功能。而且它同样具有很好的移植性。
2.4 数据分析模块
数据分析是入侵检测系统的核心。各种分析方法各有利弊,但基于规则的检测方法因为事先将各种入侵方式表示为规则存放于规则库中,因此在规则库比较完备的基础上,可以有很好的检测效率,所以我们在该系统的实现中主要考虑了基于规则的检测方法。
基于规则的检测方法是误用检测的一种。入侵检测系统需要从以往的攻击入侵活动中,归纳识别出对应的入侵模式,并将这些入侵模式存放于规则库中,然后将系统现有的活动与规则库中的规则进行模式匹配,从而决定是否有入侵行为发生。
每一种基于规则的入侵检测方法都需要一个确定的入侵模式库,即规则库,其中存放着描述入侵方法和行为的规则。在我们的系统中,采用了SNORT的入侵行为描述方法。SNORT是一个开放源代码的轻量级的基于网络的入侵检测系统。这种描述方法简单、易于实现,能够描述绝大多数的入侵行为。由于其简单,因此检测速度比较快。
规则库中的每条规则在逻辑上分为两部分:规则头部和规则选项。规则头部包含规则的操作、协议、源IP地址和目标IP地址及其网络掩码和端口。规则选项包括报警信息及需要检测的模式信息。规则的一般格式为:
(;;…;;)
在圆括号前的部分是规则头部,在圆括号中的部分是规则选项。规则选项部分中冒号前面的词组称为选项关键字。规则选项不是规则的必需部分,它只是用来定义收集特定数据包的特定特征。一条规则中不同部分必须同时满足才能执行,相当于“与”操作。而同一个规则库文件中的所有规则之间相当于一个“或”操作。
以下是一个例子:alert tcp any any - 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)。该条规则描述了:任何使用TCP协议连接网络192.168.1.0/24中任何主机的111端口的数据包中,如果出现了二进制数据00 01 86 a5,便发出警告信息mountd access。
规则操作说明当发现适合条件的数据包时应该做些什么。有两种操作:alert和log。如果是 alert,则使用选定的告警方法产生警报,并记录这个数据包;如果是log,则只记录该数据包。
协议指明当前使用的是何种协议。对于IP地址和端口,关键字“any”可以用来定义任何IP地址。在IP地址后指定网络掩码,如/24指定一个C类网络,/16指定一个B类网络,/32指定一个特定主机。如192.168.1.0/24指定了从192.168.1.1 到 192.168.1.255的一个范围的