本次实验用到的数据集为”KDD CUP 99 dataset ”,就是KDD竞赛在1999年举行时采用的数据集。
1998年美国国防部高级规划署(DARPA)在MIT林肯实验室进行了一项入侵检测评估项目。林肯实验室建立了模拟美国空军局域网的一个网络环境,收集了9周时间的 TCPdump网络连接和系统审计数据,仿真各种用户类型、各种不同的网络流量和攻击手段,使它就像一个真实的网络环境。这些TCPdump采集的原始数据被分为两个部分:7周时间的训练数据 大概包含5,000,000多个网络连接记录,剩下的2周时间的测试数据大概包含2,000,000个网络连接记录。
该数据集中一个网络连接定义为在某个时间内从开始到结束的TCP数据包序列,并且在这段时间内,数据在预定义的协议下(如TCP、UDP)从源IP地址到目的IP地址的传递。每个网络连接被标记为正常(normal)或异常(attack),异常类型被细分为4大类共39种攻击类型,其中22种攻击类型出现在训练集中,另有17种未知攻击类型出现在测试集中。
既然数据集中有这么多种类型,我们本次实验就尝试通过k-means来聚类分析攻击类型,希望以此帮助防御者能够更好地进行针对性的防御。
K-means属于聚类分析的一种。
聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。“物以类聚,人与群分”即为聚类的通俗理解。聚类将数据按相似性的原则进行分类,分类的后的类别称为簇,每个簇内有很大的相似性,而不同簇之间有很大的相异性。聚类分析是一个无监督学习过程,与分类不同,在学习的过程不依赖于预先定义的类或带类标记的训练实例,而是通过自身算法进行分类成簇。
聚类分析是在未知世界中进行探索性分析。在分类过程中,聚类分析只要根据给定的聚类个数就可以自动进行分类。因此聚类分析也受聚类个数的影响,不同的聚类个数将会影响聚类效果,个数的确定也成为了一个关键变量。
用来计算聚类之间距离的方法也非常多,通常按照数据和分析的不同目的要求来选择距离公式。常用的距离公式有欧氏距离(Euclidean distance) 、曼哈顿距离(Block)、切比雪夫距离(Chebychev distance)等。
K-means源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类分析方法流行于数据挖掘领域。k-平均聚类的目的是:把 n个点划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。k-平均聚类与k-近邻之间没有任何关系(后者是另一流行的机器学习技术)。
K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成.簇个数 K 是用户指定的, 每一个簇通过其质心(centroid), 即簇中所有点的中心来描述.
算法流程(假定聚类个数为c):
(1)根据聚类个数,选择各类的初始中心c;
(2)对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新各类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代
kdd数据集的介绍
KDD99数据集中每个连接(*)用41个特征来描述,以CSV格式写成,加上最后的标记(label),一共有42项,其中前41项特征分为4大类,下面按顺序解释各个特征的含义:
可以打开本次实验的数据集对照查看
- TCP连接基本特征(共9种)
基本连接特征包含了一些连接的基本属性,如连续时间,协议类型,传送的字节数等。
(1)duration. 连接持续时间,以秒为单位,连续类型。范围是 [0, 58329] 。它的定义是从TCP连接以3次握手建立算起,到FIN/ACK连接结束为止的时间;若为UDP协议类型,则将每个UDP数据包作为一条连接。数据集中出现大量的duration = 0 的情况,是因为该条连接的持续时间不足1秒。
(2)protocol_type. 协议类型,离散类型,共有3种:TCP, UDP, ICMP。
(3)service. 目标主机的网络服务类型,离散类型,共有70种。’aol’, ‘auth’, ‘bgp’, ‘courier’, ‘csnet_ns’, ‘ctf’, ‘daytime’, ‘discard’, ‘domain’, ‘domain_u’, ‘echo’, ‘eco_i’, ‘ecr_i’, ‘efs’, ‘exec’, ‘finger’, ‘ftp’, ‘ftp_data’, ‘gopher’, ‘harvest’, ‘hostnames’, ‘http’, ‘http_2784′, ‘http_443′, ‘http_8001′, ‘imap4′, ‘IRC’, ‘iso_tsap’, ‘klogin’, ‘kshell’, ‘ldap’, ‘link’, ‘login’, ‘mtp’, ‘name’, ‘netbios_dgm’, ‘netbios_ns’, ‘netbios_ssn’, ‘netstat’, ‘nnsp’, ‘nntp’, ‘ntp_u’, ‘other’, ‘pm_dump’, ‘pop_2′, ‘pop_3′, ‘printer’, ‘private’, ‘red_i’, ‘remote_job’, ‘rje’, ‘shell’, ‘smtp’, ‘sql_net’, ‘ssh’, ‘sunrpc’, ‘supdup’, ‘systat’, ‘telnet’, ‘tftp_u’, ‘tim_i’, ‘time’, ‘urh_i’, ‘urp_i’, ‘uucp’, ‘uucp_path’, ‘vmnet’, ‘whois’, ‘X11′, ‘Z39_50′。
(4)flag. 连接正常或错误的状态,离散类型,共11种。’OTH’, ‘REJ’, ‘RSTO’, ‘RSTOS0′, ‘RSTR’, ‘S0′, ‘S1′, ‘S2′, ‘S3′, ‘SF’, ‘SH’。它表示该连接是否按照协议要求开始或完成。例如SF表示连接正常建立并终止;S0表示只接到了SYN请求数据包,而没有后面的SYN/ACK。其中SF表示正常,其他10种都是error。
(5)src_bytes. 从源主机到目标主机的数据的字节数,连续类型,范围是 [0, 1379963888]。
(6)dst_bytes. 从目标主机到源主机的数据的字节数,连续类型,范围是 [0. 1309937401]。
(7)land. 若连接来自/送达同一个主机/端口则为1,否则为0,离散类型,0或1。
(8)wrong_fragment. 错误分段的数量,连续类型,范围是 [0, 3]。
(9)urgent. 加急包的个数,连续类型,范围是[0, 14]。 - TCP连接的内容特征(共13种)
对于U2R和R2L之类的攻击,由于它们不像DoS攻击那样在数据记录中具有频繁序列模式,而一般都是嵌入在数据包的数据负载里面,单一的数据包和正常连接没有什么区别。为了检测这类攻击,Wenke Lee等从数据内容里面抽取了部分可能反映入侵行为的内容特征,如登录失败的次数等。
(10)hot. 访问系统敏感文件和目录的次数,连续,范围是 [0, 101]。例如访问系统目录,建立或执行程序等。
(11)num_failed_logins. 登录尝试失败的次数。连续,[0, 5]。
(12)logged_in. 成功登录则为1,否则为0,离散,0或1。
(13)num_compromised. compromised条件(**)出现的次数,连续,[0, 7479]。
(14)root_shell. 若获得root shell 则为1,否则为0,离散,0或1。root_shell是指获得超级用户权限。
(15)su_attempted. 若出现”su root” 命令则为1,否则为0,离散,0或1。
(16)num_root. root用户访问次数,连续,[0, 7468]。
(17)num_file_creations. 文件创建操作的次数,连续,[0, 100]。
(18)num_shells. 使用shell命令的次数,连续,[0, 5]。
(19)num_access_files. 访问控制文件的次数,连续,[0, 9]。例如对 /etc/passwd 或 .rhosts 文件的访问。
(20)num_outbound_cmds. 一个FTP会话中出站连接的次数,连续,0。数据集中这一特征出现次数为0。
(21)is_hot_login.登录是否属于“hot”列表(***),是为1,否则为0,离散,0或1。例如超级用户或管理员登录。
(22)is_guest_login. 若是guest 登录则为1,否则为0,离散,0或1。
- 基于时间的网络流量统计特征 (共9种,23~31)
由于网络攻击事件在时间上有很强的关联性,因此统计出当前连接记录与之前一段时间内的连接记录之间存在的某些联系,可以更好的反映连接之间的关系。这类特征又分为两种集合:一个是 “same host”特征,只观察在过去两秒内与当前连接有相同目标主机的连接,例如相同的连接数,在这些相同连接与当前连接有相同的服务的连接等等;另一个是 “same service”特征,只观察过去两秒内与当前连接有相同服务的连接,例如这样的连接有多少个,其中有多少出现SYN错误或者REJ错误。
(23)count. 过去两秒内,与当前连接具有相同的目标主机的连接数,连续,[0, 511]。
(24)srv_count. 过去两秒内,与当前连接具有相同服务的连接数,连续,[0, 511]。
(25)serror_rate. 过去两秒内,在与当前连接具有相同目标主机的连接中,出现“SYN” 错误的连接的百分比,连续,[0.00, 1.00]。
(26)srv_serror_rate. 过去两秒内,在与当前连接具有相同服务的连接中,出现“SYN” 错误的连接的百分比,连续,[0.00, 1.00]。
(27)rerror_rate. 过去两秒内,在与当前连接具有相同目标主机的连接中,出现“REJ” 错误的连接的百分比,连续,[0.00, 1.00]。
(28)srv_rerror_rate. 过去两秒内,在与当前连接具有相同服务的连接中,出现“REJ” 错误的连接的百分比,连续,[0.00, 1.00]。
(29)same_srv_rate. 过去两秒内,在与当前连接具有相同目标主机的连接中,与当前连接具有相同服务的连接的百分比,连续,[0.00, 1.00]。
(30)diff_srv_rate. 过去两秒内,在与当前连接具有相同目标主机的连接中,与当前连接具有不同服务的连接的百分比,连续,[0.00, 1.00]。
(31)srv_diff_host_rate. 过去两秒内,在与当前连接具有相同服务的连接中,与当前连接具有不同目标主机的连接的百分比,连续,[0.00, 1.00]。
注:这一大类特征中,23、25、27、29、30这5个特征是 “same host” 特征,前提都是与当前连接具有相同目标主机的连接;24、26、28、31这4个特征是 “same service” 特征,前提都是与当前连接具有相同服务的连接。
4. 基于主机的网络流量统计特征 (共10种,32~41)
基于时间的流量统计只是在过去两秒的范围内统计与当前连接之间的关系,而在实际入侵中,有些 Probing攻击使用慢速攻击模式来扫描主机或端口,当它们扫描的频率大于2秒的时候,基于时间的统计方法就无法从数据中找到关联。所以Wenke Lee等按照目标主机进行分类,使用一个具有100个连接的时间窗,统计当前连接之前100个连接记录中与当前连接具有相同目标主机的统计信息。
(32)dst_host_count. 前100个连接中,与当前连接具有相同目标主机的连接数,连续,[0, 255]。
(33)dst_host_srv_count. 前100个连接中,与当前连接具有相同目标主机相同服务的连接数,连续,[0, 255]。
(34)dst_host_same_srv_rate. 前100个连接中,与当前连接具有相同目标主机相同服务的连接所占的百分比,连续,[0.00, 1.00]。
(35)dst_host_diff_srv_rate. 前100个连接中,与当前连接具有相同目标主机不同服务的连接所占的百分比,连续,[0.00, 1.00]。
(36)dst_host_same_src_port_rate. 前100个连接中,与当前连接具有相同目标主机相同源端口的连接所占的百分比,连续,[0.00, 1.00]。
(37)dst_host_srv_diff_host_rate. 前100个连接中,与当前连接具有相同目标主机相同服务的连接中,与当前连接具有不同源主机的连接所占的百分比,连续,[0.00, 1.00]。
(38)dst_host_serror_rate. 前100个连接中,与当前连接具有相同目标主机的连接中,出现SYN错误的连接所占的百分比,连续,[0.00, 1.00]。
(39)dst_host_srv_serror_rate. 前100个连接中,与当前连接具有相同目标主机相同服务的连接中,出现SYN错误的连接所占的百分比,连续,[0.00, 1.00]。
(40)dst_host_rerror_rate. 前100个连接中,与当前连接具有相同目标主机的连接中,出现REJ错误的连接所占的百分比,连续,[0.00, 1.00]。
(41)dst_host_srv_rerror_rate. 前100个连接中,与当前连接具有相同目标主机相同服务的连接中,出现REJ错误的连接所占的百分比,连续,[0.00, 1.00]。
对数据进行聚类,一个重要的问题就是需要确定聚类的个数。普通人不可能手动检查数据以找到适当数量的聚类,因此需要使用某种方法来估计聚类的数量,却要确保在这个数量下聚类的效果比较好。本次实验我们用到的方法是轮廓分析(silhouette analysis),使用图形工具来度量簇中样本的聚集程度。
通过三个步骤可以计算出当个样本的轮廓系数(silhouette coefficient):
1、将样本x与簇内的其他点之间的平均距离作为簇内的内聚度a
2、将样本x与最近簇中所有点之间的平均距离看作是与最近簇的分离度b
3、将簇的分离度与簇内聚度之差除以二者中比较大的数得到轮廓系数,计算公式如下
轮廓系数的取值在-1到1之间。当簇内聚度与分度离相等时,轮廓系数为0。当b>>a时,轮廓系数近似取到1,此时模型的性能最佳。
这里我们针对本次实验的数据集进行测试,我们的方法是先指定聚类数量,然后画出轮廓图,通过轮廓图,我们能够看出样本的簇数以及判断样本中是否包含异常值。为了评价聚类模型的性能,可以通过评价轮廓系数,也就是待会会出现在图中的红色虚线进行评价
前半部分代码后面在介绍聚类分析的时候会给大家分析,这部分并不是本实验的重点,所以大家可以参考注释进行学习,此处不再展开
这里控制聚类数量的代码在下图
我们通过修改n_cluster2的值再测试脚本即可,完整代码在1.py
我们先打印出聚类数量为2时的情况
前面已经说过,轮廓系数是一个衡量一个结点与它属聚类相较于其它聚类的相似程度。取值范围-1到1,值越大表明这个结点更匹配其属聚类而不与相邻的聚类匹配。
如果大多数结点都有很高的轮廓系数,那么聚类适当。若许多点都有低或者负的值,说明分类过多或者过少
从上图可以看到, “轮廓系数”远非1,轮廓的宽度相差很大。因此,将群集数设置为2似乎不合适
N_cluster=3时的情况
Cluster2,cluster3的“轮廓系数”接近1,而cluste1远远没达到。而且,轮廓的宽度仍然有很大差异。因此,将群集数设置为3似乎不合适。
N_cluster=4时的情况
它已经变得相当不错。但是,由于cluster2的轮廓宽度较大,因此似乎可以做更多的聚类
N_cluster=5时的情况
看到4个簇的“轮廓系数”接近1,轮廓的宽度几乎均匀。显示目前最好的形状。因此,将群集数设置为5似乎是合适的
那再来看看N_cluster=6的情况
“ 轮廓系数”的变化很小,另外我们看到cluster5和cluster6的轮廓宽度非常小,因此似乎过度地将它们划分为簇。所以,将群集数设置为6是不合适的
那么至此,我们就可以确定k-means聚类数为5是比较合适的
接下来分析正式聚类的代码
导入相关库以及scikit-learn的K-means,其包含各种用于执行K均值的类
为了可视化聚类结果,还导入了图形绘制库matplotlib
设置聚类数为5
加载数据集
上图最后一行的iloc通过行号索引行数据
他们在kdd数据集中分别代表的是,也是用于判断攻击类型比较重要的指标,所以把他们作为聚类的特征
dst_host_serror_rate | SYN错误率。
dst_host_same_src_port_rate |同一端口的连接速率。
rong_fragment |不正确的片段数。
duration |与主机的连接时间(秒)。
login_in |成功登录。
root_shell |获取根shell。
dst_host_rerror_rate | REJ错误率。
num_failed_logins |登录尝试失败的次数。
然后对每个特征的数据值进行归一化以提高分析准确性
对数据进行矩阵转置,由于我们后面使用的额fit_predict会使用矩阵作为参数,所以将读取的数据转换为numpy矩阵
使用scikit-learn的K-means类创建一个k-means模型,然后将转置后的矩阵传给fit_predict进行聚类
接下来可视化聚类结果,使用matplotlib画出堆积条形图
执行脚本
结果如下
从上图中可以看到已经聚成5类,并且每个类中包含的数据的组成部分都以彩色显示
接着我们通过逐个查看每个类的组成来看看每个类代表什么
cluster0:在这一类可以看到“ wrong_fragment”(错误片段的数量)大于其他类。鉴于有许多“wrong_fragement”,我们有理由推测它是“teardrop”攻击的类
Cluster1: 可以看到,“ dst_host_serror_rate”(SYN错误率)和“ dst_host_same_src_port_rate”(到同一端口的连接率)的组成比率大于其他类。基于“高SYN错误率”和“到同一端口的更多连接”等功能,我们可以推测是这是“Nmap扫描”或”SYN Flood “攻击的类
Cluster2:相对于其他聚类来说,可以看到每种颜色的组成比率都是差不多的,这应该是正常的网络通信
cluster3:可以看到,dst_host_rerror_rate(出现REJ错误的连接所占的百分比)和num_failed_logins(失败的登录尝试次数)的组成比率大于其他类。基于高REJ错误率和大量失败登录尝试等功能,我们猜测这是一个“爆破密码”攻击的类
Cluster4:可以看到,“ root_shell”(紫色,表示取得root shell)和“ duration”(蓝色,表示与主机的连接时间)的组成比率都比其他类的大。基于“与主机的连接时间长”和“在许多情况下具有root特权”的功能,我们推测这是一个“缓冲区溢出”攻击的类
这样,通过K-means方法分析“`kddcup.data_small.csv”的结果是,可能存在4种攻击类型(缓冲区溢出,Nmap 扫描/ SYN Flood,密码暴力破解,Teardrop)。
那么通过分析得出的结果,防守者就可以识别出攻击手段被采取专门的防护措施进行防御。
参考
1.https://www.bbsmax.com/A/q4zVZl1jzK/
2.https://blog.csdn.net/u012679583/article/details/80316619
3.https://blog.csdn.net/abrohambaby/article/details/78702512
4.https://github.com/13o-bbr-bbq/machine_learning_security
5.https://juejin.im/post/6844904135741931533