TheMadMaxCLT/OTAssetScanner
GitHub: TheMadMaxCLT/OTAssetScanner
运行在 IXON SecureEdge Pro 边缘网关上的 OT 资产扫描器,用于发现工业设备、识别 OT 协议并标记安全隐患。
Stars: 0 | Forks: 0
# OT 资产扫描器 — 适用于 IXON SecureEdge Pro 的 Edge App
一款用于扫描设备侧网络以发现工业设备、识别 OT 协议并在实时 Web 仪表盘中展示结果的 Edge App——全部在 SecureEdge Pro 上本地运行。
## 功能说明
- 使用 nmap 发现设备网络上的存活主机
- 识别工业协议:Modbus TCP、EtherNet/IP、S7comm、OPC-UA、BACnet/IP、DNP3、MQTT 等
- 按类型对设备进行分类(PLC、HMI、网关、交换机、边缘设备)
- 标记安全观察结果(未加密协议、缺少身份验证)
- 提供可通过 IXON Cloud 在本地或远程访问的 Web 仪表盘
通过设置 `DEMO_MODE=true`,可以使用内置的演示模式进行本地开发和测试。当部署在 SecureEdge Pro 上时,扫描器默认以实时模式运行。
## 前置条件
- 启用了 Edge App 支持的 **IXON SecureEdge Pro**(**不需要** Edge App Management)
- 在开发 PC(Windows、macOS 或 Linux)上安装 **Docker Desktop**
- 能够访问 SecureEdge Pro 的网络——可以是本地局域网,也可以通过 IXON Cloud VPN
## 步骤 1:在你的 PC 上进行本地测试
在部署到 SecureEdge Pro 之前,请验证应用程序在你的机器上能否正常运行。
```
cd ot-scanner
docker compose up --build
```
在浏览器中打开 `http://localhost:8080`。点击 **Run Scan** 以使用演示数据填充仪表盘。确认设备表格、协议侧边栏和安全发现均能正确显示。
按 `Ctrl+C` 停止。
## 步骤 2:为 SecureEdge Pro Registry 配置 Docker
SecureEdge Pro 具有内置的 Docker Registry,运行在端口 5000 上,并通过 HTTP 接受镜像。你的 Docker 安装需要信任这个不安全的 registry。
### Docker Desktop (Windows / macOS)
1. 打开 **Docker Desktop → Settings → Docker Engine**
2. 在 JSON 配置中添加 `insecure-registries`:
```
{
"insecure-registries": [
":5000"
]
}
```
例如,如果你的网关是 `192.168.140.1`:
```
{
"insecure-registries": [
"192.168.140.1:5000"
]
}
```
或者如果你的网关是 `192.168.1.1`:
```
{
"insecure-registries": [
"192.168.1.1:5000"
]
}
```
3. 点击 **Apply & Restart** 并等待 Docker Desktop 重启完成。
### Linux
将相同的条目添加到 `/etc/docker/daemon.json` 并重启 Docker 服务:
```
sudo systemctl restart docker
```
## 步骤 3:设置 ARM64 交叉编译构建器
SecureEdge Pro 运行在 ARM64 处理器上。Docker buildx 负责处理从你的 x86 PC 进行的交叉编译。
在项目文件夹中**创建 buildx 配置文件**。将 `` 替换为你的 SecureEdge Pro 的 IP:
**Windows (PowerShell):**
```
Set-Content -Path buildkitd-secure-edge-pro.toml -Value '[registry.":5000"]
http = true'
```
**macOS / Linux:**
```
cat > buildkitd-secure-edge-pro.toml << EOF
[registry.":5000"]
http = true
EOF
```
**创建并激活构建器:**
```
docker buildx rm secure-edge-pro 2>/dev/null
docker buildx create --name secure-edge-pro --config buildkitd-secure-edge-pro.toml
docker buildx use secure-edge-pro
```
## 步骤 4:构建并推送镜像
确保你的 PC 可以访问 SecureEdge Pro(本地网络或 VPN),然后在项目文件夹中执行:
```
docker buildx build --platform linux/arm64/v8 --tag :5000/ot-scanner:latest --push .
```
**示例:**
```
# 对于 192.168.140.1 (default)
docker buildx build --platform linux/arm64/v8 --tag 192.168.140.1:5000/ot-scanner:latest --push .
# 对于 192.168.1.1 (custom LAN)
docker buildx build --platform linux/arm64/v8 --tag 192.168.1.1:5000/ot-scanner:latest --push .
```
首次构建需要 2-3 分钟(交叉编译 + 推送)。后续的构建会更快。
## 步骤 5:部署容器
你可以使用 **SecureEdge Pro 本地 Web UI** 或 **REST API** 来部署容器。这两种方法实现的效果相同。
### 选项 A:通过本地 Web UI 部署 (Edge App Management)
1. 在浏览器中打开 `http://`
2. 使用用户名 `admin` 和 SecureEdge Pro 侧面印有的密码登录
3. 导航到 **Docker / Edge Apps** 部分
4. 你应该能在可用镜像列表中看到 `ot-scanner:latest`
5. 使用以下设置创建一个新容器:
| 设置 | 值 |
|---|---|
| **Container name** | `ot-scanner` |
| **Image** | `ot-scanner:latest` |
| **Port mapping** | `8080:8080 TCP` |
| **Environment: DEMO_MODE** | `false` |
| **Environment: SCAN_SUBNET** | 你的机器网络子网(例如 `192.168.1.0/24`) |
| **Environment: PORT** | `8080` |
6. 保存并**启动**容器
### 选项 B:通过 REST API 部署
在你的 PC 上打开**命令提示符**(而非 PowerShell):
**身份验证:**
```
curl.exe --request POST --url http://:80/auth/login --cookie-jar session.jar --data "username=admin" --data "password="
```
**验证镜像是否在 registry 中:**
```
curl.exe --request GET --url http://:80/api/v1/docker/images --cookie session.jar
```
**创建容器**(将 `` 替换为你的机器网络,例如 `192.168.1.0/24`):
```
curl.exe --request POST --url http://:80/api/v1/docker/containers --cookie session.jar --header "Content-Type: application/json" --data "{\"container\":{\"name\":\"ot-scanner\"},\"image\":{\"name\":\"ot-scanner\",\"tag\":\"latest\"},\"ports\":[{\"source\":8080,\"destination\":8080,\"protocol\":\"tcp\"}],\"mounts\":[],\"networks\":[{\"name\":\"machine-builder\",\"driver\":\"bridge\"}],\"environment_variables\":[{\"key\":\"DEMO_MODE\",\"value\":\"false\"},{\"key\":\"SCAN_SUBNET\",\"value\":\"\"},{\"key\":\"PORT\",\"value\":\"8080\"}]}"
```
**启动容器:**
```
curl.exe --request POST --url http://:80/api/v1/docker/containers/ot-scanner/start --cookie session.jar
```
**验证其正在运行:**
```
curl.exe --request GET --url http://:80/api/v1/docker/containers/ot-scanner/status --cookie session.jar
```
预期响应:`{"running_state":"running"}`
## 步骤 6:访问仪表盘
### 本地访问(在同一网络下)
在浏览器中打开 `http://:8080`。
### 通过 IXON Cloud 远程访问
1. 登录 **IXON Cloud** 并导航到你的 SecureEdge Pro 设备
2. 进入 **Services** → **Add Service** → **HTTP Web Server**
3. 配置:
- **Name:** `OT Asset Scanner`
- **Host:** `localhost`
- **Port:** `8080`
- **Protocol:** HTTP
4. 保存,然后点击该服务以打开一个指向仪表盘的安全 Web 访问会话
这为你(以及任何拥有该设备 IXON Cloud 访问权限的人)提供了通过 IXON 加密 VPN 隧道远程访问扫描器仪表盘的能力——无需向互联网暴露任何端口。
## 环境变量
| 变量 | 生产环境值 | 描述 |
|---|---|---|
| `DEMO_MODE` | `false` | 设置为 `false` 以进行实时扫描。设置为 `true` 则生成模拟数据用于本地测试。 |
| `SCAN_SUBNET` | 你的机器子网 | 扫描的目标子网(例如 `192.168.1.0/24` 或 `192.168.140.0/24`) |
| `PORT` | `8080` | Web 仪表盘端口 |
## 更新应用程序
SecureEdge Pro 不支持就地容器更新。要部署新版本:
1. **重新构建并推送:**
docker buildx build --platform linux/arm64/v8 --tag :5000/ot-scanner:latest --push .
2. **停止并移除旧容器:**
curl.exe --request POST --url http://:80/api/v1/docker/containers/ot-scanner/stop --cookie session.jar
curl.exe --request DELETE --url http://:80/api/v1/docker/containers/ot-scanner --cookie session.jar
3. 使用与步骤 5 相同的创建和启动命令**重新创建并启动**。
## 项目结构
```
ot-scanner/
├── app.py # Flask backend — API routes and scanner logic
├── web/
│ └── templates/
│ └── index.html # Dashboard UI (single-file SPA)
├── Dockerfile # Container image definition (ARM64 compatible)
├── docker-compose.yml # Local development compose file
└── requirements.txt # Python dependencies (Flask, gunicorn)
```
## 故障排除
**推送镜像时出现“connection refused”**
你的 PC 无法访问 SecureEdge Pro。使用 `ping ` 验证连接,并确认 Docker Desktop 中已配置了不安全的 registry。
**API 登录时出现“Invalid credentials”**
密码区分大小写。请检查 SecureEdge Pro 侧面的贴纸。
**创建容器时出现 504 Gateway Timeout**
这在首次加载镜像时是正常现象。等待 60 秒,然后检查容器状态——创建过程会在后台继续进行。
**PowerShell curl 返回 HTML 而不是 JSON**
PowerShell 将 `curl` 作为 `Invoke-WebRequest` 的别名。请明确使用 `curl.exe`,或改用命令提示符 (CMD)。
**仪表盘已加载,但在实时模式下“Run Scan”未返回任何结果**
Nmap 需要访问目标子网的网络权限。请验证容器的网络模式是否允许其访问机器网络,并确认 `SCAN_SUBNET` 是否与你实际的机器侧子网相匹配。
## 参考文献
- [在 SecureEdge Pro 上运行自定义 Docker 应用](https://support.ixon.cloud/s/article/Running-custom-Docker-applications-on-the-SecureEdge-Pro)
- [SecureEdge API — Docker](https://developer.ixon.cloud/docs/secure-edge-api-docker)
- [SecureEdge API — 身份验证](https://developer.ixon.cloud/docs/secure-edge-api-login)
- [IXON Marketplace](https://marketplace.ixon.cloud)
如果你读到了这里,TENET 曾到此一游! \m/
SATOR
AREPO
TENET
OPERA
ROTAS
标签:BACnet/IP, DNP3, Docker, Docker Registry, EtherNet/IP, HMI识别, ICS安全, IXON, Modbus TCP, OPC-UA, OT安全, PLC识别, S7comm, SecureEdge Pro, SOC工具, Web仪表盘, 后端开发, 威胁暴露面, 安全防御评估, 工业协议识别, 工控网络扫描, 工控设备分类, 插件系统, 数据统计, 未加密协议检测, 本地部署, 漏洞发现, 端口扫描, 缺失身份验证, 网络安全审计, 请求拦截, 边缘网关, 边缘计算, 逆向工具