Ward-Software-Defined-Systems/UniFI-Network-SIEM
GitHub: Ward-Software-Defined-Systems/UniFI-Network-SIEM
面向 UniFi 网络的一体化 SIEM 解决方案,集成 syslog 采集、威胁情报增强和 AI 驱动的威胁调查功能。
Stars: 3 | Forks: 0
# UniFi Network SIEM



一个独立的、**AI 驱动**的 Node.js 应用程序,用于从 UniFi 控制台和网关收集 syslog,解析所有事件类型,将其存储在 SQLite 中,并提供内置 AI 威胁搜寻功能的实时安全仪表板。
## 功能特性
- **Syslog 收集器** — 用于 UniFi Traffic Logging 和 Activity Logging (CEF) 的 UDP 监听器
- **11 种事件类型解析器** — firewall(防火墙)、threat(威胁)、DHCP、DNS、DNS filter(DNS 过滤/CoreDNS 广告拦截)、Wi-Fi、admin(管理员)、device(设备)、client(客户端)、VPN、system(系统)
- **实时数据流** — 基于 WebSocket 的事件表,带有类型/操作徽章、搜索和暂停功能
- **仪表板** — 统计卡片、事件时间轴图表、Top 拦截、Top 威胁、Top 端口、Top 客户端、Top 来源、Top 目标;带有进度条的渐进式加载
- **实时地图** — 基于 Leaflet 的世界地图,显示地理位置增强的流量,带有颜色编码的标记(正常/拦截/威胁)、流向线和统计叠加层
- **刷新控制** — 仪表板、实时地图和威胁情报均包含手动刷新、暂停/恢复和可选的自动刷新率(1分钟、2分钟、5分钟)。默认为暂停状态以减少大数据集的负载 — 对于远程数据库后端(例如通过 VPN 的 WardSONDB)特别有用,因为并发查询可能开销很大
- **GeoIP 与威胁情报增强** — 使用 MaxMind GeoLite2 进行地理位置定位,AbuseIPDB 进行威胁评分,反向 DNS — 全部异步并带有缓存
- **国旗与滥用徽章** — 🇺🇸 外部 IP 上的表情符号国旗与国家代码;所有视图中带有颜色编码的滥用评分徽章
- **威胁情报** — 包含滥用评分、事件计数和位置的增强 IP 可排序/可过滤表格;时间周期过滤的摘要卡片与历史总计并列
- **威胁搜寻** — AI 驱动的威胁行为者调查。输入任意 IP 即可获得完整档案:本地 SIEM 活动(事件、端口、时间轴、IDS 签名、相关 /24 IP)、外部情报(rDNS、WHOIS/ASN),以及结构化的 AI 威胁评估(支持 PDF 导出)。支持 Anthropic (Opus 4.6)、OpenAI (GPT-5.4) 和 Google (Gemini 3.1 Pro),并提供页面内 API 密钥管理。*目前仅使用 Anthropic 进行了测试 — OpenAI 和 Google 集成已实现但未经测试。*
- **默认启用 HTTPS** — 自动生成的自签名 TLS 证书
- **可插拔存储后端** — SQLite(内置默认)、WardSONDB (Beta)、OpenSearch (Beta — 即将推出)
- **SQLite 存储** — WAL 模式、批量插入、自动保留清理、工作线程增强
- **零外部服务** — 一切都在一个进程中运行
## 截图
### 仪表板

### 实时地图

### 威胁情报

### 威胁搜寻

### 实时流

### 设置

## 快速开始
### 前置条件
- Node.js v18+
- macOS、Linux 或 Windows(任何支持 Node.js 和 `better-sqlite3` 的平台)
### 安装
```
# Backend
npm install
# Frontend
cd frontend && npm install && cd ..
# Configure
cp .env.example .env
# 如果需要,编辑 .env(默认设置适用于大多数安装)
```
### 运行
```
# Production(服务构建的 frontend)
cd frontend && npm run build && cd ..
npm start
# Development(两个终端)
npm run dev # Backend with auto-reload (port 3000)
cd frontend && npm run dev # Vite HMR (port 5173)
```
在浏览器中打开 https://localhost:3000。首次访问时请接受自签名证书警告。
### 使用伪造的 syslog 进行测试
```
node scripts/test-syslog.js
# 默认发送 10 msgs/sec。设置 RATE=100 以增加流量。
```
## UniFi 控制台配置
为了获得完整功能,应配置 UniFi 控制台上的三个日志记录源。它们共享同一个 UDP 端口 — 解析器会自动检测格式。
### 来源 1:Traffic Logging / Syslog(防火墙、IDS、DHCP、Wi-Fi)
1. **Settings > Policy Engine** — 对于每条防火墙规则,Edit > Advanced > **Enable Syslog Logging**
2. **Settings > CyberSecure > Traffic Logging**:
- Flow Logging: **All Traffic**(或选择 Blocked Only 以减少数据量)
- Activity Logging (Syslog): Enable **SIEM Server**
- Server Address: ``
- Port: `5514`
- Categories: 启用所有所需选项(Firewall Default Policy, Security Detections 等)
### 来源 2:Activity Logging / CEF(管理员、设备、客户端事件)
1. **Settings > Control Plane > Integrations > Activity Logging**:
- Enable **SIEM Server**
- Server Address: ``
- Port: `5514`
- Categories: 启用 Clients, Devices, Security Detections, Triggers, VPN, Critical
### 来源 3:Debug Logs(详细的 DHCP、系统进程)
1. **Settings > CyberSecure > Traffic Logging**:
- Enable **Debug Logs**
- 这将启用详细的 `dnsmasq-dhcp` 租约事件、`ubios-udapi-server` 消息以及来自网关的其他系统进程日志
- 如果没有此项,DHCP 事件和许多系统级消息将不会被转发
### 来源 4:Netconsole(内核级日志)
1. **Settings > CyberSecure > Traffic Logging**:
- Enable **Netconsole**
- Server Address: ``
- Port: `5514`
- 提供内核级消息,包括防火墙规则命中和低层网络事件
## 事件类型
| 类型 | 来源 | 描述 |
|---|---|---|
| `firewall` | Traffic Logging | 防火墙允许/拦截决策 |
| `threat` | Traffic Logging / CEF | IDS/IPS 警报 和 CEF 威胁检测 |
| `dhcp` | Traffic Logging | DHCP 租约事件(dnsmasq + 交换机中继) |
| `dns` | Traffic Logging | DNS 查询/回复(如果启用了日志记录) |
| `dns_filter` | Traffic Logging | CoreDNS 广告拦截和内容过滤拦截 |
| `wifi` | Traffic Logging | Wi-Fi 客户端关联/解除关联 |
| `admin` | CEF | 管理员登录、配置更改 |
| `device` | CEF | 设备采用、重启、固件 |
| `client` | CEF | 客户端连接/断开、漫游 |
| `vpn` | CEF / Traffic Logging | VPN 隧道 up/down 事件 |
| `system` | Either | 未分类消息的统称 |
## API
| 端点 | 描述 |
|---|---|
| `GET /api/events` | 查询带有过滤器的事件(类型、操作、IP、端口、搜索、分页) |
| `GET /api/events/:id` | 单个事件详情 |
| `GET /api/stats/overview` | 按类型和操作的汇总计数 |
| `GET /api/stats/timeline` | 用于图表的时间分桶事件计数 |
| `GET /api/stats/top-talkers` | Top 源或目标 IP |
| `GET /api/stats/top-blocked` | Top 被拦截 IP(源或目标方向,exclude_private) |
| `GET /api/stats/top-ports` | Top 目标端口 |
| `GET /api/stats/top-clients` | 跨事件类型的 Top 客户端(按 MAC) |
| `GET /api/stats/top-threats` | Top IDS/IPS 签名 |
| `GET /api/stats/threat-intel` | 带有滥用评分和事件计数的增强 IP |
| `GET /api/stats/geo-events` | 用于地图的带有地理坐标的聚合 IP |
| `GET /api/stats/recent-geo-events` | 用于流向线的带有地理数据的近期事件 |
| `GET /api/health` | 系统健康状况、事件计数、DB 大小 |
| `GET /api/settings` | 应用设置(敏感值已脱敏) |
| `PUT /api/settings` | 更新设置(AbuseIPDB key 等) |
| `POST /api/settings/reset-db` | 清除所有事件和增强缓存 |
| `GET /api/threat-hunt/settings` | Threat Hunt AI 提供商设置 |
| `PUT /api/threat-hunt/settings` | 更新 AI 提供商/密钥 |
| `POST /api/threat-hunt/investigate` | 对 IP 运行 AI 驱动的威胁调查 |
| `WSS /ws/events` | 带有过滤功能的实时事件流 |
## 配置
| 变量 | 默认值 | 描述 |
|---|---|---|
| `SYSLOG_PORT` | 5514 | syslog 监听器的 UDP 端口 |
| `HTTP_PORT` | 3000 | Web 仪表板端口 |
| `DB_PATH` | ./data/events.db | SQLite 数据库路径 |
| `RETENTION_DAYS` | 60 | 自动删除早于此天数的事件 |
| `LOG_LEVEL` | info | 日志级别 |
| `GEOIP_DB_PATH` | ./data/GeoLite2-City.mmdb | MaxMind GeoLite2 数据库路径 |
| `ABUSEIPDB_API_KEY` | *(empty)* | AbuseIPDB API key(免费层:1000次/天) |
| `ABUSEIPDB_CACHE_HOURS` | 24 | 滥用评分的缓存时长 |
| `RDNS_ENABLED` | false | 启用反向 DNS 查询 |
| `LOG_RAW_MESSAGES` | false | 在 DB 中存储原始 syslog 文本 |
| `INSERT_BATCH_SIZE` | 50 | 批量插入阈值 |
| `INSERT_BATCH_INTERVAL_MS` | 500 | 批量插入刷新间隔 |
## 项目结构
```
src/
index.js # Entry point
config.js # Environment config
collector/
syslog-server.js # UDP listener
parsers/
index.js # Format detection & routing
syslog-header.js # Header parser (4 formats)
firewall.js # iptables parser
ids.js # Suricata IDS parser
dhcp.js # dnsmasq-dhcp parser
dhcp-relay.js # Switch DHCP relay parser
dns.js # dnsmasq DNS parser
coredns.js # CoreDNS ad-block/content filter
wifi.js # hostapd parser
cef.js # CEF (Activity Logging) parser
system.js # Catch-all parser
db/
database.js # SQLite connection & schema
events.js # Event CRUD & batch insert
retention.js # Periodic cleanup
backends/
interface.js # StorageBackend base class
index.js # Backend registry & factory
sqlite.js # SQLite backend (default)
wardsondb.js # WardSONDB backend (Beta)
opensearch.js # OpenSearch backend (Beta — Coming Soon)
api/
server.js # Express + static serving
websocket.js # WebSocket live stream
routes/ # REST API routes
utils/ # IP utils, port names, constants
enrichment/
geoip.js # MaxMind GeoLite2 lookup
abuseipdb.js # AbuseIPDB API client
rdns.js # Reverse DNS lookup
enrichment-queue.js # Async enrichment coordinator
enrichment-worker.js # Worker thread for UPDATE operations
db/cache.js # IP enrichment cache
frontend/ # React + Vite + Tailwind
src/
components/
live/ # Live stream view
dashboard/ # Analytics dashboard
map/ # Live Map (Leaflet)
intel/ # Threat Intel view
hunt/ # Threat Hunt (Beta) — AI investigation
shared/ # Badges, selectors
hooks/ # WebSocket & query hooks
lib/ # API client, formatters
scripts/
test-syslog.js # Test message generator
```
## 增强设置(可选)
### GeoIP(启用实时地图)
1. 在 [MaxMind](https://www.maxmind.com/en/geolite2/signup) 注册(免费)
2. 下载 `GeoLite2-City.mmdb`
3. 放置在 `./data/GeoLite2-City.mmdb`
### AbuseIPDB(威胁评分)
1. 在 [abuseipdb.com](https://www.abuseipdb.com) 获取免费的 API key(每日 1000 次查询)
2. 在 `.env` 中设置 `ABUSEIPDB_API_KEY`,或通过 Settings 页面保存(无需重启)
3. 如果达到每日限制,查询将自动退避 1 小时
## 安全性
该应用默认运行 HTTPS,并使用自动生成的自签名证书。以下是其余的安全注意事项。
| 关注点 | 严重性 | 描述 |
|---|---|---|
| 无身份验证 | **Medium** | Web UI、API 和数据库重置对任何能够访问 3000 端口的人开放。在受信任的家庭网络中,这是可接受的。如果暴露在局域网之外,请将其置于带有身份验证的反向代理之后(使用 basic auth 或 mTLS 的 nginx/Caddy)。 |
| Syslog 欺骗 | **Low** | UDP syslog 监听器接受来自网络上任何来源的消息。局域网上的设备可以发送精心构造的 syslog 以注入虚假事件。UDP 在设计上没有身份验证 — 这是 syslog 固有的特性。 |
| 无身份验证的数据库重置 | **Low** | `POST /api/settings/reset-db` 端点不需要凭据。通过仅限网络访问的限制和 UI 中的两次点击确认来缓解。 |
| TLS 证书信任 | **Info** | 自签名证书将触发浏览器警告。对于生产环境,请使用来自受信任 CA 或您自己内部 CA 的证书替换 `data/server.key` 和 `data/server.cert`。 |
**已知公告:**
- **esbuild ≤ 0.24.2 (moderate)** — 允许任何网站向 Vite server 发送请求并读取响应 ([GHSA-67mh-4wv8-2f99](https://github.com/advisories/GHSA-67mh-4wv8-2f99))。这是一个仅用于前端开发的开发依赖项 — 它不影响生产构建或已部署的 SIEM。修复需要将 Vite 升级到 7.x(破坏性更改)。
**已缓解:**
- **SQL injection** — 所有查询均使用参数化预处理语句
- **XSS** — React 自动转义所有渲染内容,包括不受信任的 syslog 数据
- **API key 泄露** — AbuseIPDB key 在 API 响应中已脱敏(仅显示最后 4 个字符)
- **传输安全** — 默认启用 HTTPS/WSS,并带有自动生成的 TLS 证书
- **解析器崩溃** — 所有解析器均包装在 try/catch 中,并回退到 system 解析器
- **AbuseIPDB 速率限制** — 达到每日限制时自动退避 1 小时
## 已知问题
| 问题 | 状态 | 描述 |
|---|---|---|
| AbuseIPDB 评分未填充 | **Fixed** | AbuseIPDB API 字段名为 `abuseConfidenceScore` 但代码引用的是 `abuseConfidencePercentage` — 评分始终为 `null`。已在 commit `11607e4` 中修复。还添加了针对缺少滥用评分的缓存 IP 的重新排队逻辑。 |
| 数据库重置导致大数据集 CPU 占用过高 | **Fixed** | 使用 "Initialize Database" 之前会对数百万行运行 `DELETE` + `VACUUM`,导致 CPU 在 10 分钟以上保持 100%。通过切换到 `DROP TABLE` + 重建 schema 修复,无论数据库大小如何都是即时的。已在 commit `11607e4` 中修复。 |
| 增强回填导致 CPU 100% 占用 | **Fixed** | 回填 UPDATE 查询通过同步 `better-sqlite3` 调用阻塞了主 Node.js 事件循环,导致 CPU 持续 99% 达 4 小时以上。通过将所有增强 UPDATE 移至专用的 `worker_threads` Worker(拥有自己的 DB 连接)修复。6,600+ 个 IP 的回填现在在约 1.5 分钟内完成,主线程 CPU 占用为 0%。已在 commit `ca0f8ea` 中修复。 |
## Roadmap
- [x] 表格中 IP 上的滥用评分徽章
- [x] 外部 IP 上的国旗
- [ ] Threat Hunting 视图 — AI 驱动的调查工作区,用于分析威胁行为者(IP 时间轴、关联事件、地理历史、滥用报告、相关 IP)。与 Gemini、OpenAI 或 Anthropic API 集成,用于自动化威胁分析和自然语言调查查询
- [ ] CSV 导出
- [ ] 深色/浅色模式切换
- [x] 性能优化 — 增强回填移至工作线程以实现非阻塞操作
- [x] 存储后端抽象 — 可从 Settings 中选择的可插拔数据库引擎
- [x] WardSONDB 集成 — 高性能基于 Rust 的 JSON 文档数据库,具有延迟索引创建和写入压力检测
- [ ] OpenSearch 集成 — 企业级搜索和分析引擎,具有内置 SIEM 功能
- [x] 查询性能优化 — 通过 WardSONDB 在 3.45M+ 事件下实现位图扫描加速和复合范围扫描
- [ ] macOS 自动启动的 launchd plist
标签:AbuseIPDB, AI 安全, AMSI绕过, CISA项目, GeoIP, GNU通用公共许可证, HTTP/HTTPS抓包, IP 地址批量处理, MITM代理, Node.js, PE 加载器, SQLite, Syslog 收集器, UBNT, UniFi, WebSocket, 依赖分析, 威胁检测, 安全可视化, 实时仪表盘, 密码管理, 态势感知, 日志解析, 网络安全, 网络流量分析, 自定义脚本, 证书伪造, 防火墙日志, 隐私保护