银空飞羽
该文章首发在i春秋论坛,欢迎各位师傅完成专业爱好者认证,可第一时间获取最新技术资讯和实战技能分享。
(识别二维码,快速完成认证)
本文是通过二分类的方式来训练一个可以识别恶意流量的模型,也作为机器学习在安全建设领域的一次实践探索。
首先,我们来了解一下什么是机器学习。通俗来讲,就是一个计算公式,如下:
f(x) = W * x + b
W是一个参数矩阵,b是偏移
每次输入x会计算出一个输出pre_y,将pre_y与原本的y进行比较,计算误差(损失函数),通过误差来更新W(梯度下降),循环往复来达到将模型的输出与实际输出相近的效果。
而处理计算的最小单位就被称为神经元,多个神经元组合在一起就构成了神经网络。
训练模型的过程就叫做机器学习。
1.数据集包括训练集和测试集。
训练集:用来训练模型,优化模型。
测试集:用来评估模型训练效果。
2.语料库:将所有训练集的文本进行分词处理,每一个词被称为token,构建语料库,每个token对应一个数字。
作用:主要用来将文本序列化成数字向量,以及将数字向量反序列化为文本。
3.模型构成
Embedding:用来将语料库的每个token赋予超参数,即 W_token * token
LSTM:是一种特殊的RNN类型,可以学习长期依赖信息。
激活函数:W * x +b 属于线性,而激活函数是为了增加非线性的拟合,函数图像举例:让一个直线函数在某些数值拐弯。
4.模型训练
优化器:求参数关于损失函数的导数,用来更新参数,采用梯度下降法。
损失函数:用于计算损失,数值越小说明效果越好。
5.数据准备
我这里准备了19w条恶意流量,以及20w条正常流量。
6.数据处理
将每个数据格式化为json格式,label为0代表正常流量,为1则代表恶意流量{ "feature: "package", "label": 0}
将恶意流量取175000作为训练集,正常流量取180000作为训练集,其余作为测试集。
7.语料库准备分词
这一步比较关键,决定哪些为有效信息,哪些不需要。
最终将处理好的字符串按照空格分隔为list输出。
8.语料库构建
可能会出现需要处理语料库中不存在的文本,所以引入了一个UNK标签,对应值为0。
因为文本要指定最大长度来保证数据矩阵的规范性,所以引入了一个PAD标签,对应值为1。
dict字典用于存储文本及其对应值,主要用于文本序列化为数字向量
inverse_dict字典是将dict的k,v进行反转,主要用于数字反序列化为文本(本模型中不需要使用)
count字典主要用于统计词频
同时该类包含如下方法:
fit将文本分词token填充进count
build_vocab将count构建为dict以及inverse_dict
transform序列化
inverse_transform反序列化
最终,将354501个训练集跑了一遍,构建了长度为1662602的语料库。
9.数据集构建
将数据文件封装起来,并且完成序列化。
规定对数据进行__getitem__的返回为feature, label。
指定batch_size,即训练时,一批数据包含batch_size个,这里为128。
10.模型构建
-
init初始化
-
forward训练计算
将初始化的函数进行输入feature的调用计算,因为是二分类问题,这里使用了log_softmax,将两个输出的概率返回,最大概率的值对应的索引即为模型计算结果;同时也方便使用nll_loss(负对数似然损失函数)来计算损失。
11.模型训练
采用gpu的方法进行训练
这里的优化器采用了Adam是一种动量法+自适应学习率的梯度下降算法,lr是学习率,为参数更新的幅度。训练过程即:
梯度清零,防止梯度值累加
模型计算
损失计算
反向传播,用来加快梯度下降计算
参数更新
12.训练结束
三十多万条数据分为2769批,共训练了25次,损失函数降为10-5。
13.模型测试
拿测试数据快四万条,转为cpu计算,准确率在99.98%,总花费大约204s。
14.模型应用
经实践,总体效果还是可以的。
项目已上传github:https://github.com/SSRemex/Http_Check_Model
15.数据集内流量构成
数据集的每一条都是由原始的HTTP数据包+标记的是否恶意字段(0代表正常流量,1代表恶意流量)构成的。
16.制作数据集步骤
①拿到原始的HTTP数据包,并人工或者脚本自动化标记该流量为正常流量还是恶意流量,恶意流量就是HTTP数据包中包含攻击行为的,例如:sql注入,xss,命令执行等等。
②然后按照文中的描述,每个数据包以及标记存储成对应格式的json文件即可。
③最终在代码中指定好目录,将数据集分割成训练集和测试集,即可开始进行训练。
作者总结
银空飞羽:知攻才能防,本期内容与渗透测试所涉及的技术体系大同小异,如果大家对这方面感兴趣的话,可以从渗透入手,这样当面临同类型的攻击时,就知道如何正确的检测防御了。
最后,感谢i春秋论坛,给广大网络安全爱好者提供了一个良好的学习交流空间。值此专业爱好者周年狂欢期间,我还参加了有奖征稿活动,并会持续发布技术文章,邀请大家前来围观,如有问题,欢迎批评指正。
戳这里,参加活动瓜分万元现金奖励!
原文始发于微信公众号(i春秋):记一期恶意流量检测模型的实践探索
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论