赞
踩
分析系统运行日志可以检测出系统异常,Min Du ICDM’16的文章SPELL提出一个日志解析工具;基于这个工作,她在CSS’17提出了DeepLog,也是现在非常经典的baseline,无监督的检测系统运行日志;她在CCS’19的工作在DeepLog的基础上引入了恶意样本的信息,改进准确率和误报率,并且将模型适用场景泛化到了信用卡交易记录等。
《DeepLog: Anomaly Detection and Diagnosis from System Logs through Deep Learning》 (CCS’17)
Log记录系统的状态和重要事件,这篇文章将Log当作自然语言序列来处理(实际上其实是更“干净”语言序列,因为相比语言log遵循严格的逻辑和控制流)。DeepLog本质是个深度学习模型,提取正常运行的log的模式特征,当log信息偏离训练的模型时检测出异常。这篇文章还提出如何在线更新迭代DeepLog模型。
总的来说还是基于传统统计方法(2017年之前)
上述方法只在限定场景有效,不能防御线上场景中的各种攻击
现有的一些方法使用rule-based方法,需要很强的领域知识。异常检测只有及时才有用,分类决策需要随着工作流产生。日志消息是并发的。
通过观察,系统日志中的条目是由执行结构化源代码产生的一系列事件(因此可以视为结构化语言)。模型先在一个小的、正常的log数据集上训练,然后在工作流中可以识别正常log,检测出异常情况。
在HDFS log、OpenStack log数据集上,DeepLog可以在1%的数据上训练,然后几乎100%预测剩下的99%的log。
DeepLog可以动态学习(online learning)。
首先要把非结构化数据log解析成结构化数据,即从log entry中解析出“log key”。对于一个log entry的log key e e e 指源代码中打印语句中的字符串常数k,该字符串常数在执行该代码时打印出e。例如:
解析出来的数据格式如下:
key + [前一个log的时间差,parameter values] 模型就用这三种信息
( k + 1 ) (k+1) (k+1)个模型
三部分组成:
值得注意的是对于每个log key k k k,DeepLog各自训练一个模型( k k k个模型),用 k k k的参数向量序列来训练。
识别阶段,一个新来的log先被解析成log key + 参数向量序列。log key模型先检查来的log key是否异常,如果正常,再用log key对应的参数检查模型去检查参数向量序列是否异常。如果异常,送给用户诊断。
如果把白样本误报成了黑样本,模型可以迭代更新训练。
运行日志log key的词典大小 K = { k 1 , k 2 , … , k n } K=\left\{k_{1}, k_{2}, \ldots, k_{n}\right\} K={ k1,k2,…,kn},模型是一个多类分类器,每次输入一个窗口长度的log key序列 w = { m t − h , … , m t − 2 , m t − 1 } w=\left\{m_{t-h}, \ldots, m_{t-2}, m_{t-1}\right\} w={ mt−h,…,mt−2,mt−1} ,异常触发的条件是预测错(不在top g个预测中)。
模型用的是多层LSTM,但是其实数据集和代码都比较简单,log key序列的词典大小只有28,并且观察数据集也比较有规律,有比较明显的区分(这也归功于作者自己ICDM16的工作)。
DeepLog剩下的k个LSTM模型是分析这个log key对应的log中的参数,以及log间隔时间。这部分序列主要可以识别出DoS攻击(间隔时间长)等。这个部分模型的作用感觉很弱,作者在报告时也没有很强调这部分,Github上开源的代码索性没实现这部分。
文章还有很多内容是提出在线异常检测的工作流、online learning等等和我们现在的工作关系不大。
作者在1%的数据集上训练,几乎可以预测出剩下99%的数据。
上文在DeepLog中,模型上线后的在线更新是:将误报的白样本(FN)提供给模型进行学习训练,那么问题来了:黑样本的信息从来没有被引入过,尽管存在可用的黑样本。所以本文增加了利用FP来更新模型。
但是Unlearning会带来梯度爆炸和catastrophic forgetting,文章也提出了解决办法。
对于一个黑样本,被误报成正常样本,即概率值超过了阈值:
Pr ( x t ) > τ (1) \operatorname{Pr}\left(x_{t}\right)>\tau \tag {1} Pr(xt)>τ(1)
其中 τ \tau τ是阈值,等价于损失函数低于了某个阈值:
L ( x t ) < τ ′ (2) \mathcal{L}\left(x_{t}\right)<\tau^{\prime}\tag {2} L(xt)<τ′(2)
我们为了减小 Pr ( x t ) \operatorname{Pr}\left(x_{t}\right) Pr(xt)的可能性,等价于增大损失函数 L ( x t ) \mathcal{L}\left(x_{t}\right) L(xt)的值,因此:
L unlearn ( x t ) = − L ( x t ) (3) \mathcal{L}_{\text {unlearn}}\left(x_{t}\right)=-\mathcal{L}\left(x_{t}\right)\tag {3} Lunlearn(xt)=−L(xt)(3)
同样的可以应用优化算法最小化 L unlearn ( x t ) \mathcal{L}_{\text {unlearn}}\left(x_{t}\right) Lunlearn<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。