基于KDDCUP99数据集的入侵检测系统的设计与实现
2017-12-25郭成华
◆郭成华
(杭州电子科技大学网络空间安全学院 浙江 310018)
基于KDDCUP99数据集的入侵检测系统的设计与实现
◆郭成华
(杭州电子科技大学网络空间安全学院 浙江 310018)
KDDCUP99数据集中网络连接特征属性种类多,提取难度大,给研究人员将数据集应用到真实网络环境中造成很大困难。同时因为数据集产生年代久远,其中的攻击手段和特征属性对于当下复杂的网络环境已经过时,因此迫切需要提取新的网络连接特征,应用新型攻击手段,制作出更符合真实网络环境的数据集。通过对数据集制作方法的深入研究,给出了提取网络连接特征的具体方法,进而设计出一套基于此数据集的入侵检测系统。同时也为今后的研究中,制作新的入侵检测数据集提供了参考。
KDDCUP99数据集;特征提取;入侵检测 IDS
0 引言
近年来,随着网络安全研究人员对入侵检测技术的不断探索,一批能够在时间空间复杂度与漏检误检率之间达到平衡的新型入侵检测方法被提出。得益于人工智能的快速发展,基于新型机器学习算法的入侵检测也逐渐成为人们研究的热点。KDDCUP99数据集自从诞生以来,就被当做评估各种入侵检测算法在性能和漏检误检率方面优劣的标准。
然而,目前对于 KDDCUP99数据集的应用与研究,还仅限于对分类器效能的评估与离线入侵检测,并没有给出基于此数据集在实际网络环境中应用的具体方法。KDDCUP99数据集针对每一条网络连接都有41个特征属性,而这些属性中的一部分提取难度较大。官方描述文档中并没有提供相关的特征提取方法,给本数据集在实际网络环境中的应用造成了一定的困难。
本文的创新点在于给出了一整套基于 KDDCUP99数据集的入侵检测系统的设计与实现方案,解决了在实际网络环境中特征提取困难的问题,为以后在真实网络环境中运用 KDDCUP99数据集实现在线入侵检测奠定基础。
1 KDDCUP99数据集简介
KDDCUP99数据集的原始数据是从美国国防部高级规划署(DARPA)进行的一项入侵检测评估项目中产生的,后经 Wenke Lee等人对原始数据进行特征提取,最终形成了这套数据集。训练与测试数据集中每条记录拥有41个特征属性和一个攻击类型标签。特征属性可以分为四大类:网络连接基本特征(1-9号)、网络连接内容特征(10-22号)、基于时间的网络流量统计特征(23-31)、基于主机的网络流量统计特征(32-41)。攻击类型共计39种,可以分为四类:拒绝服务攻击、来自远程主机的未授权访问、未授权的本地超级用户特权访问、端口监视或扫描。除攻击类型外,还有一部分网络连接是被标识为’normal’的正常类型。
2 循环捕捉网络数据包
入侵检测系统首先需要单独开启一个进程用来捕捉网络数据包,为以后的分析检测不断提供源数据。捕捉数据包的方法与原数据集采集的方法保持一致,使用tcpdump。为了实现对网络入侵的实时检测,必须使用循环的方式捕捉网络数据包,也就是提前设定单个文件最大容纳数据包的数量,到达此数量后输出该文件并开始新一轮的数据包捕获。只有通过这种方式才能为分析程序不断提供最新截获的数据包,达到实时检测的目的。例如运用tcpdump监听编号为1的接口并且达到50个数据包就输出到data.pcap,在linux平台上可以使用命令:
特征属性中有两大类与统计特征相关,而这类特征需要对时间连续且数量较多的数据包进行分析才能得出有效结论。因此在单个文件所含数据包数量较小的情况下,要想得到基于统计特征的有效结论,需要将多个小的数据包文件拼接成为一个较大的数据包文件。拼接数据包文件可以使用 wireshark下的命令行工具mergecap,例如将data1.pcap与date2.pcap拼接为all.pcap,可以使用命令:
通过对拼接后数据包文件的特征提取与分析,更容易检测出统计特征明显的攻击。
3 特征提取与实时检测
每当一次循环抓包结束后,都需要对刚刚捕获的文件进行特征提取与分析,这是实现入侵检测系统的第二个重要步骤,需要单独开启一个进程执行。由于数据集的描述文档中没有对从原始数据中提取特征的方法进行说明,导致了提取特征困难。通过文献[1-3]中与特征属性相关的描述,本文提出了针对每一种特征的详细提取方法。基于提取到的特征和事先训练好的入侵检测判断模型,最终实现实时检测。
3.1 网络连接的基本特征与内容特征的提取
一种较为简单的方法是使用 Bro网络安全监控系统[4]对原始数据分析并提取出原数据集中前22项特征属性。Bro是一个提供BSD授权的开源软件项目,它包含一种事件驱动型的脚本语言,可以应用这种语言重写与特征属性相关的事件处理函数。每当事件被触发时,重写后的事件处理函数都会对网络连接的特征属性做出相应调整,从而实现对原始数据的特征提取。
(1)提取特征之前的准备工作
在提取特征之前,首先要建立一个存储特征属性的数据结构。Bro脚本语言中的record类型类似于c语言中的结构体,可以用它存储单条网络连接的前22项特征属性。然后需要再建立一个用来存储所有网络连接的容器table,便于最终的输出。table类似于数组,这里把它设为拥有六个维度的用来存放record的容器。六个维度分别是:连接开始时间、连接持续时间、连接发起方地址与端口、连接应答方地址与端口,通过这六个维度能够唯一确认一条网络连接,保证不会与其他连接重复。
为了以后更方便的提取基于时间与主机的流量统计特征,record中除了前 22项特征外还需再添加连接序号、连接开始时间、连接发起方地址与端口、连接应答方地址与端口这几项属性,位置应该在22条特征属性之前。其中连接序号是一个全局变量,每新增一条网络连接,都会触发bro中的”new_connection”事件。重写该事件的处理函数,使其每次触发时连接序号加1。最终输出效果如下:
1 1502357627.511197 49154 921 192.168.1.103 192.168.1.107 0.000000 udp 921 OTH 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(2)duration、src_bytes、dst_bytes、protocol_type、land 特征的提取
这五种属性的共同点是可以直接的从任何一种包含c:connection参数的事件中获得。例如,在 bro脚本语言的new_connection事件中,可以用 c$duration,c$orig$size,c$resp$size分别获得前三种属性的值。使用 bro的内建函数get_port_transport_proto并将c$id$resp_p,也就是目标主机端口号作为参数传入就可以得到协议类型的值。land属性是判断连接发起方与应答方的地址与端口是否完全相同的,使用c$id$orig_h、c$id$resp_h、c$id$orig_p、c$id$resp_p获得四项特征并判断双方地址与端口是否相同即可。
(3)service特征提取
首先需要查阅数据集中所包含的70种服务类型所对应的端口号,然后建立一个将端口号作为输入,服务类型名称作为输出的函数。最后在提取特征时,可以在包含 c:connection参数的事件中使用 c$id$resp_p得到目标主机的端口号,传入函数中得到服务类型。
(4)flag特征的提取
此特征代表了一条网络连接中,正常或错误的类型。共有13种类型,分别为S0、S1、S2、S3、REJ、RSTRH、RSTR、RSTOS0、RSTO、SF、SH、SHR、OTH。目前为止的资料中还缺乏对这些错误类型具体含义的详细描述,本文中将通过框图的形式具体给出判断所有错误类型的方法。
如图1,在任何一个包含c:connection参数的事件中,分别使用c$orig$state、c$resp$state、c$orig$size、c$resp$size再加上当前连接的协议类型,即可获得判断错误类型所需的信息。其中形如TCP_SYN_SENT为bro脚本语言内置的常量,用来表示连接发起方或应答方的状态。Bro中TCP状态共有7种,UDP状态共2种,通过对连接发起方与应答方的状态进行如图所示的分析,就能得到一条网络连接正确或错误的类型。
图1 网络连接flag特征提取方法
(5)8-22号特征提取
8-22号特征的提取需要重写与特征本身相关的事件处理函数,每当这些事件被触发时,就能通过对事件中相关参数的分析,对特征值做出调整。表1中给出与这些特征相关的事件及对事件参数的处理方法,其中一些方法在实际应用中还需要灵活运用正则表达式进行匹配。
表1 8-22特征的提取方法
?
?
3.2 提取基于时间与基于主机的网络流量统计特征前的准备工作
提取这两类特征需要对一段较长时间内所有的网络连接进行整体分析,因此需要对3.1中提取出的特征进行输出和整理。
bro_done事件会在bro分析结束后触发,重写这个事件的处理函数,使其在结束时将所有 table中保存的结果输出到指定文件中,再使用sort -n命令将此文件中各条网络连接按连接序号排序后输出到最终的文件中,就可以开始对 23-41号特征进行提取。
3.3 基于时间和主机的网络流量统计特征的提取
根据文献[2-3]中对这两类特征的描述,本文提出了以下的方法实现特征提取:
以3.2最后输出文件中m条连接的一部分属性作为输入,通过算法1、2,即可提取到这两类特征属性的所有值。
算法 1:提取基于时间的网络流量统计特征算法
输入: 网络连接开始时间集D={d1,d2,...,dm}
网络连接应答方地址集E={e1,e2,...,em}
网络连接应答方端口集F={f1,f2,...,fm}
网络连接正确或错误状态集G={g1,g2,...,gm}
输出:基于时间的网络流量统计特征集
K={(k23_1,k24_1,...,k31_1),(k23_2,k24_2,...,k31_2),...,(k23_m,k24_m,...,k31_m)}
步骤:
1: K’={(k’23_1,k’24_1,...,k’31_1),(k’23_2,k’24_2,...,k’31_2),...,(k’23_m,k’24_m,...,k’31_m);
//最终输出特征是百分比的形式,K’集合用于事先统计数量
2: 将K,K’集合中每一个元组的所有变量值初始化为0;
3: for i=1,2,...,m do
4: for j=1,2,...i-1 do
5: if (di-2≤dj≤di) //当前连接开始时间的前 2s内
6: if (ei==ej) //与当前连接具有相同目标主机
7: k’23_i=k’23_i+1;
8: if (gj==S0 or gj==S1 or gj==S2 or gj==S3)k’25_i=k’25_i+1;
9: if (gj==REJ) k’27_i=k’27_i+1;
10: if (fi==fj) then k’29_i=k’29_i+1;
11: else k’30_i=k’30_i+1;
12: if (fi==fj) //与当前连接具有相同服务
13: k’24_i=k’24_i+1;
14: if (gj==S0 or gj==S1 or gj==S2 or gj==S3)k’26_i=k’26_i+1;
15: if (gj==REJ) k’28_i=k’28_i+1;
16: if (ej≠ei) k’31_i=k’31_i+1;
17: end for
18: if (k’23_i≠0)
19:
k23_i=k’23_i;k25_i=k’25_i/k23_i;k27_i=k’27_i/k23_i;k29_i=k’29_i/k23_i;k30_i=k’30_i/k23_i;
20: if (k’24_i≠0)
21:
k24_i=k’24_i;k26_i=k’26_i/k24_i;k28_i=k’28_i/k24_i;k31_i=k’31_i/k24_i;
22:end for
算法 2:提取基于主机的网络流量统计特征算法
输入: 网络连接发起方地址集C={c1,c2,...,cm}
网络连接发起方端口D={d1,d2,...,dm}
网络连接应答方地址集E={e1,e2,...,em}
网络连接应答方端口集F={f1,f2,...,fm}
网络连接正确或错误状态集G={g1,g2,...,gm}
输出: 基于主机的网络流量统计特征集
K={(k32_1,k33_1,...,k41_1),(k32_2,k33_2,...,k41_2),...,(k32_m,k33_m,...,k41_m)}
步骤:
1: K’={(k’32_1,k’33_1,...,k’41_1),(k’32_2,k’33_2,...,k’41_2),...,(k’32_m,k’33_m,...,k’41_m)};
//最终输出特征是百分比的形式,K’集合用于事先统计数量
2: 将K,K’集合中每一个元组的所有变量值初始化为0;
3: for i=1,2,...,m do
4: if (i<=100) then j=1;
5: else j=i-100;
6: for h=j,j+1,...,i-1 do
7: if (eh==ei)
8: k’32_i=k’32_i+1;
9: if (dh==di) k’36_i=k’36_i+1;
10: if (gh==S0 or gh==S1 or gh==S2 or gh==S3)k’38_i=k’38_i+1;
11: if (gh==REJ) k’40_i=k’40_i+1;
12: if (fh==fi) then
13: k’33_i=k’33_i+1;
14: if (ch≠ci) k’37_i=k’37_i+1;
15: if (gh==S0 or gh==S1 or gh==S2 or gh==S3) k’39_i=k’39_i+1;
16: if (gh==REJ) k’41_i=k’41_i+1;
17: else k’35_i=k’35_i+1;
18: end for
19: k32_i=k’32_i;k33_i=k’33_i;
20: if (k32_i≠0)
21:
k34_i=k33_i/k32_i;k35_i=k’35_i/k32_i;k36_i=k’36_i/k32_i;k38_i=k’38_i/k32_i;k40_i=k’40_i/k32_i;
22: if (k33_i≠0)
23:
k37_i=k’37_i/k33_i;k39_i=k’39_i/k33_i;k41_i=k’41_i/k33_i;
24:end for
3.4 实时检测
提取特征完毕后,需要先对提取后的数据进行数字化和归一化处理[6],其中处理的方法必须与训练模型时预处理数据的方法保持一致。最后将处理后的数据输入事先训练好的模型中,从输出中得到入侵类型判断结果,实现在线实时入侵检测。
4 仿真实验及结果
实验用虚拟机操作系统为 Ubuntu16.04(内核版本4.4.0-93-generic),使用 bro2.5.1进行 1-22号提取,python3.5.2进行23-41号特征提取和入侵检测系统的整体构建,攻击测试平台为Kali和blackarch。实验中对数据集预处理后采用KNN算法[5][7-8],对一部分常见攻击手段进行测试,具体结果见表 2,证实了本文中所描述的特征提取方法能够获得与原数据集中记录匹配的网络连接特征,从而可以在实验中将入侵检测算法应用到实际网络中。
表2 虚拟机实验结果
5 结束语
通过对基于 KDDCUP99数据集构建入侵检测系统的研究,实验结果表明文中所述的方法可以将数据集和入侵检测算法应用到实际网络环境中。
KDDCUP99数据集从诞生到现在已经有18年了,虽然一直作为入侵检测领域的一个公认测试标准,但是其中的攻击手段对于当下的网络环境显然已经有些过时。本文中介绍的网络连接特征提取的方法,可以帮助研究人员将新的入侵检测算法运用到实际网络环境中。更进一步,可以参考文中的思路搭建攻击测试环境,制作新的入侵检测数据集,为研究和防御新型网络攻击做准备。
[1]Lee W,Stolfo S J.A framework for constructing features and models for intrusion detection systems[J].ACM transactions on Information and system security (TiSSEC),2000.
[2]Tavallaee M,Bagheri E,Lu W,et al.A detailed analysis of the KDD CUP 99 data set[C]//IEEE Computational Intelligence Society.2009 IEEE Symposium on Computational Intelligence for Security and Defense Applications.July 8-10,2009.Crowne Plaza Ottawa Ottawa,ON,Canada.New York.IEEE,2009.
[3]Lee W,Stolfo S J,Mok K W. Mining in a data-flow environment:Experience in network intrusion detection[C]//ACM.The fifth ACM SIGKDD international conference on Knowledge discovery and data mining. August 15-18,1999.New York,NY,USA.ACM,1999.
[4]Mehra P.A brief study and comparison of snort and bro open source network intrusion detection systems[J]. International Journal of Advanced Research in Computer and Communication Engineering,2012.
[5]解男男.机器学习方法在入侵检测中的应用研究[D].吉林:吉林大学计算机科学与技术学院,2015.
[6]吴建胜,张文鹏,马垣. KDDCUP99 数据集的数据分析研究[J].计算机应用与软件,2014.
[7]郭春.基于数据挖掘的网络入侵检测关键技术研究[D].北京: 北京邮电大学计算机学院,2014.
[8]刘棣华,余斌,王小芬.基于 RBF 神经网络的入侵检测模型的研究[J].网络安全技术与应用,2008.
杭州电子科技大学网络空间安全学院“红客”大学生科研创新训练计划项目[WAHK0011]。