基于特征的主机入侵检测系统
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
基于特征的IDS的设计与实现
3.1 基于特征的IDS的特征
这次设计的IDS最大特点是模块化。其原理就是将功能分为几个模块,各个模块实现不同的功能。系统的处理流程如图所示:
【www.think58.com计算机毕业论文网】
[资料来源:http://THINK58.com]
图1 snort的流程图
“入侵检测一般分为3个步骤:信息收集、数据分析、响应” [7]对应于以上3个步骤,snort由以下几个模块来实现上述功能:数据包嗅探器,预处理器,检测引擎和报警输出模块。构成如图所示: [资料来源:http://think58.com]
think58.com [资料来源:http://www.THINK58.com]
图2 snort的模块工作原理
如图所示,从网络(Network)上获得了数据包以后通过sniffer嗅探器之后再通过预处理器(Preprocessor)处理,处理后的数据由搜索引擎(Detection)根据制定好的规则(Rulesets)来进行检测,不同的检测结果采用不同的行动,如忽略(Ignore)、报警(Alert)或记录(Log)等等。
由于本次IDS的最大特点是模块化,所以IDS的功能主要是按功能模块来区分的:
(1)包捕获模块:用于捕获通过主机的网络数据包,将捕获数据包传送至包解码模块;
(2)包解码模块:支持以太网和SLIP及PPP媒体介质,其作用就是为探测引擎搜索数据;
(3)包预测模块:用来判断数据包的协议类型,以便根据不同的协议采取不同的检测手段;
(4)检测模块:检测数据包(此时的数据包是剥离了协议头的数据包),将检测结果交给输出模块处理;
(5)输出模块:根据检测结果采取不同的应对手段,包括记录(Log)、报警(Alert)、忽略(Ignore)等等。
IDS的几个模块功能区分是十分清晰的,各个模块的功能由不同的软件来完成,如包捕获模块(WinPcap)、检测模块中的数据库(MYSQL)等。他们之间的数据流动关系如图所示:
选择输出模式
(log file,console, socket)
[资料来源:http://THINK58.com]
图3 模块间的数据流关系图
从上图可以看到,网络数据包首先到达的是包捕获模块(Packet capture module)。在捕获数据包以后会经过包解码模块(Decoder)将数据包的一些协议头(如TCP、UPD、IP等)去掉,再经由包预测(preprocessor)模块还原成最原始的数据包,由检测(Detection Engine)模块来进行检测,检测结果交给输出(Output Plug-ins)模块进行记录。
3.2包捕获模块
包捕获模块的功能是实现网络数据包的捕获功能,不同平台下使用不同的抓包工具,Win32平台下使用的是WinPcap,而Linux平台下使用的是LibPcap。由于snort在Linux平台上使用居多,鉴于WinPcap和LibPcap都是抓包工具区别不大所以这里以LibPcap为例进行介绍。IDS调用LibPcap的过程是在snort的主函数snort.c里的openpcap函数实现的。调用libpacp函数逻辑如图所示: 本文来自think58
有必要说一下libpcap是IDS的环境软件之一,其作用就是负责抓包。上图是IDS如何指挥libpcap抓包的逻辑图。该模块实现的功能实现到libpcap库流程的循环抓包前为止,循环抓包是到snort.c 主流程的InterfaceThread函数中实现。
以下是libpcap库各个函数的作用:
(1)pcap_lookupdev
pcap_lookupdev用来查找系统第一个可以使用的网络适配器,查找成功后,
返回该设备的名称;如果系统有多个网卡,也可以使用pcap_findalldevs函数来查找选取。
(2)pcap_open_live
函数用于打开指定网络适配器,准备截取数据。其调用形式为:
pd = pcap_open_live() /* 以下是参数 */
( pv.interface, /*设备名称*/
snaplen, /*捕获包的长度,通常设置为65536,表示捕获链路层上的所有数据*/
pv.promisc_flag ? PROMISC : 0, /*网卡是否工作于混杂模式*/
READ_TIMEOUT, /*超时时间控制,单位毫秒*/
Errorbuf ); /* 出错信息存储 */
(3)pcap_open_offline
Libpcap 使用库函数pcap_open_offline 进行脱机方式截获,即先将网络上的数据截获下来,以文件形式储存到磁盘上,等事后方便时再从磁盘上读取数据文件来做进一步分析。
think58好,好think58 [资料来源:http://think58.com]
(4)pcap_snapshot
函数用于获取数据链路层协议的类型。
(5)pcap_compile 和pcap_setfilter
在进行数据包截获时,常常并不需要捕获所有的包,如只需要捕获ARP协议等,这时就需要过滤规则。Pcap_compile 用于将设置的过滤字符串编译成一个过滤器程序。而pcap_setfilter则用来设置过滤器的过滤规则。
(6)pcap_loop
前面的函数都可以看做捕获数据包的准备工作,pcap_loop 用来从网络中捕获数据包。需要注意的是函数的第三个参数,它是一个回调函数,捕获到的数据包,就交由它来处理。
3.3包解码模块
本模块由snort.c文件中的SetPktProcessor函数实现。Snort的包解码支持以太网和SLIP及PPP媒体介质。包解码所做的所有工作就是为探测引擎准备数据。该函数根据datalink(由上面的libpcap库函数得到)的值来判断并关联解码函数。解码模块结构如图所示: 本文来自think58 [资料来源:www.THINK58.com]
think58好,好think58 [资料来源:http://www.THINK58.com]
图5 包解码模块的结构
从上图可以看到该模块的起始点是PCAP loop ProcessPacket(),这里是包捕获模块把捕获的包传到解码模块的地方。在收到数据包以后,会根据不同的协议来匹配,匹配合适以后就会按照下面的分枝来进行解码。比如包捕获模块收到一个IP数据包,首先检测该包是属于哪种类型的,检测到是属于EthPkt类型网,那么就确定是IP数据包。接下来再更加细致的区分该数据包是用的哪种协议的,由此又可以分为TCP、UPD、ICMP等等类型。
部分关键的代码如下:
int SetPktProcessor()
{
switch(datalink)
{
case DLT_EN10MB: /* Ethernet */
grinder = DecodeEthPkt;
break;
case DLT_IEEE802: /* Token Ring */
grinder = DecodeTRPkt;
break;
/* 以下略 */
}
}
其中 grinder 是 snort.c 中的全局的函数指针,其定义如下:
typedef void (*grinder_t)(Packet *, struct pcap_pkthdr *, u_char *); /* ptr to the packet processor */
3.4 预处理模块
[8]“预处理模块的作用是对当前截获的数据包进行预先处理,以便后续处理模块对数据包的处理操作”。 [资料来源:THINK58.com]
3.4.1 初始化插件函数
首先是3个初始化函数:
void InitPlugIns();
void InitPreprocessors();
void InitOutputPlugins();
3个函数的作用分别是初始化插件、包预测和包输出插件的模块。三个函数都在plugbase.c中,并都转入RegisterXXX()函数调用。
比如:
void RegisterOutputPlugin(char *keyword, int type, void (*func) (u_char *))
{
OutputKeywordList *idx;
idx = OutputKeywords;
if(idx == NULL)
{
OutputKeywords = (OutputKeywordList *) calloc(sizeof(OutputKeywordList
),sizeof(char));
idx = OutputKeywords;
}
else
{
while(idx->next != NULL)
{
if(!strcasecmp(idx->entry.keyword, keyword))
{
FatalError("%s(%d) => Duplicate output keyword!\n", file_name,file_line);
}
idx = idx->next;
}
idx->next = (OutputKeywordList *) calloc(sizeof(OutputKeywordList), sizeof(char));
idx = idx->next;
}
idx->entry.keyword = (char *) calloc(strlen(keyword) + 1, sizeof(char)); [资料来源:http://www.THINK58.com]
strncpy(idx->entry.keyword, keyword, strlen(keyword)+1);
idx->entry.node_type = (char) type;
idx->entry.func = (void *) func;
}
该函数最终得到OutputKeywordList 链表指针,其他两个插件类似,得到 PreprocessList 链表指针和KeywordXlateList链表指针。这三个链表指针都是plugbase.c文件中的全局变量,且都是对应的OutputKeyNode/PreprocessNode/KeywordXlate结构的链表头,这些结构都在plugbase.h头文件中定义,它们都包括用来查找的插件名和要用到的处理从规则配置文件中传过来参数的插件初始化函数。具体要用到那些插件是在parser.c文件中ParseRule函数实现。 [来源:http://www.think58.com]
3.4.2 预处理模块
入侵检测系统在初始化完成之后,在进入检测引擎模块(处理前面两个模块传过来的网络封包)之前,需要对数据包进行预处理。这次IDS的插件结构允许开发者扩展入侵检测系统的功能。另外,循环抓包是在snort.c 主流程的InterfaceThread函数中实现,该函数调用libpcap 库中的pcap_loop循环抓包函数,这个函数有个回调函数ProcessPacket,这个回调函数先通过上一个包解码模块得到的相应的解码函数对抓到的数据包进行解码(实现语句是: (*grinder) (&p, pkthdr, pkt); ),下一步判断snort.c 文件中的runMode全局遍变量,若 SNORT工作在包记录模式,则调用输出插件CallLogPlugins函数;否则工作在IDS模式,继而进入预处理Preprocess函数。
该预处理函数遍历在初始化预处理插件后得到的PreprocessKeywordList链表,调用配置文件中要求的预处理插件函数对所抓的数据包进行预处理。函数实现如下:
idx = PreprocessList;
while(idx != NULL)
{
assert(idx->func != NULL);
idx->func(p);
idx = idx->next;
}
预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,snort可以以一种out of band的方式对数据包进行修改或者分析。以下是几个常用的预处理插件: think58好,好think58
[来源:http://www.think58.com]
(1)HTTP解码预处理模块用来处理HTTP URI字符串,把它们转换为清晰的ASCII字符串。这样就可以对抗evasice web URL扫描程序和能够避开字符串内容分析的恶意攻击者。
(2)frag2模块 :使snort能够消除IP碎片包,给黑客使用IP碎片包绕过系统的检测增加了难度。
(3)stream4插件为snort提供了TCP数据包重组的功能。在配置的端口上,stream4插件能够对TCP数据包的细小片段进行重组成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。
(4)Portscan预处理程序的用处: 向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。端口扫描可以是对任意IP地址的多个端口,也可以是对多个IP地址的同一端口进行。可以处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealth scan)数据包,比如NULL,FIN,SYNFIN,XMAS等。
(5)Portscan2模块将检测端口扫描。它要求包含Conversation预处理器以便判定一个会话是什么时间开始的。它的目的是能够检测快速扫描,例如,快速的nmap扫描。
(6)Conversation 预处理器使Snort 能够得到关于协议的基本的会话状态而不仅仅是由spp_stream4处理的TCP状态。当它接收到一个网络不允许的协议的数据包时,它也能生一个报警信息。要做到这一点,请在IP协议列表中设置你允许的IP协议,并且当它收到一个不允许的数据包时,它将报警并记录这个数据包。 think58好,好think58
[资料来源:http://www.THINK58.com]
(7)Http Flow模块可以忽略HTTP头后面的HTTP服务响应。
3.5 检测模块
这次设计的IDS的检测模块设计特点是其在初始规则链表的基础上,重新构造了一套快速匹配的数据结构,并采用了多模式匹配搜索引擎,可使用户根据具体情况选择不同的匹配模式。大体上按其功能可分三个步骤:
(1)构造初始的规则链表结构,将用户自定义的规则导入到规则链表结构中。这部分功能由ParseRule函数实现。
(2)读入规则链表各节点,并构造用快速匹配的新的数据结构,这是在初始化各个插件和建立三维链表之后,在调用处理模块函数InterfaceThread之前完成的。它是由fpcreate.c文件中的fpCreateFastPacketDetection函数完成的。
(3)对当前数据包执行具体的快速规则匹配任务,该功能主要在fpEvalPacket()上实现。
由于这个模块的数据结构比较复杂,所以对于上面的3个步骤,其中第1、2个需要进行说明。
think58.com
[资料来源:www.THINK58.com]
[版权所有:http://think58.com]think58 [资料来源:http://THINK58.com]