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仪表盘, 后端开发, 威胁暴露面, 安全防御评估, 工业协议识别, 工控网络扫描, 工控设备分类, 插件系统, 数据统计, 未加密协议检测, 本地部署, 漏洞发现, 端口扫描, 缺失身份验证, 网络安全审计, 请求拦截, 边缘网关, 边缘计算, 逆向工具