arnavparekar/ics-zoneaudit
GitHub: arnavparekar/ics-zoneaudit
这是一款将工业网络 Nmap 扫描结果自动映射到 IEC 62443 安全区域并生成合规审计报告的 Python 命令行工具。
Stars: 0 | Forks: 0
# ICS-ZoneAudit
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/)
[](https://nmap.org/)
[](https://www.isa.org/standards-and-publications/isa-standards/isa-iec-62443-series-of-standards)
这是一个 Python CLI 工具,它接收工业网络的 Nmap XML 扫描结果,自动将每个发现的资产分类到 **IEC 62443 安全区域**(Purdue 模型)中,检查区域边界和管道违规情况,根据安全强化检查表对每个资产进行评分,并生成结构化的合规审计报告(JSON + HTML)。
ICS-ZoneAudit 让 IEC 62443 区域和管道建模变得触手可及且直观。你可以扫描真实或模拟的网络,并立即查看你的资产拓扑如何映射到该标准,而不是仅仅将标准作为理论来阅读。

## 目录
- [背景](#background)
- [项目架构](#project-architecture)
- [目录结构](#directory-structure)
- [启发式方法与规则引擎](#heuristics--rule-engines)
- [区域分类](#zone-classification)
- [安全强化检查表](#hardening-checklist)
- [管道违规](#conduit-violations)
- [快速开始](#quick-start)
- [自定义拓扑覆盖](#custom-topology-overrides)
- [可选的 Docker OT 实验室](#optional-docker-ot-lab)
- [示例输出](#sample-output)
- [许可证](#license)
## 背景
**IEC 62443** 系列是运营技术(OT)和工业控制系统(ICS)网络安全领域占主导地位的国际标准。IEC 62443 的一个核心概念是将其划分为**区域与管道**:
- **区域:** 具有共同安全要求的逻辑或物理资产组(例如,企业、DMZ、控制、现场设备)。
- **管道:** 这些区域之间的通信路径。
保护 OT 网络安全需要确保这些区域被适当地隔离,防火墙位于边界管道上,并且区域内的单个设备根据其目标安全级别(SL)进行了安全强化。
**ICS-ZoneAudit** 将此评估自动化。通过运行标准的网络扫描(Nmap),该工具结合使用端口分析和主机名启发式方法来重建区域模型,发现违规管道(如 PLC 直接将现场网络桥接到企业 LAN),并对资产进行评级。
## 项目架构
```
graph TD
N[Nmap Scan XML] --> P[XML Parser]
T[topology.yaml] -.->|Optional Overrides| C
subgraph "ICS-ZoneAudit Engine"
P --> C[Zone Classifier]
C --> H[Hardening Checker]
H --> V[Violation Detector]
V --> R[Report Generator]
end
R -->|Generates| JSON[zoneaudit_report.json]
R -->|Generates| HTML[zoneaudit_report.html]
```
该工具完全静态且离线运行。它通过一系列规则引擎组成的 pipeline 处理 XML 文件,构建出丰富的 `Asset` 对象模型,最后将其传递给 Jinja2 报告生成器。
## 目录结构
```
ICS-ZoneAudit/
├── ics_zoneaudit.py # Main CLI entry-point and orchestrator
├── requirements.txt # Python dependencies (Jinja2, PyYAML, libnmap)
│
├── core_engines/ # (Conceptual)
│ ├── classifier.py # Port/hostname heuristics to determine Zones & SLs
│ ├── checker.py # Assesses assets against the Hardening Checklist
│ ├── violations.py # Evaluates cross-asset relationships for illegal conduits
│ └── reporter.py # JSON generation and Jinja2 HTML rendering
│
├── templates/
│ └── report.html.j2 # Jinja2 template for the interactive HTML dashboard
│
├── tests/
│ ├── test_classifier.py # Pytest unit tests for the classification logic
│ └── test_checker.py # Pytest unit tests for the hardening logic
│
├── samples/
│ ├── demo_scan.xml # Simulated Nmap XML of a 12-host OT environment
│ └── topology.yaml # Example manual override configuration
│
└── lab/
├── docker-compose.yml # Optional simulated OT lab environment
└── README.md # Instructions for running the Docker lab
```
## 启发式方法与规则引擎
### 区域分类
该工具根据资产暴露的服务将其归入四个区域(企业、DMZ、控制、现场设备)之一。
- **现场设备:** 如果检测到 Modbus (502)、DNP3 (20000) 或 S7comm (102) 等协议端口开放。
- **控制:** 通过 EtherNet/IP (44818)、OPC UA (4840) 等协议以及其他指标,或 `scada` 或 `hmi` 等主机名来检测。
- **DMZ:** 通过远程访问(SSH/RDP)和不包含 ICS 协议的 Web 服务的组合,或特定的主机名(`vpn`、`historian`)来检测。
- **企业:** 缺少任何工业指标的标准 IT 服务(SMB、电子邮件、通用 Web)的默认归类。
### 安全强化检查表
`checker.py` 引擎根据映射到 IEC 62443-3-3(系统安全要求)和 NIST 800-82 的健全检查表对每个资产进行评估。
| ID | 名称 | 触发条件 |
|----|------|-------------------|
| **H-01** | Telnet 已禁用 | 23 端口开放。 |
| **H-02** | FTP 已禁用 | 21 端口开放。 |
| **H-03** | Modbus 未暴露 | 资产位于现场设备区域,502 端口开放,并且没有边界防火墙(根据扫描拓扑推断)。 |
| **H-07** | 默认 ICS 凭据已更改 | 检查没有身份验证的特定已知易受攻击的端口。 |
| **H-10** | 非双宿主主机 | 资产同时运行强企业协议(RDP)和控制协议。 |
| **H-14** | 子网分割 | 现场设备和企业资产共享同一个 /24 子网。 |
*(注意:总共有 15 项安全强化检查(H-01 至 H-15),涵盖安全访问、遗留协议和网络规范)。*
### 管道违规
`violations.py` 引擎通过评估资产*之间*的关系来检测架构缺陷。
| ID | 严重程度 | 类型 | 触发条件 |
|----|----------|------|-------------------|
| **V-001** | 高危 | 双宿主资产 | 资产被分配到特定区域,但在多个子网上拥有 IP(桥接区域)。 |
| **V-006** | 高危 | 无防火墙证据 | 现场或控制资产与企业资产位于完全相同的子网上。 |
| **V-009** | 中危 | OT 上的企业协议 | 控制或现场资产暴露了典型的 IT 协议(SMB、RDP)且没有 DMZ 代理。 |
| **V-012** | 中危 | 不安全的协议 | 在控制或现场设备区域的资产上发现 Telnet/FTP。 |
## 快速开始
### 1. 安装
需要 Python 3.11+。
```
git clone https://github.com/arnavparekar/ics-zoneaudit.git
cd ics-zoneaudit
pip install -r requirements.txt
```
### 2. 运行示例扫描
使用提供的示例 Nmap XML 测试该工具,该 XML 包含一个模拟的 12 主机 OT 环境及故意设置的缺陷。
```
python3 ics_zoneaudit.py --input samples/demo_scan.xml --format both
```
这将立即生成 `zoneaudit_report.json` 和 `zoneaudit_report.html`。在任何浏览器中打开该 HTML 文件即可浏览仪表板。
### 3. 运行真实扫描
要审计你自己的环境,首先运行带有版本检测(`-sV`)的 Nmap 扫描,并将其输出为 XML(`-oX`):
```
sudo nmap -sV -p- -oX my_network.xml 192.168.1.0/24 192.168.2.0/24
```
然后在生成的 XML 文件上运行 ICS-ZoneAudit:
```
python3 ics_zoneaudit.py --input my_network.xml --output my_audit_report
```
## 自定义拓扑覆盖
由于网络扫描无法完美推断意图,因此分类器启发式方法可以被覆盖。你可以提供一个 `topology.yaml` 文件,将特定的 IP 或整个子网显式绑定到某个区域。
**topology.yaml**
```
zones:
Enterprise:
- 192.168.1.10 # Exact IP match
DMZ:
- 192.168.2.0/24 # Entire subnet match
Control:
- 192.168.3.0/24
Field Device:
- 192.168.4.0/24
```
使用配置覆盖运行:
```
python3 ics_zoneaudit.py --input my_network.xml --config topology.yaml
```
## 可选的 Docker OT 实验室
如果你无法访问真实的 ICS 网络进行扫描,此仓库包含了一个使用 Docker Compose 构建的模拟微型 OT 网络。
1. 导航到 `lab/` 目录并启动 stack:
cd lab
docker compose up -d
2. 扫描实验室环境(假设使用标准的 Docker 网桥 IP 分配):
nmap -sV -p- -oX lab_scan.xml 192.168.1.0/24 192.168.2.0/24 192.168.3.0/24 192.168.4.0/24
3. 针对你的新扫描运行审计:
python3 ../ics_zoneaudit.py --input lab_scan.xml
*有关模拟错误配置的更多详细信息,请参阅 `lab/README.md`。*
## 示例输出
HTML 仪表板采用专业的工业暗色主题来展示审计结果。它包括:
- **区域摘要仪表板:** 快速查看在每个区域中发现了多少资产的指标视图。
- **推断的区域拓扑:** 自动生成的 SVG 图表,显示 Purdue 模型层、资产计数以及检测到的任何违规管道(以红色突出显示)。
- **违规表:** 清晰列出架构缺陷、严重程度和受影响资产的表格。
- **详细资产评分卡:** 每个主机的单独卡片,显示其分配的区域、安全级别(SL)、开放端口以及安全强化检查表的通过/失败状态。

## 许可证
该项目基于 MIT 许可证授权 — 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
标签:CTI, ICS, IEC 62443, Nmap, NTLM Relay, OT安全, Python, 恶意代码分类, 插件系统, 无后门, 虚拟驱动器, 请求拦截, 逆向工具