持续补充,持续更新中。。。
采用了CERT Insider Threat Dataset v6.2数据集。模拟了恶意内部人实施的系统破坏,信息窃取和内部欺诈三类主要攻击行为和大量的正常背景数据。
涉及多个维度的用户行为数据,如文件访问,邮件收发,设备使用,HTTP访问
内部人行为建模多个维度
一共有516天,4000个用户产生了135,117,169个事件(log event事件日志)
有5个内部威胁场景
误用检测的准确率高,但是不能有效应对新型模型
异常检测基于白名单思想,可以灵活的检测新型攻击,但是准确率没有那么高
在Chandola et al. (2012)介绍了异常检测的发展历程
达到了95.53%的异常分数
内部威胁:指的是雇员做的事情,最后对公司造成了威胁。
Entity:实体
Metadata:元数据
heterogeneous tracking source:
element-wise multiplication:向量的一种特殊乘法
提取出分类用户属性特征和持续的计数特征,某个用户,某个时间段下的特征向量为414维的,其中包括408维的计数特征和6维的用户属性特征。
6个属性特征是分离的,404个计数特征是连续的,要找到特征中最大程度上决定最终是否异常的特征。一共有5个事件源:登录注销事件,http流量,邮件流量,文件操作,外部存储设备使用。
使用LSTM作为RNN模型。在训练RNN模型的时候,每个用户都有一个RNN网络,每个用户的权重都是公共的,但是对于不同用户的隐藏层序列是不一样的。
RNN需要调试的超参数包括:隐藏层数目和每层的维度大小。batch_size(256-8092),学习率为0.01,
batch_size更大会加速模型训练,RNN需要模型加速???(这里是什么意思)。还需要调试time step???(3-40)。使用tanh作为激活函数,使用梯度下降
SVM和孤立森林是使用sklearn进行训练。孤立森林调整评估器的个数,contamination (between 0 and 0.5), and whether we bootstrap (true or false)。SVM调整核函数选择,是否使用收缩启发式。
or false).
DNN需要调试的超参数包括:隐藏层数目(1-6)和每层的维度(20-500)。batch_size为256,学习率为0.01,使用tanh作为激活函数,使用梯度下降
需要调整的参数:主成分的个数
非监督训练没有训练集,所以将原数据集划分为85%的development dataset(进行模型选择和超参数调试)和15%的test dataset(评估模型的表现)。由于只需要训练工作日的,所以过滤出工作日的。
通过随机参数搜寻来寻找最优参数(Random hyper-parameter search)
(1)采用召回率评估模型而不是准确率评估模型
(2)将用户属性加入特征中或者不加入特征中,进行比较,结果差别不大,原因在于我们加入用户属性是为了加入context上下文,但是我们的模型过于简单所以不需要加入。所以之后只使用计数特征。
(3)将两个DNN,两个LSTM进行比较,它们的唯一区别在于是same time step还是next time step。这里same time step表现的更好一些。???(这里不理解,需要先看看RNN)
(4)协方差类型改变对模型进行比较(diagonal和identity),使用对角协方差更好
(5)最后发现DNN和LSTM结果差不多???
(1)percentile百分位数
(2)召回率
Github上的源码链接为https://github.com/pnnl/safekit 。下载了源码,对其中的一部分文件认真的看了一下,分享一下。
源码中有对于LANL和CERT这两个数据集的实践。
LANL数据集是LANL实验室的异常检测数据集,收集了58天中的事件数据。在这份源码中只使用了auth.txt这个文件和redteam.txt文件。(从官网去下载,你会发现有好几个txt文件,这里只用到auth.txt文件和redteam.txt文件)
(1)examples/下文件分析
examples/下是几个示例代码,是ipynb文件。dnn_agg.ipynb是对于LANL数据集的DNN实践,LANL_LM_data.ipynb是用于将lLANL数据集中的auth.txt中的og数据转换成特征向量,也就是特征提取的过程。safekit/features/lanl下的几个python文件也可以进行相同的操作得到一样的特征值结果。simple_lm.ipynb是对于LANL数据集的LSTM实践。
(2)data_exmples/下文件分析
cert中是训练要用的cert特征值数据(也就是原始的CERT数据集处理后的数据),lanl中是训练要用的lanl特征值数据(也就是原始的LANL数据集处理后的数据)。agg_feats就是DNN模型的输入部分数据,lm_feats就是LSTM模型的输入部分数据。其实大家从名字上也可以看出来,一般好的项目中的文件命名都是很规范的,便于大家初步理解这个文件的作用。总之,data_examples下的文件都是原始数据集处理后的,不是原始的数据集(也就是特征提取得到的特征值)
(3)docs/文件分析
docs下的文件我没有仔细看,目前还不太清楚是干嘛的,以后有需要再补充。
(4)test/文件分析
test下面是我们真正训练要用的python文件。agg_tests.py是基于CERT和LANL的DNN实践运行文件,lanl_lm_tests.py是基于LANL的LSTM实践运行文件。但是要注意的是,这两个文件实际上只是用来运行真正的训练代码的。
比如我们看lanl_lm_tests.py的第一段代码。就是对于simple LSTM的实践部分,就是os.system中的这段实则就是运行simple_lm.py文件。后面的modelpath, specpath, args.datapath, args.logfile就是运行代码的时候需要确定的四个参数。其中modelpath, specpath在lanl_lm_tests.py前面部分代码已经给出, args.datapath, args.logfile需要我们在cmd中运行lanl_lm_tests.py的时候自己给出。这里用Github源码中readme的示例运行命令解释:python test/lanl_lm_tests.py data_examples/lanl/lm_feats/ test.log。可以看到这就是我们平时在cmd中运行python代码的格式,后面的data_examples/lanl/lm_feats/和test.log实则就是上面说的需要我们给出的两个参数,一个是特征值所在文件目录,一个是日志文件。
# # ============================================================================
# # ================== SIMPLE LSTM =============================================
# # ============================================================================
with open(args.logfile, 'a') as log:
log.write('simple word forward lstm\n\n\n')
print('simple word forward lstm\n\n\n')
ok = os.system('python %s/simple_lm.py ./ %s/lm/lanl_word_config.json %sword_day_split/ -encoding word -skipsos -test -delimiter , 2>> %s' % (modelpath, specpath, args.datapath, args.logfile))
num_finished += ok == 0
all_okay += ok != 0