最后更新:2020-04-15 11:51:21 手机定位技术交流文章

网络在现代生活中扮演着重要的角色,网络安全已经成为一个重要的研究领域。入侵检测系统(IDS)是一项重要的网络安全技术,它监控网络中软硬件的运行状态。尽管经过几十年的发展,现有的入侵检测系统仍然面临着提高检测精度、降低误报率和检测未知攻击的挑战。为了解决上述问题,许多研究者致力于使用机器学习方法开发入侵检测系统。
机器学习方法能够自动发现正常数据和异常数据之间的本质区别,具有较高的准确性。此外,机器学习方法具有很强的泛化能力,因此它也能检测未知的攻击。
入侵检测系统分类
入侵检测系统有两种分类方法:基于检测的方法和基于数据源的方法。在基于数据源的方法中,入侵检测系统可分为基于主机的方法和基于网络的方法。这种方法的主要缺点是需要领域知识来建立和维护这些系统并监控推理。在基于检测的方法中,入侵检测系统可分为滥用检测和异常检测。

图1:入侵检测系统分类
你为什么选择深入学习?
深度学习是机器学习的一个分支。其性能卓越,已成为研究热点。当有足够的训练数据时,基于深度学习的入侵检测系统能够达到令人满意的检测水平,深度学习模型具有足够的泛化能力来检测攻击变体和新的攻击。此外,他们很少依赖领域知识;因此,它们易于设计和构建。
与传统的机器学习技术相比,深度学习方法更适合处理大数据。此外,深度学习方法可以从原始数据中自动学习特征表示,然后输出结果。它们以端到端的方式运行,非常实用。
在本文中,我们将重点介绍使用深度学习网络和时间序列原理的机器学习方法。利用深度学习解决时间序列问题的基本要求是“数据”。这些数据可以是单变量/多变量时间序列数据,即数据按时间顺序记录。

图2:在2:入侵检测系统中使用的不同类型的机器学习算法
该方法将攻击检测问题简化为异常检测问题。这背后的原因是攻击通常很少发生,但是当它们发生时,它们的特征(或者更确切地说,它们的分布)与正常操作条件下的特征非常不同。签名的这种变化反映在时间序列数据中。我们使用自编码模型来学习正常状态数据的分布。使用这个模型,我们可以确定传入数据是否有明显不同的签名。
什么是自编码器?
自编码器是一种神经网络,包括两个对称部件,编码器和解码器,如图3所示。编码器从原始数据中提取特征(也称为潜在表示),解码器从这些潜在表示中重构输入数据。在训练期间,编码器的输入和解码器的输出之间的差异逐渐减小。在这个训练过程中,来自编码器的潜在表示逐渐倾向于表示原始数据的本质。需要注意的是,整个过程不需要监管信息。有许多著名的自编码器变体,如去噪自编码器、变分自编码器和稀疏自编码器。

图3:自编码器的结构
自编码主要用于减少特征数空,而特征/潜在表示位于工作流的下游,用于训练不同类型的模型。自编码器也非常擅长捕捉输入特征空之间的复杂多元分布。由于这一特性,它们被广泛用于异常检测任务。
由于这是一个时间序列问题,我们使用LSTM网络。它们是RNN(循环神经网络)的变体,用于在长序列上保持时间相关特性。这些网络要求每个样本的形状为(时间步长、特征)。时间步长是一个可调的数字。因此,输入数据是3D形状(样本数量、时间步长、特征)的阵列。
数据集描述
为了模拟入侵检测学习任务,我们使用KDD99数据集。KDD99数据集是最广泛的入侵检测系统(IDS)基准数据集。它从名为DARPA1998的原始数据集提取41维特征,该数据集包含原始的传输控制协议数据包和标签。因为原始数据包对机器学习模型用处不大。因此,计划了一个称为KDD99数据集的新数据集。
KDD99与DARPA1998具有相同的标签。KDD99具有四种类型的特征,即基本特征、内容特征、基于主机的统计特征和基于时间的统计特征。该数据集可以从http://kdd.ics.uci.edu/databases/kdcup99/kdcup99.html.下载
在上面的链接中,有几个版本的数据集。在这项工作中,我们使用数据集的完整版本来训练和测试。
训练数据:kddcup.data.gz测试数据:corrected.gz无标记数据(生产数据):KDDC杯。新测试数据_ 10 _百分比_未标记。我们在训练集上训练模型,调整决策参数(例如分类器阈值),并在测试集(也称为验证集)上测量有效性指标。最后,我们使用生产集(未标记的数据集)来识别异常。
导入Python库
#导入所有必需的包导入tqdm导入熊猫作为pd导入numpy作为np导入tensorflow作为tf导入matplotlib.pyplot作为plt导入t tensorflow作为tf从sklearn .分解导入PCA从sklearn.model_selection导入train_test_split从sklearn .预处理导入Standar dScaler、LabelEncoder、MinMaxScaler、OneHotel从mpl_toolkits导入mplot3d从tensorflow.keras.layers导入输入、密集、LSTM、时间分布、重复矢量空间.距离导入欧氏导入随机导入seaborn作为来自sklearn的sklearn.metrics导入混淆矩阵、roc_auc_score、roc_curve、F1 _ score、precision _ score、recall _ score、precision _ score、plot _ fusion _ matrix数据预处理
让我们先导入所需的培训文件。
TRAIN _ DATA _ PATH = ' KDD _ TRAIN . CSV ' COLUMN_NAMES_PATH = ' COLUMNS _ NAMES . txt ' TEST _ DATA _ PATH = ' KDD _ TEST . CSV ' PROD _ DATA _ PATH = ' KDD _ production . CSV ' #正在读取训练数据文件df = pd.read_csv(TRAIN_DATA_PATH,标头=无)#正在读取包含打开的特征名称的文件(COLUMN _ NAMES _ PATH,' r ')作为txt _ file:col _ NAMES = txt _ file . readline()col _ NAMES _ cleaneoused =
图4:培训数据文件中的不同字段
训练数据集有> 400万行,只有大约20%是正常的。数据帧的最后一列是“结果”列,它指定连接是正常的还是攻击的。有不同类型的攻击,如反向dos、缓冲区溢出u2r、ftp写r2l、猜测密码r2l等。在测试集中,除了训练集中的攻击,还有一些新的攻击。这些新攻击是训练集中现有攻击的变体。这样做是为了衡量该模型对看不见的攻击的有效性。然而,我们不打算将不同类型的攻击归类为JSut异常。
下面的直方图显示数据集比正常实例有更多的异常。
这个训练数据集有400多万行,其中只有20%是正常的。数据框架的最后一列是“结果”列,它指定连接是正常的还是攻击的。有各种类型的攻击,如后台dos、缓冲区溢出u2r、ftp_write r2l、guess_passwd r2l等。在测试集中,除了训练集中的攻击,还有一些新的攻击。这些新攻击是训练集中现有攻击的变体。这样做是为了衡量该模型对看不见的攻击的有效性。但是,我们不打算将不同类型的攻击进行分类,并将其视为例外。
下面的直方图显示数据集比正常实例有更多的异常。
pd.value_counts(df
图5:直方图显示了不同攻击类型的实例数量
接下来,我们将研究在名为“服务”的字段下的数据中呈现的不同服务类型。
rint('不同类型的服务:{} '。格式(df
数据中存在不同类型的服务
在这里,我们可以看到数据包含不同类型的服务。通过分析不同服务的数据,发现在正常情况下,它们的分布是不同的。因此,我们只考虑“http”服务类型,因为它是互联网流量中最常见的服务类型。
#仅提取具有http服务的行。df_http = df
图6:直方图显示了HTTP服务中不同攻击类型的数量
接下来,我们只提取具有正常数据的行来训练自编码器。此外,我们还删除了所有分类栏。通常,它们被转换成一个热门的编码特征,但是在这样做之后,它们在确定输出方面没有什么意义。
normal_instances = df_http
图7:数据中存在的相关热图
虽然大多数特征彼此之间没有关联,但是相关性很小。为了消除这些相关性,并使所有必要的特征具有相同的尺度,我们使用标准尺度对数据进行尺度化,并使用主成分分析(PCA)对数据进行降维。由于所有的主成分分析都是相互正交的,这也确保了所有的相关性被消除。
#使用主成分分析降低数据的维数,并覆盖原始数据中80%的方差主成分分析=主成分分析(n_components=0.8)主成分分析拟合(df_http_normal)主成分分析_cols =
图8:编码器和解码器架构
此外,我们在培训期间使用模型检查点回调。这将确保最佳性能模型和权重保存在验证集中。后来,这个模型可以恢复用于推理。
#训练自动编码器check _ point = TF . keras . callbacks . ModelCheckpoint(' auto encoder . H5 ',monitor='val_loss ',save_best_only=True,mode='min ',verbose = 1)train _ hist = auto encoder . fit(windows_shuffled,windows _ shuffled
图9:测试样本的预测和实际异常分数
显然,对于真实的异常样本,异常分数非常高,而对于真实的正常样本,异常分数非常低。然而,0.5不是最佳决策边界。该模型只看到正常样本(分数为0),因此它可以强有力地识别它们。这是典型的阶级不平衡问题。如果我们有相同数量的异常样本,那么按照监督学习方法训练分类器是有意义的。决策阈值似乎在0.05和0.15之间。
在典型的分类问题环境中,ROC-AUC(曲线下的接收器操作特征区域)被用作测量分类器的有效性的实际指标,即分类器能够区分两种分类的程度。ROC是由于不同的阈值导致的真阳性率和假阳性率之间的关系。
fpr,tpr,thresholds = ROC _ curve(test _ labels,exception _ scores)AUC = ROC _ AUC _ score(test _ labels,exception _ scores)#绘制ROC plt .图(figsize=(10,5)) plt .图(
图10:分类过程的ROC
这个ROC表明我们的分类工作流程在区分类别方面非常有效。需要注意的是,ROC-AUC并不总是一个确定分类器有效性的好指标。
因此,我们使用一种称为F-1分数的度量,它是精确度(假阳性效果的度量)和召回率(假阴性效果的度量)的加权调和平均值。最后,我们选择F-1得分最高的阈值。
异常_组合=
图11:F1得分和阈值之间的关系
max _ f1 _ score = NP . max(f1 _ scores)best _ threshold =阈值
图12:最佳阈值的混淆矩阵
此工作流具有以下分类指标:
precision = precision _ score(test _ labels,exception _ indicator)recall = recall _ score(test _ labels,exception _ indicator)f1 _ sc = f1 _ score(test _ labels,exception _ indicator)precision _ sc = precision _ score(test _ labels,exception _ indicator)
图13:最佳阈值的分类指数
图(figsize=(20,10)) sns .散点图(x=np.arange(0,len(exception _ scores)),y = exception _ scores,色调=
图14:测试集结果

图15:生产数据集的结果
最后的
虽然这是检测网络入侵的有效方法,但也可以使用其他几种高级深度学习技术:
可以用氮化镓代替自编码器来模拟数据。如果训练有素,GAN可以更准确地捕捉数据分布。他们还可以通过生成正常或异常类的新示例来扩展数据集。可以使用自编码器的变体,例如稀疏自编码器和可变自编码器。它们对潜在表示有特殊的限制,并导致提取更强大和有效的潜在表示。上述方法是一种纯粹的机器学习方法,几乎没有领域知识。在任何领域,将领域知识与最大似然法相结合总能带来最好的结果。
本文由 在线网速测试 整理编辑,转载请注明出处。