入侵检测系统的设计与实现
专业:计算机科学与技术班级:计算机091姓名:江朝林指导教师:王国豪
摘要攻击者往往能绕开防火墙和杀毒软件来对目标进行攻击。从其他方面提高计算机安全性越来越设立防火墙和杀毒软件是保护计算机安全的主要手段,但随着操作系统的安全隐患被越来越多的发现,迫切。基于该思想,设计了一个ids(基于特征的入侵检测系统),目的是通过这个ids监视并分析网络流量来发现攻击企图或者攻击行为,采取报警、回复假的不可达信息或断开连接等手段,来保护计算机安全。
入侵检测技术是对传统的安全技术(如防火墙)的合理补充。它通过监视主机系统或网络,能够对恶意或危害计算机资源的行为进行识别和响应。通过与其它的安全产品的联动,还可以实现对入侵的有效阻止。入侵检测系统的研究和实现已经成为当前网络安全的重要课题。本次设计完成了一个ids的设计和实现,详细论述了该ids的结构和功能,阐述了相关概念和设计原理,并给出了部分关键代码。最后总结了本次设计入侵检测系统的优点和缺陷,从性能方面对本次设计进行了评价。。
1.2本课题研究的意义
本课题是基于防火墙有自身的缺陷,不能为处于网络上的主机撑起完整的安全保护伞为出发点来研究的。发展ids技术是安全形式所趋,发展有自主知识产权的、安全、可靠的ids对全球的网络安全有着重大的意
义。“评价一个ids有这样几个方面:(1)准确性;(2)性能;(3)完整性;(4)故障容错(fault tolerance);(5)自身抵抗攻击能力;(6)及时性(timeliness)”。[6]由于设计参考的是snort,因此这次设计的ids的各项性能和snort相仿,属于轻量级的ids(轻量级是指适合小网段使用)。基于ids技术的不成熟以及snort在相关ids的产品中是比较成熟的一种,所以这次设计的ids的在现今阶段来说性能指标处于中上水平。
1.3本课题的研究方法
第二章相关开发环境及技术
2.1 c++语言
c++,这个词在中国大陆的程序员圈子中通常被读做“c加加”,而西方的程序员通常读做“c plus plus”,它是一种使用非常广泛的计算机编程语言。c++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程序程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
forrester最新的调查显示,c++、微软visualbasic和java是众多公司产品体系的首选语
言。对100家公司的调查显示,c/c++、visualbasic和java在产品体系中的使用比例分别是59%、61%和6
6%。
2.2 vc++开发环境
vc++适用范围
(2) vc++主要用在驱动程序开发
(3) vc++执行效率高,当对系统性能要求很高的时候,可用vc开发。
(4) vc++主要适用于游戏开发
(5) vc++多用于单片机,工业控制等软件开发,如直接对i/o地址操作,就要用c++。(7) vc++可以开发优秀的基于通信的程序。
(8) vc++可以开发高效灵活的文件操作程序。
(9) vc++可以开发灵活高效的数据库操作程序。
(10)vc++是编cad软件的唯一选择!!!包括autocad,ug的二次开发。
(11)vc++在多线程、网络通信、分布应用方面,vc++有不可比拟的优势。
第三章基于特征的ids的设计与实现
3.1 基于特征的ids的特征
这次设计的ids最大特点是模块化。其原理就是将功能分为几个模块,各个模块实现不同的功能。系统的处理流程如图3-1所示:
图3-1  snort的流程图
“入侵检测一般分为3个步骤:信息收集、数据分析、响应”对应于以上3个步骤,snort 由以下几个模块来实现上述功能:数据包嗅探器,预处理器,检测引擎和报警输出模块。构成如图3-2所示:
图3-2 snort的模块工作原理
由于本次ids的最大特点是模块化,所以ids的功能主要是按功能模块来区分的:
(1)包捕获模块:用于捕获通过主机的网络数据包,将捕获数据包传送至包解码模块;(2)包解码模块:支持以太网和slip及ppp媒体介质,其作用就是为探测引擎搜索数据;(3)包预测模块:用来判断数据包的协议类型,以便根据不同的协议采取不同的检测手段;(4)检测模块:检测数据包(此时的数据包是剥离了协议头的数据包),将检测结果交给输出模块处理;
(5)输出模块:根据检测结果采取不同的应对手段,包括记录(log)、报警(alert)、忽略(ignore)等等。
选择输出模式
(log file,console, socket)
图3-3 模块间的数据流关系图
从图3-3可以看到,网络数据包首先到达的是包捕获模块(packet capture module)。在捕获数据包以后会经过包解码模块(decoder)将数据包的一些协议头(如tcp、upd、ip等)去掉,再经由包预测(preprocessor)模块还原成最原始的数据包,由检测(detection engine)模块来进行检测,检测结果交给输出(output plug-ins)模块进行记录。
3.2包捕获模块
有必要说一下libpcap是ids的环境软件之一,其作用就是负责抓包。图3-4是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 进行脱机方式截获,即先将网络上的数据截获下来,以文件形式储存到磁盘上,等事后方便时再从磁盘上读取数据文件来做进一步分析。
(4)pcap_snapshot
函数用于获取数据链路层协议的类型。
(6)pcap_loop
前面的函数都可以看做捕获数据包的准备工作,pcap_loop 用来从网络中捕获数据包。需要注意的是函数的第三个参数,它是一个回调函数,捕获到的数据包,就交由它来处理。模块化设计的目的
3.3包解码模块
本模块由snort.c文件中的setpktprocessor函数实现。snort的包解码支持以太网和slip 及ppp媒体介质。包解码所做的所有工作就是为探测引擎准备数据。该函数根据datalink(由上面的libpcap库函数得到)的值来判断并关联解码函数。解码模块结构如图3-5所示:
图3-5 包解码模块的结构
从图3-5可以看到该模块的起始点是pcap loop processpacket(),这里是包捕获模块把捕获的包传到解码模块的地方。在收到数据包以后,会根据不同的协议来匹配,匹配合适以后就会按照下面的分枝来进行解码。比如包捕获模块收到一个ip数据包,首先检测该包是属于哪种类型的,检测到是属于ethpkt类型网,那么就确定是ip数据包。接下来再更加细致的区分该数据包是用的哪种协议的,由此又可以分为tcp、upd、icmp等等类型。
部分关键的代码如下:
int setpktprocessor()
{
{
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 预处理模块
“预处理模块的作用是对当前截获的数据包进行预先处理,以便后续处理模块对数据包的处理操作”。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。