前排手动点赞,思路很清晰,动手能力不错
我总结了一下,大概是这个流程
url参数泛化 > tfidf词袋 > dbscan聚类 > tsne降维可视
下面几个问题不知道楼主想过没
1.向量方面
一行日志虽然简单,但是其中包含信息量的可能不止只有参数(虽然攻击主要提现在参数里)
如果将思路打开,也许可以把更多能影响检测异常的维度进行向量化,之前做过类似的尝试:
http://jeary.org/post-81.html
http://jeary.org/post-80.html
比如请求长度、请求参数数量分布、状态码分布、时间、频率
其中逻辑有:
99%的人请求某个链接都是带两个参数,突然有个IP请求过来带了超过两个参数
99%的人并发不超过20,部分IP超过100
99%的人只有三种状态码(200、302、301),部分人有5种以上的状态码(200、403、400、500、301)
..(略)
2.词袋方面
tf-idf需要局部和全局因素进行计算,因为之前看到的例子是“文章词数量”与“搜索引擎检索数量”,在日志中似乎不太好体现这一点,另外我和你观点一致,只要能体现数据中的唯一维度,什么算法不重要,我之前就喜欢用one-hot(因为简单),另外不知道楼主尝试过word2vec没
3.向量权重
楼主提到了状态码并不会影响是否异常,而我的观点是,有影响,但是不能占过高的权重,所以在聚类时,可以通过定义各个向量的权重来表示,但是如果没有就等于是信息量丢失了(个人原则日志信息量有限,能用上就用上)
4.聚类相关
之前尝试过kmeans聚类,但是需要设定k值是个尴尬的问题,因为是“通用业务模型”,有多少簇确实不太好提现设定,但是后来相关自动计算k值的方法,根据数据自动计算k的算法(但是很迷),后来又想过使用一些传统的逻辑判断进行k指判断(如通过url归并、分类、统计等方法)
另外就是当聚类完成以后,形成N个簇以后,如何定义簇也是个问题,也就是定义每个簇的属性,如(爬虫簇、正常簇、异常簇..)当然这个属于非聚类范畴的业务需求(毕竟是聚类算法,不是分类算法) 不过之前我尝试过对聚类的结果进行二次识别,将每个不同的簇标记为不同的属性,可以理解为簇的属性验证,然后验证通过以后就能得知各个IP/URL是否为攻击或者爬虫或者某个类型,从而进行不同的应用场景