设计一个基于联邦学习的入侵检测系统,结合使用 NSL-KDD 数据集,并应用 联邦学习(Federated Learning)框架来构建模型。联邦学习是一种去中心化的机器学习方式,能够在多方数据之间进行训练,而无需将数据集中存储和共享。

项目概述

项目名称:基于联邦学习的入侵检测系统

目标:通过联邦学习对NSL-KDD数据集进行训练,检测网络入侵。

技术栈:

  • 编程语言:Python 3.x
  • 联邦学习框架:PySyft(基于PyTorch)
  • 深度学习框架:PyTorch
  • 数据集:NSL-KDD
  • 模型:神经网络模型(MLP)

项目结构

federated_intrusion_detection/
├── app.py                  # 联邦学习主程序
├── dataset.py              # 数据集加载与预处理
├── model.py                # 神经网络模型
├── train.py                # 联邦学习训练脚本
├── requirements.txt        # 项目依赖
├── config.py               # 配置文件
├── results/                # 存储训练结果
├── templates/              # Web模板文件
│   └── index.html          # 训练结果展示
└── static/                 # 静态文件(CSS、JS等)

1. requirements.txt 文件

Flask==2.2.5
torch==1.13.1
torchvision==0.14.1
pySyft==0.6.0
scikit-learn==1.0.2
pandas==1.4.2
numpy==1.21.4
requests==2.26.0

2. config.py 文件

配置文件,包含联邦学习的参数、数据集路径等。

import os

# 配置路径
DATASET_PATH = os.path.join(os.getcwd(), 'NSL-KDD')

# 联邦学习参数
BATCH_SIZE = 32
EPOCHS = 5
LEARNING_RATE = 1e-4
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
MODEL_SAVE_PATH = os.path.join(os.getcwd(), 'model.pth')

3. dataset.py 文件

加载和预处理 NSL-KDD 数据集。NSL-KDD数据集用于入侵检测系统的训练,包含正常流量和不同类型的网络攻击。

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np

class NslKddDataset(Dataset):
    def __init__(self, file_path):
        data = pd.read_csv(file_path)
        self.X = data.iloc[:, :-1].values  # 特征列
        self.y = data.iloc[:, -1].values  # 标签列

        # 转换标签为整数
        le = LabelEncoder()
        self.y = le.fit_transform(self.y)

        # 转换为PyTorch张量
        self.X = torch.tensor(self.X, dtype=torch.float32)
        self.y = torch.tensor(self.y, dtype=torch.long)

    def __len__(self):
        return len(self.X)

    def __getitem__(self, idx):
        return self.X[idx], self.y[idx]

def get_data_loaders(file_path, batch_size=32):
    dataset = NslKddDataset(file_path)
    train_data, val_data = train_test_split(dataset, test_size=0.2, random_state=42)

    train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
    val_loader = DataLoader(val_data, batch_size=batch_size, shuffle=False)

    return train_loader, val_loader
  • NslKddDataset:加载和预处理NSL-KDD数据集,将特征和标签转换为PyTorch张量。
  • get_data_loaders:将数据集分为训练集和验证集,并返回DataLoader。

4. model.py 文件

构建神经网络模型(MLP)。这是一个用于分类任务的简单神经网络。

import torch
import torch.nn as nn

class MLPModel(nn.Module):
    def __init__(self, input_size, hidden_size=64, output_size=2):
        super(MLPModel, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, hidden_size)
        self.fc3 = nn.Linear(hidden_size, output_size)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.fc3(x)
        return x
  • MLPModel:一个简单的多层感知机(MLP)模型,适用于入侵检测任务。

5. train.py 文件

在本地训练每个客户端的模型,并通过联邦学习汇总权重。

import torch
from torch import nn, optim
from model import MLPModel
from dataset import get_data_loaders
import syft as sy
from config import DEVICE, BATCH_SIZE, EPOCHS, LEARNING_RATE

def train_federated_model():
    # 初始化联邦学习的虚拟工作者
    hook = sy.TorchHook(torch)
    workers = [sy.VirtualWorker(hook, id=f"worker_{i}") for i in range(3)]  # 模拟三个客户端

    # 加载数据
    train_loader, val_loader = get_data_loaders('NSL-KDD/KDDTrain+.csv', BATCH_SIZE)

    # 构建模型
    input_size = train_loader.dataset.X.shape[1]
    model = MLPModel(input_size).to(DEVICE)
    
    # 模拟将模型分发到各个工作节点
    model.send(workers[0])

    # 定义优化器和损失函数
    optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
    criterion = nn.CrossEntropyLoss()

    for epoch in range(EPOCHS):
        model.train()
        for data, target in train_loader:
            data, target = data.to(DEVICE), target.to(DEVICE)

            # 将数据发送到worker
            data = data.send(workers[0])
            target = target.send(workers[0])

            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()

        print(f"Epoch {epoch+1}/{EPOCHS} finished.")

    # 通过联邦平均聚合模型参数
    model.get()  # 拉取模型到主服务器

    # 保存训练后的模型
    torch.save(model.state_dict(), 'model.pth')

if __name__ == '__main__':
    train_federated_model()
  • train_federated_model:该函数模拟了一个包含多个客户端的联邦学习系统。每个客户端会在本地进行训练,并使用联邦平均(Federated Averaging)聚合模型权重。

6. app.py 文件

Flask应用程序,展示训练结果。

from flask import Flask, render_template, request
import torch
from model import MLPModel
from config import DEVICE

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/predict', methods=['POST'])
def predict():
    # 输入特征
    url = request.form['url']
    
    # 模拟URL转换为特征(此处需根据实际情况调整)
    features = [len(url), url.count('.'), url.count('/')]  # 简单特征提取
    
    # 加载模型
    model = MLPModel(input_size=3)
    model.load_state_dict(torch.load('model.pth'))
    model.eval()
    
    # 预测
    features = torch.tensor(features, dtype=torch.float32).unsqueeze(0).to(DEVICE)
    output = model(features)
    _, predicted = torch.max(output, 1)
    
    # 返回预测结果
    result = 'Normal' if predicted.item() == 0 else 'Phishing'
    return render_template('result.html', result=result)

if __name__ == '__main__':
    app.run(debug=True)
  • Flask Web服务:提供一个简单的Web界面,用户可以输入URL并显示预测结果。

7. templates/index.html

用户输入URL进行预测。

<!DOCTYPE html>
<html>
<head><title>Federated Intrusion Detection</title></head>
<body>
    <h1>Federated Intrusion Detection System</h1>
    <form action="/predict" method="POST">
        Enter URL: <input type="text" name="url">
        <input type="submit" value="Predict">
    </form>
</body>
</html>

8. templates/result.html

显示预测结果。

<!DOCTYPE html>
<html>
<head><title>Prediction Result</title></head>
<body>
    <h1>Prediction Result</h1>
    <h2>{{ result }}</h2>
    <a href="/">Try another URL</a>
</body>
</html>

如何运行

  1. 安装依赖:
pip install -r requirements.txt
  1. 训练模型: 运行 train.py 脚本,进行模型训练。
python train.py
  1. 启动Flask应用:
python app.py
  1. 访问Web界面: 打开浏览器,访问 http://127.0.0.1:5000/,输入URL并查看预测结果。

总结

这是一种使用 联邦学习 来训练入侵检测模型的方法。通过使用 NSL-KDD 数据集训练模型,模拟多个客户端的训练过程,并将各自的模型更新通过联邦平均进行聚合。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐