【异常检测】基于常用数据集LANL和CERT的异常检测源代码(https://github.com/pnnl/safekit)解读
写在前面
最近在做一个异常检测项目,采用LANL数据集进行实践,找到了一份基于LANL数据集和CERT数据集的异常检测实践源码。花了一些时间研究源代码,这里把研究的结果记录下来。
源代码
使用的源代码链接为:https://github.com/pnnl/safekit。基于这篇源代码有两篇异常检测论文,如果有兴趣的也可以去下载阅读。一篇是Recurrent Neural Network Language Models for Open Vocabulary Event-Level Cyber Anomaly Detection,另一篇是Deep Learning for Unsupervised Insider Threat Detection in Structured Cybersecurity Data Streams。
代码结构
代码结构如下:
|—data_examples 存放原始LANL和CERT数据集处理后得到的特征值数据
|—cert 存放cert处理后得到的特征
|—lanl 存放lanl处理后得到的特征
|—agg_feats 应该是对应DNN模型的特征
|—lm_feats 应该是对应LSTM模型的特征
|—docs 这部分目前还没看
|—examples 存放了几个DNN和LSTM的实践ipynb代码
|—dnn_agg.ipynb 基于LANL的DNN实践代码
|—LANL_LM_data.ipynb 对于LANL原始数据集的数据处理
|—simple_lm.ipynb 基于LANL的LSTM实践代码
|—safekit 存放特征提取,模型的代码等
|—features 对于两个数据集的特征提取代码
|—models 原始的dnn,孤立森林等算法的模型实现代码
|—test 基于两个数据集的LSTM和DNN实践测试代码
|—agg_test.py DNN实践代码
|—lanl_lm_tests.py LSTM实践代码
|—setup.py 用于配置代码环境,安装需要的包等
重要文件解读
examples文件夹
(1)dnn_agg.ipynb
首先是导入LANL数据集对应的特征json文件lanl_count_in_count_out_agg.json,然后得到事件计数特征值在特征向量中对应的起始位置index,用datastart_index表示。
dataspecs = json.load(open('../safekit/features/specs/agg/lanl_count_in_count_out_agg.json', 'r'))
datastart_index = dataspecs['counts']['index'][0]
- 1
- 2
我们来看一下lanl_count_in_count_out_agg.json文件中有些什么
num_features是特征向量的维度,也就是特征数目;time是发生的时间;user是用户标识,这里有30000个用户class类别;redteam是代表是否为redteam事件;counts中就是事件计数值。加起来就是137维的特征向量。
{
"num_features": 137,
"time": {
"index": [0],
"num_classes": 0,
"meta": 1,
"feature": 0,
"target": 0 },
"user": {
"index": [1],
"num_classes": 30000,
"meta": 1,
"feature": 0,
"target": 0 },
"redteam": {
"index": [2],
"num_classes": 0,
"meta": 1,
"feature": 0,
"target": 0 },
"counts": {
"index": [3,4,5,6,7,8,9,10,11,12,13,14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80