掘金 人工智能 5小时前
基于规则引导的半监督日志异常检测系统
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何构建一个Web日志分析系统,以检测可疑的访问行为。文章首先阐述了Web日志中关键数据字段的含义,如IP、时间、请求方法、访问路径、状态码、Referer和User-Agent,并强调了异常数据的识别特征。随后,详细讲解了如何使用正则表达式从日志文件中提取数据,并将其转换为CSV格式。在数据处理阶段,作者通过评分机制量化了数据的可疑程度。在模型选择上,作者尝试了监督学习模型(朴素贝叶斯、逻辑回归、XGBoost)和半监督学习模型。尽管监督学习模型效果不佳,但XGBoost表现出高准确率,而半监督学习模型通过伪标签的迭代训练,最终取得了令人满意的分析结果,加深了对半监督学习和日志分析的理解。

💡 **Web日志数据解析与异常特征识别**:Web日志包含IP、时间、Method、Path、Status、Referer、User-Agent等信息,其中访问路径中的“../”跳转、异常的状态码(如多次404/403)、缺失或伪造的Referer、以及不正常的User-Agent(过长、过短或包含特殊字符)都可能预示着可疑行为。通过对这些特征的分析,可以初步判断日志数据的异常性。

⚙️ **数据提取与预处理**:利用正则表达式可以高效地从原始Web日志文件中提取结构化数据,并转换为CSV格式便于后续分析。作者通过`re.compile`定义了详细的日志解析模式。为了应对数据量过大的问题,随机抽取了20万条数据进行分析,并设计了一种基于特征的评分机制来量化数据的可疑度,如路径长度、危险词汇、错误状态码、User-Agent的长度及特殊字符等,得分越高越可疑。

🚀 **监督学习模型的尝试与挑战**:在数据标注方面,作者首先利用评分机制为数据打上“伪标签”,并尝试了朴素贝叶斯和逻辑回归模型。然而,这些模型在准确率和召回率上表现不佳。随后尝试XGBoost模型,虽然准确率高达0.99,但作者对其可靠性表示怀疑,并排除了过拟合的可能性,这表明在处理日志分析这类复杂问题时,仅凭高准确率可能不足以作为最终判断依据。

🌟 **半监督学习的有效性**:面对监督学习的局限性,作者转向半监督学习方法。通过从海量数据中抽取未标记数据,并结合先前模型的预测结果(高置信度部分)作为新的伪标签进行迭代训练,最终构建了一个性能优越的模型。这种方法在处理大量未标记数据和少量标记数据时尤为有效,能够显著提升模型的整体表现。

📊 **模型评估与最终成果**:通过固定测试集对最终模型进行评估,显示出接近0.99的精度。尽管对模型结果的精确度保持谨慎,但作者认为这次实践成功地加深了对半监督学习和伪标签技术的理解,并掌握了安全日志的基本结构和正则表达式的应用,为构建有效的Web日志分析系统奠定了基础。

我想尝试做一个web日志分析系统,在查阅相关资料后我了解到web日志每一条都包含了ip/time/method/path/status/size/referrer/users_agent这几个数据

Ip和time就不说了

Method主要是看请求方式是get还是post

Path是访问路径,如果涉及到很多../这种跳往上级目录的也说明很有问题

Status是状态,就是访问状态,像我们平常出错的404、403这类的,如果同一个ip访问失败次数特别多基本上说明它非常可疑

referer告诉服务器你是从哪个页面点进来的,攻击者/脚本程序/扫描工具可能直接请求接口,不带referer,或者伪造一个奇怪的referer。

user_agent告诉服务器你是谁、你是什么设备或浏览器,如果太短大概率也有问题

声明:使用数据集来源

www.kaggle.com/datasets/el…

下载压缩包解压后里面有个.log扩展名文件,我们要是用的就是这个

首先我们提取数据变成csv文件,数据提取需要用到正则表达式:

数据提取

正则表达式提取数据代码:

log_pattern = re.compile(

        r'(?P\S+) - - [(?P

)

参照一下正则表达式规则就能看懂,之前学习爬虫的时候对这些也略有涉猎,感觉还挺亲切的

数据提取完成之后数据有点太多了,所以我就随机挑选20万使用。

检测数据

这一步其实我想了好久好久,我们自己怎么找出异常数据呢?最后使用的是打分的方式。路径太长加几分,有危险词汇(比如sql注入)也加几分,状态错误码的话在加几分,User-Agent太长或者太短、出现特殊字符(比如<>%$@等)也会加分,分越高越可疑。

好处就是也方便调整权重,哪些主要特征,无关紧要的特征可以设置得分少一些。

结果是:

思路

首先数据是没法自己来一点点标记的,索性就直接思考无监督模型吧。我的思路是给每个数据评分后就能通过无监督学习去划定一个范围,正常数据肯定占大多数,得分低比较密集,恶意数据会比较分散。通过训练来划定一定范围然后据此范围来预测数据是正常的还是恶意的。但是无监督模型不好测试,因为我们谁也不知道测试数据的真正结果没法据此参照测试模型。

然后我又在想先每个数据跟据评分判断出是否是恶意的或者正常的,打上标签,然后将原本的字符串数据喂给模型让他根据日志本来的样子来判断。

用规则系统(你就是这样做的)给一小部分样本打标签(伪标签),训练一个初步模型用模型预测未标记样本,把置信度高的预测结果当成新标签加入训练集,再训练模型(迭代),这是伪标签+ 监督学习是半监督学习得方法。

说干就干,我用上边的代码制作伪标签,

差不多和上边的代码一模一样,然后就有了新的问题,在平常的日志中可疑访问总归是少数的,我的20万数据中只有不到1.6万数据时可疑数据,样本极度不平衡。

但是我在想我们的数据本身是足够的而且非常多,我们仅仅只是使用了20万数据,我本来的数据是特别大的(有上千万条),那我抽300万数据打标签从中提取出20万可疑数据,然后将这20万可疑数据和20万普通数据混合不就够了?

成功了,现在数据平衡了,20万普通20万可疑,保证数据仍然真实有效。

监督学习

因为我们和之前的恶意url识别系统不一样,他是一个url对应一个label,这次我们日志分析使用的是多个数据path/method/user_agent等,数据太多,所以我们需要一一处理然后合并成一个,所以中间处理数据有点麻烦。

我们对比了朴素贝叶斯和逻辑回归两种。但是逻辑回归并未收敛所以我加大了迭代次数到2000次,仍未收敛。于是就saga求解器迭代2000次,终于收敛了。

但是结果是这样的

可以看到准确率一个在0.68一个在0.66,两者召回率都不算高(都只有 0.55-0.56),说明漏判很多恶意网址,结果都不尽如意。失败。

我又尝了一下XGBoost,但是结果有点离谱

结果是这样的

准确率在0.99,感觉超级不靠谱

可视化看了一下,好像没发现什么问题。接下来我想验证一下模型是不是过拟合了,于是我让ai生成一个模型学习曲线分析,然后看结果

还是没什么问题,也没有过拟合。然后我百思不得其解始终不敢相信:

于是我就半信半疑,先保留看法吧。不过从这里也能看出XGBoost的优势。

半监督模型尝试

再次从原来的上千万数据中随机抽取40万数据,这个和训练用的我感觉应该很少概率会有重复的数据,基本可以忽略不计。这40万数据就不再打标签了,让模型来直接预测。然后找出置信度高的打上伪标签,然后再次进行新模型的训练再次预测一直重复迭代得到最终模型,这就是常用的半监督学习方式。

首先数据处理和之前的一模一样,记得不要再重新创建向量器就是用原来的就行

然后就开始半监督训练,不断进行迭代

最后使用固定测试集的方法测试一下最终模型

结果:

可以看到模型精度还是在0.99,可能还是因为之前的那部分原因吧。总的来说来是很成功的。最后保存一下模型

结束!!!

这次算是加深了对半监督模型的理解,以及使用为标签的方法。同时也了解了安全日志的基本结构,及正则化表达。

github:github.com/likucy/web-…

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Web日志分析 正则表达式 半监督学习 数据科学 安全日志
相关文章