入侵检测系统分析及其在Linux下的实现

一、入侵检测系统分析

 

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分片包的功能。而且它同样具有很好的移植性。

#p#副标题#e#

2.4 数据分析模块

数据分析是入侵检测系统的核心。各种分析方法各有利弊,但基于规则的检测方法因为事先将各种入侵方式表示为规则存放于规则库中,因此在规则库比较完备的基础上,可以有很好的检测效率,所以我们在该系统的实现中主要考虑了基于规则的检测方法。

基于规则的检测方法是误用检测的一种。入侵检测系统需要从以往的攻击入侵活动中,归纳识别出对应的入侵模式,并将这些入侵模式存放于规则库中,然后将系统现有的活动与规则库中的规则进行模式匹配,从而决定是否有入侵行为发生。

每一种基于规则的入侵检测方法都需要一个确定的入侵模式库,即规则库,其中存放着描述入侵方法和行为的规则。在我们的系统中,采用了SNORT的入侵行为描述方法。SNORT是一个开放源代码的轻量级的基于网络的入侵检测系统。这种描述方法简单、易于实现,能够描述绝大多数的入侵行为。由于其简单,因此检测速度比较快。

规则库中的每条规则在逻辑上分为两部分:规则头部和规则选项。规则头部包含规则的操作、协议、源IP地址和目标IP地址及其网络掩码和端口。规则选项包括报警信息及需要检测的模式信息。规则的一般格式为:

<规则操作><协议><源主机IP><源端口><方向操作符><目标主机IP><目标端口>(<规则选项1:值1>;<规则选项2:值2>;…;<规则选项n:值n>;)

在圆括号前的部分是规则头部,在圆括号中的部分是规则选项。规则选项部分中冒号前面的词组称为选项关键字。规则选项不是规则的必需部分,它只是用来定义收集特定数据包的特定特征。一条规则中不同部分必须同时满足才能执行,相当于“与”操作。而同一个规则库文件中的所有规则之间相当于一个“或”操作。

以下是一个例子: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的一个范围的IP地址。

IP地址有一个“非”操作。这个操作符号用来匹配所列IP地址以外的所有IP地址。“非”操作使用符号“!”表示。例如任何由外部网络发起的连接可以表示为:alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111。

端口号可以用几种方法指定:用“any”、数字、范围以及用“非”操作符。“any”指定任意端口。指定端口范围用“:”它可以指定一个范围内的所有端口。如:log udp any any -> 192.168.1.0/24 1:1024。该条规则记录任何从任意主机发起的到目标网络任何主机上的1~1024端口的UDP协议数据包。

方向操作符“->”规定了规则应用的数据流方向。其左边的IP地址为数据流的起点,右边为终点。双向操作符为“<>”,它告诉系统应该关注任何方向的数据流。

规则选项形成了检测系统的核心,一个规则的规则选项中可能有多个选项,不同选项之间使用“;”分隔开来,他们之间为“与”的关系。选项由关键字和参数组成,每个关键字和它的参数使用冒号“:”分隔。这些关键字主要包括:

● msg:在警报和记录的数据中打印消息。

● logto:将数据包记录到一个用户指定的文件中。

● ttl:检测IP数据包的TTL域。

● id:检测IP数据包的分段ID域是否等于特定的值。

● nocase:设定搜索中使用与大小写无关的方式。

● dsize:检测数据包的有效荷载是否等于特定的值。

● content:在数据流中搜索特定的模式串。

● offset:设定content中的起点。

● depth:设定content中的终点。

● flags:检测TCP数据包的标志是否等于特定的值。

● seq:检测TCP的顺序号是否等于特定的值。

● ack:检测TCP的应答域否等于特定的值。

三、实例分析

下面结合入侵检测的实例来介绍该系统是如何检测入侵的,这里以WEB攻击为例来进行介绍。WEB攻击是入侵的一大类,它是指利用CGI、WEB服务器和浏览器等存在的安全漏洞来损害系统安全或导致系统崩溃的一类入侵方式。由于WEB的广泛使用,关于它的各种安全问题不断地发布出来,这些漏洞中的一些漏洞甚至允许攻击者获得系统管理员的权限而进入站点内部。因此,WEB攻击的危害很大。

虽然WEB攻击种类繁多,但是分析一下,还是具有如下几个特点:

● 都是通过HTTP数据流来进行的,所以可以通过HTTP数据流来进行检测。

● HTTP是无状态的协议,一般都是通过一次请求来实现,或者包含有一次具有典型的入侵特征的请求,所以利用一次请求信息就可以实现检测。

● 一般都是通过构造别有用心的请求字符串来实现的,所以可以采用基于规则的方法。

在我们的系统中可以检测出100多种WEB攻击方式。例如规则:alert http $EXTERNALNET any -> $HTTPSERVER 80 (content:/maillist.pl; nocase; msg: WEB-CGI Maillist CGI access attempt 😉 。该规则规定了检测从外网的任意端口到内网的WEB服务器的80端口的数据流。检测条件为请求中包含“/maillist.pl”字符串,匹配不分大小写,告警名称为“WEB-CGI Maillist CGI access attempt”。这里利用了两个自定义的变量$EXTERNALNET和$HTTPSERVER,分别表示外网和WEB服务器。

四、结束语

本文在对入侵检测系统进行分析的基础上,在Linux系统下实现了一个基于网络的入侵检测系统。实践表明,该系统对于检测一些常见的入侵方式具有很好的效率和性能。同时,该系统提供了完整的框架,可以灵活地应用于各种环境并扩充。当然,本系统还有很多不足的地方:数据源比较单一,还应该加入日志数据源;而且现在对于应用层协议只实现了HTTP协议分析,以后还可以加入其他协议分析,如TELNET、FTP等。这些都需要今后进一步完善。未来的入侵检测系统将会结合其它网络管理软件,形成入侵检测、网络管理、网络监控三位一体的工具。同时,网络安全需要纵深的、多层次的防护。即使拥有当前最强大的入侵检测系统,如果不及时修补网络中的安全漏洞的话,安全也无从谈起。只有将入侵检测系统与其他安全工具结合起来,才能构筑起一道网络安全的立体防御体系,最大程度地确保网络系统的安全。