GeraldJones 2019-06-06
众所周知,网络安全的最常见风险来自入侵,其中包括:蛮力破解、拒绝服务、网络渗透等方面。而现如今,随着网络行为模式的改变,业界普遍认为单凭静态数据集的策略,是无法捕获流量的具体组成、并予以拦截的。因此我们有必要采用一种动态的方式,来检测和防御各种入侵。
也就是说:我们需要可修改的、可重复且可扩展的数据集,来学习和处理那些能够轻松绕过传统入侵检测系统(IDS)的复杂攻击源。下面,让我们一起讨论机器学习如何能够在入侵检测中发挥作用,以构建出更为强大与健壮的IDS。
在机器学习的各种算法中,无监督(Unsupervised)式学习算法可以从网络中“学到”各种典型的模式,并且能够在没有任何已标记数据集的情况下,报告异常情况。虽然它可以检测出各种新型的入侵,但是很容易出现误报(false positive alarms)的情况。因此,我们在此只讨论无监督式的K-均值聚类算法。另外,为了减少误报,我们可以引入已标记的数据集,并建立监督式机器学习模型,进而训练出网络中正常数据包与攻击流量之间的特征差异。此类监督式的模型能够熟练地处置各种已知攻击,并且能够识别出此类攻击的变种。因此,我们下面会讨论到的标准监督式算法包括:贝叶斯网络、随机森林、随机树、MLP、以及决策表。
在机器学习模型的开始阶段,最重要也是最繁琐的过程便是获得各种可靠的数据。在此,我们使用KDD Cup 1999的数据,来建立预测模型,从而区分入侵类攻击与真正有价值的流量连接。KDD Cup 1999是一个标准的数据集,它包括了在军事网络环境中所模拟出的各种干预模型,由4898431个实例和41种属性所组成。
它会跟踪如下四种攻击类型,每一个连接都会被标记为正常、或是具有攻击性。而且每一条连接记录大约都是由100个字节所组成。
如下表所示,每一种类型都包含了具体的攻击形式,一共有21种。
如下表所示,我们总结出了任意一种基于TCP/IP协议的连接集的基础分类特征:
数据在能够被机器学习算法所使用之前,必须经过被特征选择等处理。有些元素特征很容易被发现,而其他的特征则需要通过实验和测试才能被找到。当然,由于某些特征是冗余的,而且将不同的类别予以区分可能意义不大,因此在IDS中使用数据集的所有特征并不一定能获得最佳的性能,有时甚至会增加系统的计算成本与错误率。
此处,数据集的主要贡献是通过引入专家建议的属性,有助于系统理解不同类型的攻击行为,包括上述提及的:检测DoS、探测、R2L和U2R等基本特性。下表便是来自不同领域的知识库所给出的内容特征列表。
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所查出并报告的流量。
另一些可以参考与度量的指标还包括:精度和真阳性。其中: