当前位置: 首页 > news >正文

基于规则引导的半监督日志异常检测系统

我想尝试做一个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告诉服务器你是谁、你是什么设备或浏览器,如果太短大概率也有问题
声明:使用数据集来源
https://www.kaggle.com/datasets/eliasdabbas/web-server-access-logs
下载压缩包解压后里面有个.log扩展名文件,我们要是用的就是这个
首先我们提取数据变成csv文件,数据提取需要用到正则表达式:
数据提取
image
image

正则表达式提取数据代码:
log_pattern = re.compile(
r'(?P\S+) - - [(?P

image
image

结果是:
image

思路
首先数据是没法自己来一点点标记的,索性就直接思考无监督模型吧。我的思路是给每个数据评分后就能通过无监督学习去划定一个范围,正常数据肯定占大多数,得分低比较密集,恶意数据会比较分散。通过训练来划定一定范围然后据此范围来预测数据是正常的还是恶意的。但是无监督模型不好测试,因为我们谁也不知道测试数据的真正结果没法据此参照测试模型。
然后我又在想先每个数据跟据评分判断出是否是恶意的或者正常的,打上标签,然后将原本的字符串数据喂给模型让他根据日志本来的样子来判断。
用规则系统(你就是这样做的)给一小部分样本打标签(伪标签),训练一个初步模型用模型预测未标记样本,把置信度高的预测结果当成新标签加入训练集,再训练模型(迭代),这是伪标签+ 监督学习是半监督学习得方法。
说干就干,我用上边的代码制作伪标签,
image

差不多和上边的代码一模一样,然后就有了新的问题,在平常的日志中可疑访问总归是少数的,我的20万数据中只有不到1.6万数据时可疑数据,样本极度不平衡。
但是我在想我们的数据本身是足够的而且非常多,我们仅仅只是使用了20万数据,我本来的数据是特别大的(有上千万条),那我抽300万数据打标签从中提取出20万可疑数据,然后将这20万可疑数据和20万普通数据混合不就够了?
成功了,现在数据平衡了,20万普通20万可疑,保证数据仍然真实有效。
监督学习
image
image

因为我们和之前的恶意url识别系统不一样,他是一个url对应一个label,这次我们日志分析使用的是多个数据path/method/user_agent等,数据太多,所以我们需要一一处理然后合并成一个,所以中间处理数据有点麻烦。
我们对比了朴素贝叶斯和逻辑回归两种。但是逻辑回归并未收敛所以我加大了迭代次数到2000次,仍未收敛。于是就saga求解器迭代2000次,终于收敛了。
但是结果是这样的
image

可以看到准确率一个在0.68一个在0.66,两者召回率都不算高(都只有 0.55-0.56),说明漏判很多恶意网址,结果都不尽如意。失败。
我又尝了一下XGBoost,但是结果有点离谱
image

结果是这样的
image

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

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

image
image

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

image
image

于是我就半信半疑,先保留看法吧。不过从这里也能看出XGBoost的优势。
半监督模型尝试
再次从原来的上千万数据中随机抽取40万数据,这个和训练用的我感觉应该很少概率会有重复的数据,基本可以忽略不计。这40万数据就不再打标签了,让模型来直接预测。然后找出置信度高的打上伪标签,然后再次进行新模型的训练再次预测一直重复迭代得到最终模型,这就是常用的半监督学习方式。
首先数据处理和之前的一模一样,记得不要再重新创建向量器就是用原来的就行
image

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

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

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

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

GitHub:https://github.com/likucy/web-log-anomaly-detection

http://www.sczhlp.com/news/6183/

相关文章:

  • 2025牛客多校第五场 K.完美旅程 J.最快覆盖问题 E.神秘异或操作 个人题解 - CUC
  • 【汇编和指令.第2025.8期】安装汇编器
  • 机器人精准夹取技术实现物品无损搬运
  • PG新功能:PG 17引入IN子句转换
  • StackOverFlowError 和 OutOfMemoryError
  • Go动态感知资源变更的技术实践,你指定用过!
  • 不同模型恶意url识别系统
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 第二十二篇
  • 2025.08.04 HDU 多校ACM
  • API网关中间件 - 浪矢
  • 8月5日随笔
  • win bat脚本根据端口批量关闭相关任务 - br
  • K8S的config-map
  • 【科普】怎么理解Modbus、TCP、UDP - 指南
  • 2025年7月Patch Tuesday补丁日综合讨论:系统管理员必读指南
  • AGORA:通过群体蒸馏激发大语言模型的群体涌现能力
  • 集训内容总结 day7:非传统题
  • 2025低代码平台推荐:5款工具实现零代码到企业级全覆盖
  • Docker+Jenkins实现Python 接口自动化部署
  • Exiv2加入键值对的几种方式
  • 类uTools工具选用
  • NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • API命名规范
  • 变量
  • Day35
  • 东软neteye防火墙(3.2.4)版本忘记密码处理(保留配置)
  • 8月5号
  • Bitmap设置DPI
  • 关于jpg文件格式的一个情景-第四篇(Magick++:先学习)