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, 安全仪表板, 工业控制系统安全, 异常检测, 本地部署, 机器学习, 网络安全事件响应, 网络安全合规性, 网络安全威胁情报, 网络安全工具, 网络安全态势感知, 网络安全意识, 网络安全漏洞管理, 网络安全策略, 网络安全防护, 网络安全风险评估, 逆向工具