《Web安全之机器学习入门》学习笔记

  • 算法
    1. K近邻算法(K-Nearest Neighbor,KNN)

1.1.1 概念

K个最近的邻居,及每个样本都可以用它最接近的K个邻居代表。核心思想是如果样本附近的K个最相邻样本大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别样本的特性。(适合类域交叉或重叠较多的待分样本集)

 

1.1.2 算法步骤

step.1---初始化距离为最大值;

step.2---计算未知样本和每个训练样本的距离dist;

step.3---得到目前K个最临近样本中的最大距离maxdist;

step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本;

step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完;

step.6---统计K-最近邻样本中每个类标号出现的次数;

step.7---选择出现频率最大的类标号作为未知样本的类标号。

 

1.1.3 函数

       >>> from sklearn.neighbors import NearestNeighbors

       >>> NearestNeighbors(n_neighbors=n, algorithm=‘auto/ball_tree/kd_tree/brute’).fix(X)

 

      1.1.4 实例

      1.1.4.1 检测异常操作(一)

       i、数据集:bash操作日志,依次读取每行操作命令,每100个命令组成一个操作序列,统计最频繁的前50个命令和最不频繁的前50个命令。

       ii、特征化:以100个命令为统计单元,去重后的操作命令个数作为特征;用户前10个最频繁的命令(与i中前50个重合程度);用户前10个最不频繁的命令(与i中前50个重合程度)。

 

       1.1.4.2 检测异常操作(二)

       i、数据集:数据集不变,但不再统计最频繁和最不频繁的命令。

       ii、特征化:将用户所有操作命令特征化,与总的命令词集对应,形成一个特征数组。

 

       1.1.4.3 检测WebShell

       i、数据集:ADFA-LD数据集,记录系统调用序列;

       ii、特征化:将系统调用编号,则系统调用系列转换成序列向量。

 

    1. 决策树算法

1.2.1 概念

       一棵从根节点不断做选择的树。

 

      1.2.2 函数

       >>>from sklearn import tree

       >>>clf = tree.DecisionTreeClassifier()

 

    1. 随机森林算法

1.3.1 概念

       利用多棵决策树对样本进行训练,每棵树之间无关联,统计最后结果,少数服从多数。

 

1.3.2 函数

>>> from sklearn.ensemble import RandomForestClassifier

>>>clf=RandomForestClassifier(n_estimators=10, max_depth = None, min_samples_spilt = 2 )

n_estimators:森林中树的数量;

max_depth:树的最大深度;

min_samples_spilt:分割内部节点所需要的最小样本数量,就是子树继续划分的条件,如果少于设置的数字,则不根据最有特征划分进行划分。

 

    1. 朴素贝叶斯算法(Naive Bayes,NB)

1.4.1 概念

       基于一个简单的假定:给定目标值时属性之间相互条件独立。

 

       1.4.2 函数

       >>> from sklearn.naive_bayes import GaussianNB

       >>> gnb = GaussianNB()

 

      1.4.3 实例

1.4.3.1检测Webshell(一)

       i、数据集:WebShell文本作为黑样本,wordpress源码作为白样本。

       ii、特征化:将一个PHP文件作为一个字符串处理,基于单词2-gram切割,遍历全部文件形成词汇表,再将样本数据特征化。

 

      1.4.3.2 检测WebShell(二)

       i、数据集:对黑样本集合以1-gram算法生成全局的词汇表(基于函数和字符串常量进行切割);

       ii、特征化:将白样本特征化。

 

       1.4.3.3 检测DGA域名

       与检测WebShell(一)的手段一样。

 

    1. 支持向量机算法(SVM)

1.5.1 概念

       十分合适安全领域非黑即白的二分类问题,核心思想为线性可分(二维),若不可分则升维。一般升维会大大增加计算复杂度,但是这种算法基本不逊在这种问题。(具体原因是核函数的展开和计算理论,数学跟不上,不太明白。)

 

1.5.2 函数

       >>> from sklearn import svm

       >>> clf = svm.SVC(kernel = ‘linear’)

 

      1.5.3 实例

      1.5.3.1 识别XSS

       i、数据集:数量相等的正常Web访问日志和XSS攻击的Web日志(来源:WVS仅扫描XSS相关漏洞即可获取)。

       ii、特征化:url长度,url中包含第三方域名的个数(http、https),敏感字符的个数(<,>,’,”),敏感关键字的个数(alert,script=,onerror,onload,eval,src=)

 

       1.5.3.2 区分僵尸网络DGA家族

      i、数据集:1000个cryptolocker域名,1000个post-tovar-goz域名,alexa前1000域名。

       ii、特征化:元音字母个数,去重后的字母数字个数与域名长度的比例,平均jarccard系数(两个集合交集与并集元素个数的比值)

 

    1. K-Means算法

1.6.1 概念

       无监督算法,聚类算法。中心思想是以空间中k个点为中心进行聚类,通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

 

       1.6.2 算法步骤

       首先,从n个数据对象任意选择k个对象作为初始聚类中心;对于剩下的其他对象,则根据他们与这些聚类中心的相似度(距离),分别将他们分配给与其最相似的聚类。

       然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值)。

       不断重复这一过程直到标准测度函数开始收敛为止。

 

1.6.3 函数

       >>> from sklearn.cluster import K-Means

       >>> y_pred = KMeans(n_clusters = 3, random_state = random_state).fix_predict(X)

       n_clusters:生成的聚类数;

       random_state:用于初始化质心的生成器。

 

      1.6.4 实例

      1.6.4.1 检测DGA域名

       与检测WebShell(一)的手段一样。

 

  • 总结

只列出了部分常见的机器学习算法,算法基本都差不多,没列出的算法更偏向于数据挖掘领域,用于比如广告推销之类。

这些算法难度不在于模型训练,这些实现方式瓶颈在于对数据的预处理上,需要手动编写函数去处理数据,将数据特征化。并且不同的处理方法可能会对结果准确度有很大的影响。训练速度慢的主要原因是对数据的处理还是在CPU上运行,后面的训练在GPU上运行,导致CPU限制了GPU,CPU负载满满而GPU却会闲着。

你可能感兴趣的:(WEB安全与机器学习,机器学习)