Adv-2005/ot-security-monitor

GitHub: Adv-2005/ot-security-monitor

AI辅助的OT安全监控系统,用于ICS的实时异常检测。

Stars: 0 | Forks: 1

# AI 辅助 OT 安全监控 运行工厂、水厂和能源电网的工业控制系统(ICS)是为了可靠性而设计的,而不是为了安全性。它们使用像 Modbus 和 DNP3 这样的旧协议,不进行身份验证,从未打算连接到 IP 网络。随着 IT-OT 集成的加速,这些系统越来越容易受到攻击——然而,为企业 IT 建设的大多数安全工具都对 OT 特定的行为视而不见。 该项目构建了一个轻量级、自包含的 OT 安全监控原型,该原型完全在本地 Ubuntu 机器(或在 Windows 上的 WSL-2)上运行。它使用 OpenPLC 和 Conpot 模拟真实的 ICS 环境,使用 Zeek 和其 ICS 分析器套件捕获 OT 网络流量,使用在公开可用的 ICS 数据集上训练的 Isolation Forest 和 One-Class SVM 对异常进行分类,并通过深色主题仪表板向操作员提供实时警报——所有这些都不需要向互联网发送任何数据包。 ## 目录 - [本项目做什么](#what-this-project-does) - [系统架构](#system-architecture) - [技术栈](#tech-stack) - [数据集详情](#dataset-details) - [ML 模型](#ml-models) - [项目结构](#project-structure) - [先决条件](#prerequisites) - [设置指南](#setup-guide) - [1. 克隆仓库](#1-clone-the-repository) - [2. 安装系统依赖项](#2-install-system-dependencies) - [3. 安装 OpenPLC](#3-install-openplc) - [4. 安装 Conpot](#4-install-conpot) - [5. 安装 Zeek 与 ICS 分析器](#5-install-zeek-with-ics-analyzers) - [6. Python 环境](#6-python-environment) - [7. 训练模型](#7-train-the-models) - [运行系统](#running-the-system) - [使用模拟攻击进行测试](#testing-with-simulated-attacks) - [仪表板操作](#dashboard-walkthrough) - [警报类型和严重性](#alert-types-and-severity) - [用真实数据集替换合成数据](#replacing-synthetic-data-with-real-datasets) - [已知限制](#known-limitations) - [参考文献](#references) ## 本项目做什么 该系统有三个层次同时工作: **模拟层** — OpenPLC 运行一个梯形逻辑程序,模拟一个水泵控制器,在端口 502 上公开一个真实的 Modbus TCP 服务器。Conpot 与其并行运行,作为 ICS 欺骗器,模拟额外的 SCADA 端点(Modbus、S7comm、BACnet、EtherNet/IP、DNP3、SNMP、FTP、TFTP),以吸引并记录攻击者的探测。 **检测层** — Zeek 被动地捕获主机接口上的所有网络流量,并使用 `icsnpp` 插件套件解析 OT 协议。Python 守护进程实时跟踪 Zeek 的 `conn.log`,提取流量特征,并并行运行两个 ML 模型:一个在过程级传感器行为(BATADAL 架构)上训练的 Isolation Forest 和一个在网络流量模式(TON_IoT 架构)上训练的 One-Class SVM。每个异常流量都写入 SQLite 数据库,带有严重性标签和异常分数。 **展示层** — FastAPI 后端通过 REST API 提供警报数据库。独立的 HTML/JS 仪表板每 5 秒轮询 API 一次,并渲染实时警报源、严重性分解饼图、警报类型条形图和活动端口排名——所有这些都针对在压力下需要阅读的操作员进行了样式设计。 ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ WSL-2 / Ubuntu │ │ │ │ ┌──────────────┐ Modbus TCP ┌──────────────────────────┐ │ │ │ OpenPLC │◄─────────────────►│ Network Layer │ │ │ │ Port 502 │ │ (any interface) │ │ │ │ PLC Sim │ └──────────┬───────────────┘ │ │ └──────────────┘ │ Passive Capture │ │ ▼ │ │ ┌──────────────┐ Modbus/S7/ ┌──────────────────────────┐ │ │ │ Conpot │ BACnet/DNP3 │ Zeek IDS │ │ │ │ Honeypot │◄─────────────────►│ + icsnpp-modbus │ │ │ │ Multi-port │ │ + icsnpp-dnp3 │ │ │ └──────────────┘ └──────────┬───────────────┘ │ │ │ conn.log │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ ML Detection Pipeline │ │ │ │ │ │ │ │ BATADAL Schema ──► Isolation Forest ──► Process Alerts │ │ │ │ TON_IoT Schema ──► One-Class SVM ──► Network Alerts │ │ │ │ │ │ │ │ │ SQLite alerts.db │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌───────────▼──────────────┐ │ │ │ FastAPI :8000 │ │ │ │ /api/alerts /api/stats │ │ │ └───────────┬──────────────┘ │ └─────────────────────────────────────────┼────────────────────────-─┘ │ HTTP ▼ ┌──────────────────────┐ │ Operator Dashboard │ │ (Windows Browser) │ │ │ │ • Live Alert Feed │ │ • Severity Chart │ │ • Alert Type Bars │ │ • Port Rankings │ └──────────────────────┘ ``` ### 数据流 ``` OpenPLC / Conpot │ OT protocol traffic (Modbus, DNP3, S7, BACnet) ▼ Zeek + icsnpp ←── passive tap on network interface │ conn.log modbus.log dnp3.log (TSV, tailed live) ▼ pipeline/zeek_parser.py ←── feature extraction per flow │ ├──► NetworkDetector (One-Class SVM) ← TON_IoT-trained │ │ score + severity │ └──► Force-flag OT port connections as ≥ LOW │ ▼ data/alerts.db (SQLite) │ api/main.py (FastAPI) │ /api/alerts /api/stats /health ▼ dashboard/index.html ← polls every 5 seconds ``` ## 技术栈 | 层 | 工具 | 目的 | |---|---|---| | PLC 模拟 | **OpenPLC v3** | 运行真实梯形逻辑,在端口 502 上公开 Modbus TCP | | ICS 欺骗器 | **Conpot 0.6** | 模拟 Modbus、S7、BACnet、DNP3、SNMP、FTP、TFTP | | 网络捕获 | **Zeek 6.x** | 使用 OT 协议剖析的被动流量分析 | | ICS 分析器 | **icsnpp 套件** | Zeek 插件用于 Modbus、DNP3、EtherNet/IP、BACnet | | 过程异常 | **Isolation Forest** (scikit-learn) | 检测传感器级别的偏差——BATADAL 架构 | | 网络异常 | **One-Class SVM** (scikit-learn) | 检测异常流量模式——TON_IoT 架构 | | 特征存储 | **SQLite** | 轻量级、零配置的警报和事件存储 | | API | **FastAPI + Uvicorn** | 提供警报和统计信息的 REST 后端 | | 仪表板 | **Vanilla HTML/CSS/JS + Chart.js** | 单文件操作员 UI,无需构建步骤 | | 语言 | **Python 3.10–3.12** | 检测管道、API、训练脚本 | | 环境 | **WSL-2 Ubuntu 22.04** (或原生 Ubuntu) | 主操作系统 | ## 数据集详情 该项目附带一个 **合成数据引导** (`bootstrap_train.py`),它生成与两个公开 ICS 研究数据集架构相匹配的逼真训练数据。您可以在任何时候替换真实数据集以提高模型精度——预处理脚本已包含在内。 ### BATADAL(攻击检测算法之战) - **来源**:[batadal.net/data.html](https://www.batadal.net/data.html) - **包含内容**:来自模拟水分配网络的 7 个月时间序列传感器读数——压力、流速、水箱水平和泵状态。包含 7 个标记的攻击场景(传感器篡改、执行器操纵、重放攻击)。 - **如何使用**:训练 Isolation Forest 过程级异常检测器。提取特征:原始传感器值、每个传感器的增量(变化率)以及每个传感器的 5 窗口滚动平均值和标准差。 - **引导架构**:7 个合成传感器通道,8,000 个正常样本 + 2,000 个攻击样本,包括压力峰值、流速下降、冻结读数和泵状态翻转。 ### TON_IoT 网络数据集 - **来源**:[research.unsw.edu.au/projects/toniot-datasets](https://research.unsw.edu.au/projects/toniot-datasets) - **包含内容**:涵盖 IoT 和 ICS 协议(Modbus、DNP3、MQTT、HTTP、DNS)的大规模网络流量数据集。标签包括正常、扫描、DoS、后门、注入、中间人攻击、勒索软件、XSS、密码攻击。 - **如何使用**:训练 One-Class SVM 网络级异常检测器。特征:流量持续时间、字节数、数据包数、丢失的字节、协议编码、连接状态编码。 - **引导架构**:8 特征流量向量,10,000 个正常样本 + 3,000 个攻击样本,涵盖扫描、DoS、注入、中间人攻击和后门类别。 ## ML 模型 ### Isolation Forest(过程级) Isolation Forest 是一种集成异常检测算法,通过随机划分特征来隔离观察值。异常需要更少的划分来隔离,并收到更高的异常分数。它非常适合多元传感器数据,其中正常行为形成一个稳定的集群,攻击导致突然的偏差。 - 仅在正常传感器读数上训练(无监督) - `contamination=0.05`(运行时预期 ~5% 的异常率) - `n_estimators=200` 以获得稳定的分数 - 在引导验证数据上达到 ~95% 的准确率 - 保存到:`models/isolation_forest.pkl` + `models/process_scaler.pkl` ### One-Class SVM(网络级) One-Class SVM 使用 RBF 核学习正常流量分布的边界。任何落在边界之外的流量都被标记为异常。它对于攻击空间未知且多样化的网络入侵检测非常有效。 - 仅在正常网络流量上训练(无监督) - `nu=0.05`、`kernel='rbf'`、`gamma='scale'` - 在引导验证数据上达到 ~96% 的准确率 - 保存到:`models/ocsvm.pkl` + `models/network_scaler.pkl` ### 严重性评分 两个检测器都产生一个连续的异常分数。严重性按以下方式划分: | 严重性 | 网络(OC-SVM 分数) | 过程(IF 分数) | |---|---|---| | 低 | < 0.20 | < 0.30 | | 中 | 0.20 – 0.40 | 0.30 – 0.50 | | 高 | 0.40 – 0.60 | 0.50 – 0.65 | | 严重 | ≥ 0.60 | ≥ 0.65 | ## 项目结构 ``` ot-security-monitor/ │ ├── bootstrap_train.py # Generate synthetic data + train both models │ ├── pipeline/ │ ├── __init__.py │ ├── detector.py # Isolation Forest + OC-SVM inference classes │ └── zeek_parser.py # Tail conn.log → extract features → write alerts │ ├── api/ │ └── main.py # FastAPI backend (/api/alerts /api/stats /health) │ ├── dashboard/ │ └── index.html # Single-file operator dashboard (no build step) │ ├── zeek_scripts/ │ └── ics_monitor.zeek # Custom Zeek script with ICS analyzers + OT tagging │ ├── models/ # Created by bootstrap_train.py │ ├── isolation_forest.pkl │ ├── ocsvm.pkl │ ├── process_scaler.pkl │ ├── network_scaler.pkl │ ├── process_feature_names.pkl │ └── network_feature_names.pkl │ ├── data/ # Created by bootstrap_train.py │ ├── batadal/ │ │ └── combined.parquet # Synthetic BATADAL-schema training data │ ├── toniot/ │ │ └── combined.parquet # Synthetic TON_IoT-schema training data │ └── alerts.db # SQLite — written by zeek_parser.py at runtime │ └── validation/ └── replay_batadal.py # Offline validation against labeled attack scenarios ``` ## 先决条件 | 要求 | 版本 | 备注 | |---|---|---| | Ubuntu | 22.04 LTS | 原生或 Windows 10/11 上的 WSL-2 | | Python | 3.10 – 3.12 | 系统 Python 或 pyenv | | Zeek | 6.x | 安装到 `/opt/zeek/` | | nmap | 7.x | 用于生成测试流量 | | Git | 任何 | 克隆仓库 | | 4 GB RAM | — | 最小;建议 8 GB | | WSL-2 网络 | — | 在 `.wslconfig` 中设置为 `networkingMode=mirrored` 以获得最佳结果 | ## 设置指南 ### 1. 克隆仓库 ``` git clone https://github.com//ot-security-monitor.git cd ot-security-monitor ``` ### 2. 安装系统依赖项 ``` sudo apt update && sudo apt upgrade -y sudo apt install -y \ git curl wget build-essential cmake \ python3-pip python3-venv \ libssl-dev libpcap-dev \ net-tools tcpdump nmap sqlite3 ``` ### 3. 安装 OpenPLC OpenPLC 模拟真实的 PLC 并在端口 502 上公开 Modbus TCP。 ``` git clone https://github.com/thiagoralves/OpenPLC_v3.git ~/OpenPLC_v3 cd ~/OpenPLC_v3 ./install.sh linux ``` 启动 OpenPLC: ``` cd ~/OpenPLC_v3 sudo ./start_openplc.sh ``` Web 界面可在 `http://localhost:8080` 上访问(凭据:`openplc` / `openplc`)。通过 Programs → Upload Program 上传梯形逻辑程序。运行时将在端口 502 上公开 Modbus TCP。 ### 4. 安装 Conpot Conpot 是一个 ICS 欺骗器,可以同时模拟多个 SCADA 协议。 ``` # Python 3.10 建议用于 Conpot 兼容性 python3.10 -m venv ~/.venvs/conpot310 source ~/.venvs/conpot310/bin/activate pip install conpot deactivate ``` 启动 Conpot(`-f` 标志使用测试配置,避免在低端口上需要 root 权限): ``` source ~/.venvs/conpot310/bin/activate conpot --template default -f ``` Conpot 将在这些端口上启动监听器(在测试模式下): - `5020/tcp` — Modbus TCP - `10201/tcp` — S7comm - `8800/tcp` — HTTP - `47808/udp` — BACnet - `2121/tcp` — FTP - `6969/udp` — TFTP ### 5. 安装 Zeek 与 ICS 分析器 ``` # 添加 Zeek 仓库 echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_22.04/ /' \ | sudo tee /etc/apt/sources.list.d/security:zeek.list curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_22.04/Release.key \ | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null sudo apt update sudo apt install -y zeek # 将 Zeek 添加到 PATH echo 'export PATH=/opt/zeek/bin:$PATH' >> ~/.bashrc source ~/.bashrc # 安装 ICS 分析器插件 zkg install icsnpp-modbus zkg install icsnpp-dnp3 zkg install icsnpp-enip ``` 将 Zeek 设置为将日志写入固定目录: ``` sudo mkdir -p /home/$USER/zeek-logs # 编辑 /opt/zeek/etc/zeekctl.cfg 并设置: # LogDir = /home/<你的用户名>/zeek-logs ``` ## Python 环境 ``` python3 -m venv ~/ot-security-env source ~/ot-security-env/bin/activate pip install \ pandas numpy scikit-learn joblib pyarrow \ fastapi uvicorn aiofiles ``` ## 训练模型 ``` source ~/ot-security-env/bin/activate cd ~/ot-security-monitor python bootstrap_train.py ``` 预期输出: ``` [1/4] Generating BATADAL-schema synthetic data … Normal: 8,000 | Attack: 2,000 [2/4] Generating TON_IoT-schema synthetic data … Normal: 10,000 | Attack: 3,000 [3/4] Training Isolation Forest (process anomaly) … Accuracy: ~95% [4/4] Training One-Class SVM (network anomaly) … Accuracy: ~96% ✓ Bootstrap training complete. All models saved to models/ ``` ## 运行系统 该系统需要同时运行五个终端会话。 ``` Terminal 1 — OpenPLC (PLC simulation) Terminal 2 — Conpot (ICS honeypot) Terminal 3 — Zeek (traffic capture) Terminal 4 — Parser (ML inference) Terminal 5 — API (FastAPI server) ``` ### 终端 1 — OpenPLC ``` cd ~/OpenPLC_v3 sudo ./start_openplc.sh ``` ### 终端 2 — Conpot ``` source ~/.venvs/conpot310/bin/activate conpot --template default -f ``` ### 终端 3 — Zeek ``` # -C 在 WSL-2 上抑制校验和卸载警告 cd zeek-logs sudo /opt/zeek/bin/zeek -C -i any ~/ot-security-monitor/zeek_scripts/ics_monitor.zeek ``` 您应该看到 OT 连接事件随着它们的到来: ``` [OT-CONN] 127.0.0.1:46324 → 127.0.0.1:502 (502/tcp) [MODBUS ] src=127.0.0.1 func=17 is_request=T ``` ### 终端 4 — ML 解析器 ``` source ~/ot-security-env/bin/activate cd ~/ot-security-monitor # 指向 Zeek 写入 conn.log 的位置 python pipeline/zeek_parser.py \ --log ~/zeek-logs/conn.log \ --db data/alerts.db ``` 警报实时出现: ``` [ALERT] CRITICAL | 127.0.0.1:47076 → 127.0.0.1:5020 (tcp) | ot_protocol_probe | score=19.17 [ALERT] LOW | 127.0.0.1:60546 → 127.0.0.1:502 (tcp) | ot_protocol_probe | score=-0.64 ``` ### 终端 5 — API + 仪表板 ``` source ~/ot-security-env/bin/activate cd ~/ot-security-monitor uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload ``` 在浏览器中打开 `http://localhost:8000`。在 WSL-2 上,这可以直接从 Windows 浏览器访问。 ## 使用模拟攻击进行测试 在所有五个终端运行时,使用
标签:AI辅助安全监测, Apex, Conpot, DNS枚举, ICS数据集, Isolation Forest, One-Class SVM, OpenPLC, Rootkit, Windows Subsystem for Linux, Windows安全, Zeek, 安全仪表板, 工业控制系统安全, 异常检测, 本地部署, 机器学习, 网络安全事件响应, 网络安全合规性, 网络安全威胁情报, 网络安全工具, 网络安全态势感知, 网络安全意识, 网络安全漏洞管理, 网络安全策略, 网络安全防护, 网络安全风险评估, 逆向工具