ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于KDD99数据集的神经网络入侵检测与特征分析

基于KDD99数据集的神经网络入侵检测与特征分析 简介这份基于机器学习的网络入侵检测方法PDF是一篇来自《湖南工业职业技术学院学报》的学术文献面向网络安全研究者、高校师生及机器学习入门者重点探讨如何利用机器学习算法识别和应对日益复杂的网络入侵攻击。资源仅包含1个PDF文档压缩包大小约1.55MB内容精炼且可直接阅读适合作为毕业设计、课程论文或课题研究的参考文献。文中以KDD99数据集为例系统介绍了网络入侵者的三类类型、四种攻击类别DoS、R2L、U2R、Probing并详细展示了决策树、SVM、神经网络等常用算法在异常流量识别中的建模思路同时讨论了访问控制机制与机器学习结合的防护策略。通过交叉验证和精确率、召回率等指标验证了方法的有效性。该文献能为读者快速搭建入侵检测知识框架提供帮助已有285人学习/下载适合需要专业指导或学术参考的读者下载收藏。1. 从一次误用检测出发为什么规则签名挡不住攻击2019 年前后的网络攻击已经不只是简单的端口扫描和暴力破密攻击者会伪装成合法用户、滥用授权、甚至拿到超级控制权限。贝尔实验室 1992 年的统计里计算机综合体每隔一天就会遭遇一次密码文件复制尝试远程过程调用请求和伪 IP 扫描几乎每周都在发生。如果靠人工看日志或用固定签名去匹配这些行为很快就会被变种攻击绕过去因为攻击者只要稍微修改载荷或顺序原来的规则就失效了。基于机器学习的入侵检测思路是把“攻击签名”的学习过程交给算法。以 KDD99 数据集为训练雏形让模型自己从 41 维连接特征里找规律从而识别 DoS、R2L、U2R 和探测这四类攻击。这对安全工程师和算法工程师都有用前者能快速建立一套可验证的检测基线后者能直接在标准数据集上比较不同模型的性能。下面就从数据集的形成和特征结构说起。2. KDD99 数据集与四类攻击样本结构特征怎么用2.1 KDD99 的来源1998 年 DARPA 模拟网络流量KDD99 是 1998 年 DARPA 入侵检测评估计划的产物。当时在模拟网络中搭建了三台不同操作系统和服务的目标机器同时用另外三台机器生成不同伪 IP 地址来制造多余流量再通过嗅探器记录网络流量。实验持续了七周正常连接被描述为属性与理想网络期望值匹配的连接其他连接全部属于攻击类别并细分为四类。此后 KDD99 数据集又派生出三种形式10% KDD、修正 KDD 和完整 KDD。10% KDD 适合快速模拟修正 KDD 是所有版本里最短的一种而完整 KDD 才是研究和部署验证时最常用的版本。无论哪个版本每一条连接记录都有 41 个字段外加一个标签字段用于标记是正常流量还是某类攻击。2.2 41 维特征里到底有什么41 个字段并非全部数值型它们大致可以分成四组基本 TCP 连接特征、连接内容特征、基于时间的流量统计特征以及基于主机的流量统计特征。基本特征包括协议类型、服务类型、源字节数、目的字节数等内容特征来自连接中承载的数据内容比如文件创建次数和登录失败次数基于时间的特征统计过去两秒内与当前连接相同目标或相同服务的连接比例基于主机的特征类似但统计窗口扩大到过去 100 个连接。原文特别提到特征 5 源字节、特征 8 错误片段、特征 36 目的地主机名和源端口这些字段在不同攻击类别中分布差异很大是区分正常流量和攻击流量的关键。2.3 四类攻击的行为差异与典型签名KDD99 的标签不是细粒度攻击名而是先归成四大类。DoS 拒绝服务攻击通过大量请求耗尽目标资源典型签名有 back、land、neptune、smurf、teardropR2L 是远程到本地的未授权访问常见行为是远程猜解密码U2R 是授权用户通过缓冲区溢出等方式获得 root 超级权限探测攻击包括端口扫描和漏洞扫描常见签名有 satan、ipsweep、nmap、portsweep。四类攻击在样本数量和特征表现上差异极大DoS 通常伴随短时间内大量连接R2L 和 U2R 则可能只有零星几条记录但每条记录在内容特征上有显著异常。攻击类别行为特征典型签名示例DoS短时间内制造大量并发连接耗尽带宽或 CPUback、land、neptune、smurf、teardropR2L远程未授权访问试图猜测密码或利用应用漏洞猜测密码、远程利用U2R普通用户提升为 root常用缓冲区溢出buffer_overflow、rootkitProbe监视和扫描获取目标网络信息satan、ipsweep、nmap、portsweep2.4 为什么不直接用 CRAWDAD 或 CAIDA除了 KDD99还有 CRAWDAD 无线网络数据集和 CAIDA 因特网数据分析数据集。但前者主要聚焦无线网络场景后者更偏骨干网流量统计。KDD99 中攻击签名的密集程度和信息丰富度明显高于另外两者而且攻击类型覆盖广标签体系完全公开。新攻击签名往往是从现有签名演化而来的先用 KDD99 做签名分析再迁移到新数据集是很常见的研究路径。这也是原论文选择 KDD99 作为神经网络训练样本的根本原因。3. 基于神经网络的入侵检测实现数据分割、训练与测试3.1 用 separator.c 把训练集按攻击类型分割神经网络训练要求输入数据按照一定规则组织。原文里训练集是完整的 KDD99 数据直接丢给网络会导致同一批数据里正常样本远多于攻击样本模型很容易偏向多数类。separator.c 的作用就是把训练数据集切分成不同文件每个文件包含同一攻击类型的签名。输出文件命名规则为 COL_***.TXT其中的 *** 是攻击名称文件里保存的是与检测相关的列。这样做的好处是后续可以针对每一类攻击单独统计特征出现频率也能为不平衡处理做准备。如果不想依赖 C 程序用 Python 也能实现同样的分割逻辑import pandas as pd # 加载KDD99原始训练集41列特征最后一列标签 file_path kddcup.data data pd.read_csv(file_path, headerNone, sep,) # 最后一列是攻击标签normal表示正常流量 data.columns [fcol_{i} for i in range(data.shape[1] - 1)] [label] # 按标签分割保存到不同文件 for label, group in data.groupby(label): group.to_csv(fCOL_{label}.TXT, indexFalse, headerFalse)这段代码先用 pandas 读入数据然后按标签分组写入独立文本文件。分割后的文件可以直接用于统计每种攻击的属性出现频率也可以作为后续模型训练的类别子集。实际操作中会遇到一个问题有些标签在训练集里只出现几十次甚至几次分割后单文件过小模型容易过拟合。常见做法是先把数量少于某个阈值的标签合并为 other 类再做分割。3.2 将符号特征转为数值编码KDD99 的 41 个字段里有几个字符型字段比如协议类型、服务类型、TCP 状态标志。神经网络只接受数值输入所以必须先把这些符号字段转成数值。常见做法是标签编码或独热编码。协议类型字段可选值只有三种服务类型却有几十种独热编码会让特征维度暴增训练速度变慢。更常用的是标签编码把每种字符串映射成一个整数。from sklearn.preprocessing import LabelEncoder categorical_columns [protocol_type, service, flag] for col in categorical_columns: le LabelEncoder() data[col] le.fit_transform(data[col].astype(str))这里对三个符号列分别做标签编码。需要注意测试数据里可能出现训练数据中没见过的服务类型直接调用 transform 会报错。稳妥的做法是先用 fit_transform 在训练集上学习映射再对测试集单独 transform如果遇到未知类别就统一映射到一个默认值。标签编码会把类别间的距离含义强加给模型但为了方便 KDD99 上的快速实验这种近似在大多数场景下是够用的。3.3 MLP 模型结构与训练参数原论文使用了人工神经网络对应的训练代码是 MLPApproximation.C训练结束后把网络权值保存在工作目录的文本文件里。用 sklearn 实现等价的多层感知机只需要几行代码但参数设置需要认真调整。from sklearn.preprocessing import StandardScaler from sklearn.neural_network import MLPClassifier # 分离特征和标签 y data[label] X data.drop(columns[label]) # 数值特征标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 多层感知机分类器 mlp MLPClassifier( hidden_layer_sizes(64, 32), activationrelu, solveradam, alpha0.0001, batch_sizeauto, learning_rate_init0.001, max_iter50, random_state42 ) mlp.fit(X_scaled, y)hidden_layer_sizes 设置为 (64, 32)表示输入层后先经过 64 个神经元的隐藏层再经过 32 个神经元的隐藏层最后输出到类别层。relu 激活函数能缓解梯度消失adam 优化器在大多数流量特征上比 sgd 收敛更快。alpha 是 L2 正则化系数用来抑制过拟合。max_iter 设置为 50KDD99 完整数据集上迭代次数太多反而会导致训练时间过长同时又容易过拟合到噪声。标准化这一步不能省因为源字节数、目的字节数等字段量级可能相差上万倍不标准化会让高量级特征主导梯度更新。3.4 测试与结果输出训练结束后需要用测试数据集验证性能。原论文提到测试结果会自动保存到 MLP-MapProcessing.c 工作目录的文本文件里。真实部署时更关心的是模型对每个连接的预测标签和概率。import numpy as np # 假设X_test_scaled已经过同一scaler转换 predictions mlp.predict(X_test_scaled) probabilities mlp.predict_proba(X_test_scaled) # 输出前10行结果 for i in range(10): print(f判定: {predictions[i]}, 置信度: {np.max(probabilities[i]):.4f})predict_proba 返回每个类别的概率矩阵取最大值作为置信度。实际使用时可以把这些结果追加到告警日志中供安全运营人员二次研判。需要注意KDD99 测试集与训练集存在同类攻击的不同变种如果模型在测试集上表现尚可说明它学到的是攻击类别层面的共同特征而不是死记硬背签名。4. 特征相关性与属性选择找出能区分攻击的关键字段4.1 属性出现频率与相关性的关系KDD99 的每个连接记录都有 41 个字段但对特定攻击类型来说只有一部分字段真正相关。原论文的思路是统计给定攻击类型下每个属性出现的频率再结合该分组出现的概率判断该属性是否对检测有贡献。比如 smurf 攻击会产生大量目的地址相同但源地址被伪造的小报文那么“过去两秒内与当前连接相同目的地址的连接数”就会非常突出而源字节数可能变化不大。如果一个属性在正常流量中出现的频率和在攻击流量中的频率差异足够大这个属性就可以作为区分信号。表 3 给出了 normal 分组中每个属性的出现频率表 4 进一步汇总了最相关类的特性列表。虽然原论文没有把完整的表 4 展开但根据 KDD99 的通用分析结论最常被选中的特征集中在服务类型、源字节、目标主机同源连接数、错误片段比例这几类。特征筛选的意义不只是减少计算量更能提升模型稳定性冗余特征会把神经网络的注意力分散到无关噪声上导致训练集准确率高而测试集准确率骤降。4.2 用卡方检验和信息增益做特征筛选在 Python 中做特征筛选最直接的方案是卡方检验或互信息法。卡方检验适合特征与标签都是离散值的情况KDD99 标签是攻击类别因此需要把连续特征离散化或者改用信息增益。sklearn 的 SelectKBest 配合 chi2 是常见做法但要求输入特征非负。标准化后的数据存在负值需要先做 min-max 缩放或直接使用原始非负特征。from sklearn.feature_selection import SelectKBest, chi2 from sklearn.preprocessing import MinMaxScaler # 仅使用非负缩放到[0,1]区间 scaler MinMaxScaler() X_minmax scaler.fit_transform(X) # 选择与标签最相关的10个特征 selector SelectKBest(chi2, k10) X_selected selector.fit_transform(X_minmax, y) # 返回被选中的特征索引 selected_indices selector.get_support(indicesTrue) print(选中的特征编号:, selected_indices)这里把原始特征缩放到 [0,1] 区间再用卡方检验评估每个特征与标签的独立性。chi2 分数越高说明特征与攻击类别的相关性越强。k10 表示只保留 10 个特征实际使用中可以根据分数排序调整阈值。需要注意的是卡方检验对低频攻击类型不敏感因为 R2L 和 U2R 的样本量远小于 DoS哪怕某些字段对它们有强区分性卡方分数也会被 DoS 的高频特征淹没。4.3 针对不平衡特征的补充手段更稳健的筛选方式是同时使用信息增益和分类器自身的特征重要性。随机森林或梯度提升树可以直接输出 feature_importances_这些值基于分裂时的不纯度下降天然能处理连续特征和高基数符号特征。对 KDD99 这种四类样本极不均衡的数据集用树模型筛完特征后再输入给 MLP 训练往往比直接对 41 维特征训练效果更稳定。这也是很多实战项目的标准路径先用树模型找出 top 10 到 top 20 特征再用神经网络做最终分类。5. KDD99 之外的验证技巧评估指标与隐形攻击边界5.1 混淆矩阵比准确率更能说明问题KDD99 中 DoS 样本量占比极大一个把所有连接都判定为 DoS 的模型也能拿到很高的准确率。评估入侵检测模型时需要看每个攻击类别的精确率、召回率和 F1 分数。原文指出针对某些经过 Fragrouter 修改的隐形攻击最好的网络入侵检测系统检测率也只有 11%每天少于 10 个错误警报。这类攻击能绕过检测算法是因为它们把攻击流量拆散或伪装成正常连接模式使得统计特征不再显著。此时用混淆矩阵能清楚看到模型把哪个类别的样本错分到了哪个其他类别从而定位检测盲区。5.2 用采样与类别权重缓解样本不均衡R2L 和 U2R 在 KDD99 中样本极少直接训练会让神经网络几乎放弃这两个类别。常见做法是在训练前对少数类做 SMOTE 过采样或者给模型传入 class_weight 参数。mlp MLPClassifier( hidden_layer_sizes(64, 32), max_iter50, class_weightbalanced, random_state42 )class_weightbalanced 会让 sklearn 根据样本量自动给少数类更高权重。代价是少数类被放大后模型可能对正常流量产生更多误报因此需要结合验证集上的精确率与召回率曲线选择阈值。另一种做法是只对 R2L 和 U2R 单独训练一个二分类器再用第一层四分类器做粗筛这样不会干扰 DoS 和 Probe 的主分类结果。5.3 把审计日志与预测结果关联起来验证网络侧检测与主机侧审计日志互补。KDD99 中的特征大多来自网络连接审计日志则记录文件访问、进程调用和用户权限变化。实际操作中先把模型预测为攻击的连接按源 IP、目的 IP、时间窗口排序再与主机审计日志中的用户登录记录和特权命令调用记录做关联。如果一条连接被判定为 R2L且同一时间窗口内有多次失败登录那么这条告警的可信度就大大提升。手工验证每个攻击非常耗时自动验证脚本应该遍历 KDD99 的 41 个字段把每个字段与正常基线做偏差比较并将偏差过大的字段输出到告警详情里。这样既能看到模型结论也能回溯到具体特征证据后续调参时就能直接定位到是哪个维度出了问题。本文还有配套的精品资源点击获取
返回列表