使用K-means对网站访问者进行聚类

在分析Web日志流程中,寻找可疑请求、寻找异常访问者为分析流程中的基础流程,传统的做法是使用正则进行筛选,而这些正则则是通过我们已知的安全经验编写出来的,此时我们可以通过尝试一些新的方法~
一、数据准备
同上篇
二、算法测试
依赖库地址:[K-Means Java实现](https://sourceforge.net/p/yuanboshekmeans/code/ref/master/)

我们下载kmeans库之后将其引用到项目中,并编写测试Demo,测试库的可用性。测试Demo如图:

点击查看原图

 可以看到我们使用了4个3维的样本数据,数据中的最后一个样本数据明显不同于其他数据,算法运行结果将前三数据分类为第0类,第四组数据分为第1类,效果正和预期中的一样。

三、实际测试
下面我们使用实际数据进行分类,从测试代码中不难看出,我们需要准备的数据为一个二维的double数组。
构建符合格式要求的数据后便可以计算分类了,图为真实数据计算结果,末尾的0表示当前数据的分类

点击查看原图

点击查看原图

我们可以看到,分类为1的访问者共发起了2w+请求,服务器给此访问者响应的流量总量为1213MB,有19553个请求的状态码是200

点击查看原图

同上


四、聚类可视化
对实际数据进行分类为3簇之后,簇成员较少的那两类基本不是扫描器就是爬虫,到这里我们的目的已经完成了一大半,成功找出异常的访问者,但此类数据虽说可直接进行使用,但是不方便观察,所以我们可以对这些数据进行可视化。由于数据结果为21维度,而常见的可视化为二维平面坐标图,搜集一番资料发现可以对高维数据进行降维,将高维坐标映射投影到低维坐标系中。降维算法有T-SNE、PCA、SVD等,由于T-SNE有现成的依赖库,所以这里直接引用.[T-SNE Github地址](https://github.com/lejon/T-SNE-Java)
根据Github上的示例代码更改,读取算法计算后的多维数据并调用jmathpolt进行可视化,



点击查看原图

分为两类:

点击查看原图

分为三类:

点击查看原图

分为五类:

点击查看原图

分为十类:

点击查看原图


从分类可视化中,可以观察出很多有用的信息,然后通过与真实数据对比,找出异常的访问者已经不是难事。


五、结果验证
我们在找出数据中的较少分类中的数据,提取出IP到kibana中进行搜索

点击查看原图

点击查看原图

如图,可以看出这个访问者的确是一名攻击者,进行了一些大量的扫描行为

点击查看原图

六、拓展思考
1.k值选择
k作为初始分类数量,很影响分类结果,所以选取一个合适的值非常重要
2.数据预处理
目前数据直接使用的源数据,可能会对算法产生影响,数据可进行一定的处理


发表评论