对于入侵检测的研究,需要大量有效的实验数据。数据可以通过抓包工具来采集,如Unix下的Tcpdump,Windows下的libdump,或者专用的软件snort捕捉数据包,生成连接记录作为数据源。本文使用的是基于数据挖掘的入侵检测技术研究中使用的KDDCup99的网络入侵检测数据集。

1 KDDCup99网络入侵检测数据集介绍

该数据集是从一个模拟的美国空军局域网上采集来的9个星期的网络连接数据,分成具有标识的训练数据和未加标识的测试数据。测试数据和训练数据有着不同的概率分布,测试数据包含了一些未出现在训练数据中的攻击类型,这使得入侵检测更具有现实性。

在训练数据集中包含了1种正常的标识类型normal和22种训练攻击类型,如表1-1所示。另外有14种攻击仅出现在测试数据集中。

表1-1 KDDCup99入侵检测实验数据的标识类型

标识类型

含义

具体分类标识

Normal

正常记录

Normal

DOS

拒绝服务攻击

back、land、neptune、pod、smurf、teardrop

Probing

监视和其他探测活动

ipsweep、nmap、portsweep、satan

R2L

来自远程机器的非法访问

ftp_write、guess_passwd、imap、multihop、phf、spy、warezclient、warezmaster

U2R

普通用户对本地超级用户特权的非法访问

buffer_overflow、loadmodule、perl、rootkit

数据特征:KDDCup99训练数据集中每个连接记录包含了41个固定的特征属性和1个类标识,如图1-1所示,标识用来表示该条连接记录是正常的,或是某个具体的攻击类型。在41个固定的特征属性中,9个特征属性为离散(symbolic)型,其他均为连续(continuous)型。

2 数据预处理

聚类算法中要使用计算距离的方法对数据进行聚类,而连接记录的固定特征属性中有两种类型的数值:离散型和连续型。对于连续型特征属性,各属性的度量方法不一样。一般而言,所用的度量单位越小,变量可能的值域就越大,这样对聚类结果的影响也越大,即在计算数据间距离时对聚类的影响越大,甚至会出现“大数”吃“小数”的现象。因此为了避免对度量单位选择的依赖,消除由于属性度量的差异对聚类产生的影响,需要对属性值进行标准化。对于离散型特征属性本文中并不作标准化处理,而是放在聚类算法中计算距离时处理。所以数据标准化是针对连续型特征属性的。设训练数据集有n条网络连接记录,每个记录中有22个连续型属性向量记作Xij(1≤i≤n,11≤j≤41)。对Xij数据预处理分为两步:数值标准化和数值归一化。

表1-4以2秒时间窗口计算的流量特征

特征名

描述

类型

count

过去的2秒内与当前连接有着相同的目的地址的连接

连续

serror_rate

出现SYN错误的连接次数

连续

rerror_rate

出现REJ错误的连接次数

连续

same_srv_rate

建立相同服务的连接次数

连续

diff_srv_rate

建立不同服务的连接次数

连续

srv_count

过去2秒时间内出现和当前连接服务相同的连接次数

连续

srv_serror_rate

出现SYN错误的连接次数

连续

srv_rerror_rate

出现REJ错误的连接次数

连续

srv_diff_host_rate

连接不相同主机的次数

连续

2.1 数值标准化

设 $X'_{ij}$ 为 $X_{ij}$ 数值标准化后的值。

$X'_{ij} = \frac{ X_{ij}-AVG_j }{ STAD_j }$

$AVG_j = \frac{ 1 }{ n }(X_{1j}+X_{2j}+...+X_{nj})$

$STAD_j = \frac{ 1 }{ n }(\lvert X_{1j}-AVG_j \lvert +\lvert X_{2j}-AVG_j \lvert +...+ \lvert X_{nj}-AVG_j \lvert )$

2.2 数值归一化

设 $X''\ _{ij}$为 $X_{ij}$归一化后的值。

$ X''_{ij} = \frac{ X'_{ij}-X\ _{min} } { X_{max} - X_{min} } $

$X_{min} = min{ X'_{ij} }$

$X_{max} = max{ X'_{ij} }$

其中下标变量1<=i<=n, 11<=j<=41

数值归一化处理过程及归一化后数据实例如图2-1

0.0

2.6104176374e-07

0.00105713002195

0.0

0.0

0.0

0.0

0.0

0.0

0.0

0.0

0.0

0.0156555772994

0.0

0.0

0.0

0.0

1.0

0.0

0.0352941176471

0.0352941176471

1.0

0.0

0.11

0.0

0.0

0.0

0.0

1

3. 样本分析

KDD99数据集总共由500万条记录构成,它还提供一个10%的训练子集和测试子集。样本类别分布表如下:

标签

类别

训练集(10%)

测试集(Corrected)

1

NORMAL

97278

60593

2

PROBE

4107

4166

3

ipsweep

1247

306

4

mscan

/

1053

5

nmap

231

84

6

portsweep

1040

354

7

saint

/

736

8

satan

1589

1633

9

DOS

391458

229853

10

apache2

/

794

11

back

2203

1098

12

land

21

9

13

mailbomb

/

5000

14

neptune

107201

58001

15

pod

264

87

16

processtable

/

759

17

smurf

280790

164091

18

teardrop

979

12

19

udpstorm

/

2

20

U2R

52

228

21

buffer_overflow

30

22

22

httptunnel

/

158

23

loadmodule

9

2

24

perl

3

2

25

ps

/

16

26

rootkit

10

13

27

sqlattack

/

2

28

xterm

/

13

29

R2L

1126

16189

30

ftp_write

8

3

31

guess_passwd

53

4367

32

imap

12

1

33

multihop

7

18

34

named

/

17

35

phf

4

2

36

sendmail

/

17

37

snmpgetattack

/

7741

38

snmpguess

/

2406

39

spy

2

/

40

warezclient

1020

/

41

warezmaster

20

1602

42

worm

/

2

43

xlock

/

9

44

xsnoop

/

4

训练集和测试集分别为KDD99数据集中的10%训练样本和corrected 的测试样本;

“/”表示该种攻击类型只在测试集(或训练集)中出现,而未在训练集(或测试集)中出现;

如上表,同DARPA98一样,KDD99将攻击类型分为4类,然后又细分为39小类,每一类代表一种攻击类型,类型名被标记在训练数据集每一行记录的最后一项。

从表中可以看出,训练集中共出现了22个攻击类型,而剩下的17种只在测试集中出现,这样设计的目的是检验分类器模型的泛化能力,对未知攻击类型的检测能力是评价入侵检测。

4 KNN算法

4.1 算法介绍

kNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断出你的类别。计算步骤如下:

算距离:给定测试对象,计算它与训练集中的每个对象的距离

找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻

做分类:根据这k个近邻归属的主要类别,来对测试对象分类

4.2 距离或相似度的衡量

什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。距离衡量包括欧式距离、夹角余弦等。本实验使用欧式(Euclidean)距离。

4.3 类别的判定

投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。

加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)

4.4 K值的设定

k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)

k值通常是采用交叉检验来确定(以k=1为基准)

经验规则:k一般低于训练样本数的平方根

4.5 判定方式的选择

投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。

4.6 衡量距离的选择

高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。

变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变进行标准化。

4.7 数据处理

5 ROC曲线

附录:源代码

# coding=utf-8

from __future__ import division

import numpy as np

import matplotlib.pyplot as plt

def classify(input_vct, data_set):

data_set_size = data_set.shape[0]

diff_mat = np.tile(input_vct, (data_set_size, 1)) - data_set # 扩充input_vct到与data_set同型并相减

sq_diff_mat = diff_mat**2 # 矩阵中每个元素都平方

distance = sq_diff_mat.sum(axis=1)**0.5 # 每行相加求和并开平方根

return distance.min(axis=0) # 返回最小距离

def file2mat(test_filename, para_num):

"""

将表格存入矩阵,test_filename为表格路径,para_num为存入矩阵的列数

返回目标矩阵,和矩阵每一行数据的类别

"""

fr = open(test_filename)

lines = fr.readlines()

line_nums = len(lines)

result_mat = np.zeros((line_nums, para_num)) # 创建line_nums行,para_num列的矩阵

class_label = []

for i in range(line_nums):

line = lines[i].strip()

item_mat = line.split(',')

result_mat[i, :] = item_mat[0: para_num]

class_label.append(item_mat[-1]) # 表格中最后一列正常1异常2的分类存入class_label

fr.close()

return result_mat, class_label

def roc(data_set):

normal = 0

data_set_size = data_set.shape[1]

roc_rate = np.zeros((2, data_set_size))

for i in range(data_set_size):

if data_set[2][i] == 1:

normal += 1

abnormal = data_set_size - normal

max_dis = data_set[1].max()

for j in range(1000):

threshold = max_dis / 1000 * j

normal1 = 0

abnormal1 = 0

for k in range(data_set_size):

if data_set[1][k] > threshold and data_set[2][k] == 1:

normal1 += 1

if data_set[1][k] > threshold and data_set[2][k] == 2:

abnormal1 += 1

roc_rate[0][j] = normal1 / normal # 阈值以上正常点/全体正常的点

roc_rate[1][j] = abnormal1 / abnormal # 阈值以上异常点/全体异常点

return roc_rate

def test(training_filename, test_filename):

training_mat, training_label = file2mat(training_filename, 32)

test_mat, test_label = file2mat(test_filename, 32)

test_size = test_mat.shape[0]

result = np.zeros((test_size, 3))

for i in range(test_size):

result[i] = i + 1, classify(test_mat[i], training_mat), test_label[i] # 序号, 最小欧氏距离, 测试集数据类别

result = np.transpose(result) # 矩阵转置

plt.figure(1)

plt.scatter(result[0], result[1], c=result[2], edgecolors='None', s=1, alpha=1)

# 图1 散点图:横轴为序号,纵轴为最小欧氏距离,点中心颜色根据测试集数据类别而定, 点外围无颜色,点大小为最小1,灰度为最大1

roc_rate = roc(result)

plt.figure(2)

plt.scatter(roc_rate[0], roc_rate[1], edgecolors='None', s=1, alpha=1)

# 图2 ROC曲线, 横轴误报率,即阈值以上正常点/全体正常的点;纵轴检测率,即阈值以上异常点/全体异常点

plt.show()

if __name__ == "__main__":

test('training.csv', 'test.csv')

java分类Kdd99数据集_KDD-CUP99 网络入侵检测数据集的处理与研究相关推荐

  1. 数据驱动的网络入侵检测:最新动向与研究趋势

    数据驱动的网络入侵:最新趋势 最近动态 未来趋势 结论 最近动态 图9展示了2010 - 2020年数据驱动NID方法的研究兴趣趋势. 通过研究过去十年关于NID的文献,可以发现自2010年以来,人们 ...

  2. 基于网络的入侵检测数据集研究综述(A Survey of Network-based Intrusion Detection Data Sets)

    A Survey of Network-based Intrusion Detection Data Sets 基于网络的入侵检测数据集研究综述 摘要:标记数据对于基于异常的网络入侵检测系统的训练和评 ...

  3. 关于KDD99入侵检测数据集的FAQ

    关于KDD99入侵检测数据集的FAQ 本文总结了关于KDD99数据集的一些常见问题,来自之前文章的评论和邮件,其中有些观点提供了看待该问题的不同视角. Q1: KDD数据集是怎么采集的?是直接截获的网 ...

  4. 【网络流量入侵检测数据集】CIC-IDS-2017数据集预处理

    网络流量入侵检测数据集CIC-IDS-2017数据预处理 CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs). 它的数据采集截至2017年7月7日(星期五)下午5 ...

  5. 综述类_网络入侵检测技术综述

    文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...

  6. 网络入侵检测 Network Intrusion Detection System (NIDS)

    网络入侵检测 Network Intrusion Detection System--NIDS 网络入侵检测 Network Intrusion Detection System (NIDS) 1.学 ...

  7. 一种深度学习应用于网络入侵检测的思路

    一种深度学习应用于网络入侵检测的思路 这个思路是分析网络流量,判断网络流量是否属于tor网络流量. 首先需要说明的是,这个思路已经有人在做了,从结论来看,效果很不错: https://blog.csd ...

  8. 文献笔记02 网络入侵检测技术综述(信息安全学报)

    文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...

  9. 网络入侵检测--Snort软件NIDS模式报警信息详解

    Snort最有价值的地方,就是它作为NIDS网络入侵检测软件来分析监控实时流量,那么最终能够产生的报警结果,也就是我们最关注的东西,即我们使用snort需要的就是拿到报警信息,并且联动到我们其他软件模 ...

最新文章

  1. C++ 快速入门笔记:基本语法
  2. 我们都准备好进入数字货币+无现金世界了?
  3. 小白路程之----初学React语法栈之redux与react-redux
  4. Centos7 开启端口
  5. 5款神器级别Github 的Chrome插件
  6. Java 故障处理与性能监控工具
  7. php对mysql的操作教程,php与Mysql的一些简单的操作
  8. Linux运维常见问题解决集锦【转】
  9. mysql connector api_mysql8 参考手册-Connector/J使用X DevAPI进行连接压缩
  10. 删除桌面图标的小箭头
  11. c#zip压缩解压缩全解
  12. python xml.etree.ElementTree
  13. Android TV框架TIF
  14. 怎么查看自己java程序的源码
  15. New Windows Vista Includes ActiveSync
  16. goahead 的认证和自定义登陆页面的cookie使用
  17. python 操作word页眉表格_Python-docx读写Word文档(插入图片、表格,设置表格样式,章节,页眉页脚)...
  18. 携程PMO出品 | 浅谈OKR- 什么是OKR?
  19. 疫情肆虐,延迟返工,今年的“金三银四”还能照常进行吗?
  20. 第四章 线程切换与调度——操作系统的发动机

热门文章

  1. JAVA与计算机语言基础概述
  2. tft注册最后验证图片_英雄联盟手游自走棋下载安装教程:三分钟教学注册下载云顶之弈正版手游...
  3. 计算机主机异常经常蓝屏,电脑经常蓝屏死机如何修复 电脑经常蓝屏死机修复方法【详解】...
  4. 解决 p0sixspwn-v1.0.4 win版 无法定位程序输入点sqlite3_wal_checkpoint的问题
  5. 浅谈人工智能生成内容(AIGC)
  6. Linux常用词汇、术语大全
  7. python中查看关键字需要在python解释器中执行_python从零开始--(02)--基础篇
  8. 四柱农历php,免费四柱八字排盘详解 免费算农历一生命运
  9. 一路坎坷,入局到突破【2022年度总结】
  10. Java中的Set接口,了解如何判断是否重复元素。