机器学习算法在IDS中的应用

GeraldJones 2019-06-06

机器学习算法在IDS中的应用

众所周知,网络安全的最常见风险来自入侵,其中包括:蛮力破解、拒绝服务、网络渗透等方面。而现如今,随着网络行为模式的改变,业界普遍认为单凭静态数据集的策略,是无法捕获流量的具体组成、并予以拦截的。因此我们有必要采用一种动态的方式,来检测和防御各种入侵。

也就是说:我们需要可修改的、可重复且可扩展的数据集,来学习和处理那些能够轻松绕过传统入侵检测系统(IDS)的复杂攻击源。下面,让我们一起讨论机器学习如何能够在入侵检测中发挥作用,以构建出更为强大与健壮的IDS。

与IDS相关的机器学习相关概念

在机器学习的各种算法中,无监督(Unsupervised)式学习算法可以从网络中“学到”各种典型的模式,并且能够在没有任何已标记数据集的情况下,报告异常情况。虽然它可以检测出各种新型的入侵,但是很容易出现误报(false positive alarms)的情况。因此,我们在此只讨论无监督式的K-均值聚类算法。另外,为了减少误报,我们可以引入已标记的数据集,并建立监督式机器学习模型,进而训练出网络中正常数据包与攻击流量之间的特征差异。此类监督式的模型能够熟练地处置各种已知攻击,并且能够识别出此类攻击的变种。因此,我们下面会讨论到的标准监督式算法包括:贝叶斯网络、随机森林、随机树、MLP、以及决策表。

数据集

在机器学习模型的开始阶段,最重要也是最繁琐的过程便是获得各种可靠的数据。在此,我们使用KDD Cup 1999的数据,来建立预测模型,从而区分入侵类攻击与真正有价值的流量连接。KDD Cup 1999是一个标准的数据集,它包括了在军事网络环境中所模拟出的各种干预模型,由4898431个实例和41种属性所组成。

它会跟踪如下四种攻击类型,每一个连接都会被标记为正常、或是具有攻击性。而且每一条连接记录大约都是由100个字节所组成。

  • 拒绝服务:denial-of-service
  • R2L:来自远程机器的未经授权的访问
  • U2R:来自本地root特权的未经授权的访问
  • 探测:监视并需要另一种检查

如下表所示,每一种类型都包含了具体的攻击形式,一共有21种。

机器学习算法在IDS中的应用

KDD集合

如下表所示,我们总结出了任意一种基于TCP/IP协议的连接集的基础分类特征:

机器学习算法在IDS中的应用

数据在能够被机器学习算法所使用之前,必须经过被特征选择等处理。有些元素特征很容易被发现,而其他的特征则需要通过实验和测试才能被找到。当然,由于某些特征是冗余的,而且将不同的类别予以区分可能意义不大,因此在IDS中使用数据集的所有特征并不一定能获得最佳的性能,有时甚至会增加系统的计算成本与错误率。

此处,数据集的主要贡献是通过引入专家建议的属性,有助于系统理解不同类型的攻击行为,包括上述提及的:检测DoS、探测、R2L和U2R等基本特性。下表便是来自不同领域的知识库所给出的内容特征列表。

机器学习算法在IDS中的应用

机器学习算法的简述

K-均值聚类(K-means clustering)

如前所述,K-均值聚类是一种无监督式的学习技术。这是最简单、也是最流行的机器学习算法之一。它在数据中寻找不同的组,其中组的数量由变量K所表示。该算法基于数据集的特征,将不同的数据点分配给K中的一个组。基于不同的特征相似性,各个数据点会被采取聚类。

贝叶斯网络(Bayes Network)

贝叶斯网络是一种概率图形模型。它的原理是通过绘制出有向图形边上的依赖关系,进而充分利用到条件的依赖性。它假定所有没有被边缘所连接的节点,都是具有条件独立。而且它在创建有向无环图时,就利用到了该事实基础。

随机森林分类器(Random Forest Classifier)

随机森林是一种集成式的分类器,它通过合并多种算法来实现分类。这些算法在数据的随机子集上创建多个决策树,然后通过聚合每棵树的总票数,来决定测试的类别。同时,它也会给个别树的贡献程度分配权重值。

多层感知(MLP)

MLP是一种前馈式神经网络。它至少由三个层次所组成:输入层、隐藏层和输出层。在训练期间,我们可以通过调整各种权重或参数,来最小化分类中的错误。该算法在每个隐藏节点中引入了非线性(Non-linearity)。而反向传播则是用来通过参照错误,进而调整权重与偏差。

实现

下面,我们将使用Python及其广泛的库来实现IDS。当然,我们需要事先安装好Pandas(基于Python的大型数据集分析库)、NumPy(Python的一种开源类数值计算扩展)和Scipy(可用于数学、科学、工程领域的常用软件包,常用于计算Numpy矩阵,能与Numpy协同工作)。如果您使用的是Ubuntu系统,那么其对应的shell命令应该是:

sudo pip install numpy scipy pandas 

首先,我们需要对数据集进行预处理,也就是说:数据集需要被下载并提取到程序对应的文件夹中。同时,该数据集应该是.csv格式,以方便Python的读取。因此具体命令如下:

# Import pandas 



import pandas as pd  



# reading csv 


file dataset = pd.read_csv("filename.csv") 

前面提到的各种机器学习算法都应当被存放在“神奇”的Scipy库中。通过以下步骤,您可以使用不同的模型,来快速运行目标数据集:

K-均值

import numpy as np  




from sklearn.cluster  




import KMeans  




print(dataset.describe())  




# to view the summary of the dataset loaded  




kmeans = KMeans(n_clusters=2)  




# You want cluster the threats into 5: Normal, DOS,PROBE, R2L and U2R  




kmeans.fit(X)  




prediction = kmeans.predict(dataset[0])  




# predicts the type for the first entry  



随机森林 



#Import Random Forest Model  




from sklearn.ensemble  




import RandomForestClassifier  




#Create a Gaussian  




Classifier clf=RandomForestClassifier(n_estimators=50)  




#Train the model using the training  




dataset clf.fit(dataset,dataset[:,LAST_COLUMN])  




#LAST_COLUMN is the index of the column with the labelled type of threat or normal  



pred=clf.predict(dataset) 

朴素贝叶斯网络

from sklearn.naive_bayes  




import GaussianNB  




#Create a Gaussian Naive Bayes Classifier  




gnb = GaussianNB()  




gnb.fit(dataset,dataset[:,LAST_COLMN])  



pred=predict(gnb,dataset[0]) 

多层感知

From sklearn.neural_network  




import MLPClassifier  




#Create a Multi-Layer Perceptron  




clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)  




clf.fit(dataset,dataset[:,LAST_COLMN])  



pred=clf.predict(dataset[0]); 

结果

为了衡量机器学习模型的准确性,我们会引入诸如:平均准确度(Average Accuracy)、误报率(False Positive Rates)和漏报率(False Negative Rates)等不同衡量维度的参考指标。由于K-均值是一种无监督式算法,因此它被排除在了该指标之外。

如下面公式所示,平均准确度定义为:被正确分类的数据点与数据点总数的比。

机器学习算法在IDS中的应用

机器学习算法在IDS中的应用

显而易见,此处的“误报”是指那些被判定为威胁,而实际上并非为如此的数据流量。同理,“漏报”是指那些确实为威胁,但未被IDS所查出并报告的流量。

机器学习算法在IDS中的应用

另一些可以参考与度量的指标还包括:精度和真阳性。其中:

  • 精度是指发现的威胁与威胁总量的比率。
  • 真阳性是指那些能够被成功地识别为威胁包,与全部能被识别和判定的数据包的比率。

机器学习算法在IDS中的应用

应用的意义

相关推荐