ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机 [打印本页]

作者: 老婆出轨    时间: 2024-6-15 01:48
标题: 【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机
【深度学习】用神经网络进行入侵检测,NSL-KDD数据集,用网络连接特征判定是否是网络入侵。
下载数据集NSL-KDD

NSL-KDD数据集,有dos,u2r,r21,probe等类型的攻击,和普通的正常的流量,便是有五个类别:
1、Normal:正常记录
2、DOS:拒绝服务攻击
3、PROBE:监督和其他探测运动
4、R2L:来自长途机器的非法访问
5、U2R:普通用户对当地超级用户特权的非法访问
数据集样子如下,一行就是一个样本。一个样本有41个特征和一个类别标签。

数据集介绍

https://towardsdatascience.com/a-deeper-dive-into-the-nsl-kdd-data-set-15c753364657
https://mathpretty.com/10244.html
输入的41个特征介绍

下面是对网络连接的41个特征的介绍:
特征编号特征名称特征描述类型范围1duration连接连续时间,从TCP连接建立到结束的时间,或每个UDP数据包的连接时间一连[0, 58329]秒2protocol_type协议类型,可能值为TCP, UDP, ICMP离散-3service目的主机的网络服务类型,共70种可能值离散-4flag连接状态,11种可能值,表示连接是否按照协议要求开始或完成离散-5src_bytes从源主机到目的主机的数据的字节数一连[0, 1379963888]6dst_bytes从目的主机到源主机的数据的字节数一连[0, 1309937401]7land若连接来自/送达同一个主机/端口则为1,否则为0离散0或18wrong_fragment错误分段的数量一连[0, 3]9urgent加急包的个数一连[0, 14]10hot访问系统敏感文件和目录的次数一连[0, 101]11num_failed_logins登录尝试失败的次数一连[0, 5]12logged_in成功登录则为1,否则为0离散0或113num_compromisedcompromised条件出现的次数一连[0, 7479]14root_shell若获得root shell 则为1,否则为0离散0或115su_attempted若出现"su root" 命令则为1,否则为0离散0或116num_rootroot用户访问次数一连[0, 7468]17num_file_creations文件创建操纵的次数一连[0, 100]18num_shells使用shell命令的次数一连[0, 5]19num_access_files访问控制文件的次数一连[0, 9]20num_outbound_cmds一个FTP会话中出站连接的次数一连021is_hot_login登录是否属于“hot”列表,是为1,否则为0离散0或122is_guest_login如果guest登录则为1,否则为0离散0或123count过去两秒内,与当前连接具有相同的目的主机的连接数一连[0, 511]24srv_count过去两秒内,与当前连接具有相同服务的连接数一连[0, 511]25serror_rate过去两秒内,在与当前连接具有相同目的主机的连接中,出现“SYN”错误的连接的百分比一连[0.00, 1.00]26srv_serror_rate过去两秒内,在与当前连接具有相同服务的连接中,出现“SYN”错误的连接的百分比一连[0.00, 1.00]27rerror_rate过去两秒内,在与当前连接具有相同目的主机的连接中,出现“REJ”错误的连接的百分比一连[0.00, 1.00]28srv_rerror_rate过去两秒内,在与当前连接具有相同服务的连接中,出现“REJ”错误的连接的百分比一连[0.00, 1.00]29same_srv_rate过去两秒内,在与当前连接具有相同目的主机的连接中,与当前连接具有相同服务的连接的百分比一连[0.00, 1.00]30diff_srv_rate过去两秒内,在与当前连接具有相同目的主机的连接中,与当前连接具有不同服务的连接的百分比一连[0.00, 1.00]31srv_diff_host_rate过去两秒内,在与当前连接具有相同服务的连接中,与当前连接具有不同目的主机的连接的百分比一连[0.00, 1.00]32dst_host_count前100个连接中,与当前连接具有相同目的主机的连接数一连[0, 255]33dst_host_srv_count前100个连接中,与当前连接具有相同目的主机相同服务的连接数一连[0, 255]34dst_host_same_srv_rate前100个连接中,与当前连接具有相同目的主机相同服务的连接所占的百分比一连[0.00, 1.00]35dst_host_diff_srv_rate前100个连接中,与当前连接具有相同目的主机不同服务的连接所占的百分比一连[0.00, 1.00]36dst_host_same_src_port_rate前100个连接中,与当前连接具有相同目的主机相同源端口的连接所占的百分比一连[0.00, 1.00]37dst_host_srv_diff_host_rate前100个连接中,与当前连接具有相同目的主机相同服务的连接中,与当前连接具有不同源主机的连接所占的百分比一连[0.00, 1.00]38dst_host_serror_rate前100个连接中,与当前连接具有相同目的主机的连接中,出现SYN错误的连接所占的百分比一连[0.00, 1.00]39dst_host_srv_serror_rate前100个连接中,与当前连接具有相同目的主机相同服务的连接中,出现SYN错误的连接所占的百分比一连[0.00, 1.00]40dst_host_rerror_rate前100个连接中,与当前连接具有相同目的主机的连接中,出现REJ错误的连接所占的百分比一连[0.00, 1.00]41dst_host_srv_rerror_rate前100个连接中,与当前连接具有相同目的主机相同服务的连接中,出现REJ错误的连接所占的百分比一连[0.00, 1.00] 这个表格提供了关于网络连接的41个特征的详细介绍,包括特征编号、特征名称、特征描述、类型以及范围。
输出的五个类别

数据集是一个csv表格,倒数第二列就是类别标签,类别是五个,但是csv表格里分得很细。
  1. ['normal', 'dos', 'probe', 'r2l', 'u2r']
复制代码
但csv里写的详细的标签如下图,比如Dos攻击往细了分,还有back、neptune之类的,但我们只关心五个大类别。

可以通过这个步伐转换,比如[‘back’, ‘land’, ‘neptune’, ‘pod’, ‘smurf’, ‘teardrop’, ‘processtable’, ‘udpstorm’, ‘mailbomb’, ‘apache2’]都是Dos攻击类别。
  1. # 结果标签转换为数字
  2. dos_type = ['back', 'land', 'neptune', 'pod', 'smurf', 'teardrop', 'processtable', 'udpstorm', 'mailbomb',
  3.             'apache2']
  4. probing_type = ['ipsweep', 'mscan', 'nmap', 'portsweep', 'saint', 'satan']
  5. r2l_type = ['ftp_write', 'guess_passwd', 'imap', 'multihop', 'phf', 'warezmaster', 'warezclient', 'spy', 'sendmail',
  6.             'xlock', 'snmpguess', 'named', 'xsnoop', 'snmpgetattack', 'worm']
  7. u2r_type = ['buffer_overflow', 'loadmodule', 'perl', 'rootkit', 'xterm', 'ps', 'httptunnel', 'sqlattack']
  8. type2id = {'normal': 0}
  9. for i in dos_type:
  10.     type2id[i] = 1
  11. for i in r2l_type:
  12.     type2id[i] = 2
  13. for i in u2r_type:
  14.     type2id[i] = 3
  15. for i in probing_type:
  16.     type2id[i] = 4
复制代码
数据处理&&练习本领

数据预处理
讨论原始网络数据面临的寻衅:高维度、类别特征和一连特征。
使用的技能:
对类别数据(协议类型、服务和标记)进行独热编码。
标准化一连特征以处理不同的尺度。
如何处理缺失数据(如果有),通过插值或删除。
使用StandardScaler和pickle保存缩放参数以保持一致的预处理。
处理不平衡数据
讨论入侵检测数据集中的不平衡问题。
介绍ImbalancedDatasetSampler的使用及其如何帮助实现平衡的小批量。
使用此类采样器对深度学习模子练习的利益。
模子架构
权重初始化技能,如Xavier和Kaiming初始化。
使用Dropout和Batch Normalization防止过拟合。
练习本领
使用CosineAnnealingLR进行学习率调度,以适应性地调整学习率。
选择Adam优化器而非传统的SGD的缘故原由。
丧失函数的选择及其对模子练习的影响。
实验设置
数据加载器和批处理过程的描述。
利用GPU进行高效模子练习。
在练习过程中评估模子准确性和丧失的过程。
建神经网络,输入41个特征,输出是那种类别的攻击

神经网络模子1,这是个全连接神经网络,练习完后效果不错:
  1. class FullyConnectedNet(nn.Module):
  2.     def __init__(self, input_size=122, num_classes=5):
  3.         super(FullyConnectedNet, self).__init__()
  4.         self.fc1 = nn.Linear(input_size, 512)  # 第一层全连接层
  5.         self.fc2 = nn.Linear(512, 1024)  # 第二层全连接层
  6.         self.fc3 = nn.Linear(1024, 512)  # 第三层全连接层
  7.         self.fc3_1 = nn.Linear(512, 128)  # 第三层全连接层
  8.         # self.fc3_2 = nn.Linear(512, 128)  # 第三层全连接层
  9.         self.fc4 = nn.Linear(128, num_classes)  # 输出层
  10.         self.relu = nn.ReLU()
  11.         self.dropout = nn.Dropout(0.2)
  12.     def forward(self, x):
  13.         x = self.relu(self.fc1(x))
  14.         # x = self.dropout(x)
  15.         x = self.relu(self.fc2(x))
  16.         # x = self.dropout(x)
  17.         x = self.relu(self.fc3(x))
  18.         # x = self.dropout(x)
  19.         x = self.relu(self.fc3_1(x))
  20.         # x = self.dropout(x)
  21.         # x = self.relu(self.fc3_2(x))
  22.         x = self.fc4(x)
  23.         return x
  24.     # 初始化权重
  25.     def init_weights(self):
  26.         for m in self.modules():
  27.             if type(m) == nn.Linear:
  28.                 init.xavier_normal_(m.weight)
  29.                 init.constant_(m.bias, 0)
复制代码
为了写论文,当然可以造一些别的网络,效果也差不多,看你想怎么写就怎么写,比如下面这个模子:
  1. class BGRUNet2(nn.Module):
  2.     def __init__(self, input_size, hidden_size, output_size):
  3.         super(BGRUNet2, self).__init__()
  4.         self.hidden_size = hidden_size
  5.         self.gru = nn.GRU(input_size, hidden_size, batch_first=True, bidirectional=True)
  6.         self.fc1 = nn.Linear(hidden_size * 2, 512)  # Multiply hidden size by 2 for bidirectional
  7.         self.fc2 = nn.Linear(512, 64)
  8.         self.fc3 = nn.Linear(64, output_size)
  9.         self.dropout = nn.Dropout(0.2)
  10.         # Initialize GRU weights
  11.         for name, param in self.gru.named_parameters():
  12.             if 'weight_ih' in name:
  13.                 init.xavier_uniform_(param.data)
  14.             elif 'weight_hh' in name:
  15.                 init.orthogonal_(param.data)
  16.             elif 'bias' in name:
  17.                 param.data.fill_(0)
  18.         # Initialize fully connected layer weights
  19.         init.xavier_uniform_(self.fc1.weight)
  20.         init.xavier_uniform_(self.fc2.weight)
  21.         init.xavier_uniform_(self.fc3.weight)
  22.         # Initialize fully connected layer biases
  23.         init.zeros_(self.fc1.bias)
  24.         init.zeros_(self.fc2.bias)
  25.         init.zeros_(self.fc3.bias)
  26.     def forward(self, x):
  27.         # Initialize hidden state for bidirectional GRU
  28.         h0 = torch.zeros(2, x.size(0), self.hidden_size).to(x.device)  # 2 for bidirectional
  29.         # Forward pass through GRU
  30.         out, _ = self.gru(x, h0)
  31.         # Concatenate the hidden states from both directions
  32.         out = torch.cat((out[:, -1, :self.hidden_size], out[:, 0, self.hidden_size:]), dim=1)
  33.         out = self.dropout(out)
  34.         out = F.relu(self.fc1(out))
  35.         out = self.dropout(out)
  36.         out = F.relu(self.fc2(out))
  37.         out = self.dropout(out)
  38.         return self.fc3(out)
复制代码
模子练习

练习30轮,准确度最高97.39%:

随着练习轮数的变化,丧失的变化:

模子推理

加载模子后,构建输入数据,模子推导得出结果:
  1. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  2. model = BGRUNet2(input_size=122, hidden_size=256, output_size=5)
  3. model.load_state_dict(torch.load('model_accuracy_max.pth', map_location=device))
  4. model.to(device)
  5. model.eval()
  6. time1 = time.time()
  7. with torch.no_grad():
  8.     X = X.to(device)
  9.     outputs = model(X)
  10.     # softmax
  11.     outputs = F.softmax(outputs, dim=1)
  12.     _, predicted = torch.max(outputs.data, 1)
  13.     time2 = time.time()
复制代码
写gradio前端界面,用户本身输入41个特征,后端用模子推理计算后显示出是否是dos攻击

安装环境(仅仅第一次需要安装):
  1. pip install matplotlib torch torchvision gradio pandas scipy torchsampler scikit-learn==1.3.1
复制代码
运行代码 python app.py 后访问:http://127.0.0.1:7861/
可以看到:

填写特征太多,有点懒得填,可以拉到最底下,有例子,可以点一下例子数据:

然后点一下提交,模子推理后给出结果,可以看到,模子以为这次连接数据表明了这是Doc入侵攻击,概率是1,模子推理斲丧了0.01毫秒。

使用方法:


实行python train.py。即可开启练习。
实行python app.py。即可开启gradio前端界面。
获取代码和模子

go:
  1. https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4