jorgearma/siege-map
GitHub: jorgearma/siege-map
一个基于 FastAPI 和 React 的全栈网络安全可视化工具,能将原始的 SSH/Nginx 日志实时转化为带有复古游戏风格的全球攻击态势地图和威胁情报面板。
Stars: 0 | Forks: 0
# siege map
**实时 SSH/HTTP 攻击可视化工具。**
读取 SSH 和 Nginx 日志,对 IP 进行地理定位,使用 MITRE ATT&CK 对其进行分类,并通过动画弧线、数据粒子以及复古未来主义终端风格的仪表盘将它们绘制在世界地图上。
旨在通过单次执行 `docker compose up` 即可在任何 VPS 上运行。

## 具体功能
### 在地图上(主面板)
- 带有**动画弧线**的深色 Leaflet 地图,显示从攻击源到您的 VPS 的轨迹。
- 沿着弧线移动的**数据粒子**,带有十六进制片段(`0xCAFE`, `SYN>>` 等)。
- **VPS 十字准星**,带有十字线、旋转圆环和 `TARGET` 标签。
- 每个攻击者 IP 显示为一个**脉动点**,其颜色代表攻击类型(红色 SSH,黄色 HTTP,蓝色真实访问)。
- 点击一个点 -> **间谍风格的气泡呼出框**,带有 SVG 动画遥测线、目标主体数据(IP、来源、事件、坐标)以及 `OPEN FULL DOSSIER` 按钮,用于打开完整的抽屉面板。

### 侧边栏(统计面板)
所有卡片均采用 Pip-Boy 主题:带有直角括号的边框、浮动页眉、CRT 扫描线、VT323 字体。
- **总计数器**,带有偶尔出现的故障效果(ASCII 骷髅头和类似 `BREACH_DETECTED` 的消息)。
- **攻击模式**:`DICTIONARY_ATTACK`、`CREDENTIAL_STUFFING`、`PASSWORD_SPRAYING`、`SINGLE_PROBE`。
- 按国家/地区划分的**主要来源**,带有动画条形图。
- **IP 地址**,带有标签页(ALL / SSH / HTTP / VISITS / RECENT)。点击任何 IP 都会打开抽屉面板。
- **SSH 目标**:以红色标签云显示所有被尝试的用户名。
- **HTTP 路由**:分为 `BOTS`(对 `/wp-admin`、`/.git` 等的探测)和 `REAL`(您的应用实际提供的路由)。
- **近期事件**:最近 10 次命中,附带时间戳、IP 和类型。
### 攻击者档案抽屉面板
当您点击一个 IP 时(在地图、列表或信息流中):
- 带有 SSH/HTTP/SSH+HTTP 徽章的 `THREAT DOSSIER` 页眉。
- **目标识别**:巨大的 IP、地理位置、ASN/组织、Shodan 和 AbuseIPDB 链接。
- **威胁评估**,带有分段的 `PipBoyMeter`(20 个类似生命条的方块)。
- **保险库统计**:带有 L 型角落的卡片,显示总命中数、SSH 用户、HTTP 路径、请求数/分钟。
- **AbuseIPDB 情报**,包含置信度百分比和报告总数。
- **分类**:模式 + 速度 + 如果是臭名昭著的威胁则带有 `KNOWN_THREAT` 徽章。
- **MITRE ATT&CK** 徽章,包含已识别的 TTP。
- 标签页:OVERVIEW(时间轴 + 摘要)、SSH(所有被尝试的用户名)、HTTP(带有状态码和计数的路由)。

### 实时信息流
通过 WebSocket 实时传输每个进入的事件:时间戳、IP、带国旗的国家/地区、类型、严重性。支持按 SSH/HTTP/REAL 进行过滤。
### REST API + 导出
- `GET /api/health` — 健康检查。
- `GET /api/events?limit=` — 原始事件。
- `GET /api/stats/{total,countries,ips,usernames,http-routes,patterns,asns,heatmap}?window=` — 统计信息。
- `GET /api/attacker/{ip}` — 完整档案。
- `GET /api/attackers?limit=&window=` — 按威胁分数排名。
- `GET /api/export/stix?window=` — 可下载的 STIX 2.1 bundle。
- `GET /api/export/csv?window=` — CSV 格式的事件。
- `GET /api/export/report?window=` — JSON 格式的执行摘要。
## 30 秒内启动
```
git clone
cd ssh-bot-rain-map
cp .env.example .env
# 编辑 .env(见下方 "Adaptar a tu entorno")
docker compose up -d --build
```
然后打开:
- Dashboard:`http://localhost:3000`(或 `http://:3000`)
- API:`http://localhost:8000/api/health`
### 开发模式(使用合成日志)
如果您在本地测试且无法访问真实日志:
```
docker compose -f docker-compose.dev.yml up -d --build
# 在另一个终端中,生成虚假流量:
python scripts/fake_ssh_log.py --output ./logs/auth.log --rate 2.0
```
开发模式的 compose 会挂载 `./logs/auth.log` 而不是主机的日志。
## 适配您的环境
您可能想要调整的所有内容。
### 1. 环境变量(`.env`)
| 变量 | 默认值 | 更改内容及原因 |
|----------|---------|------------------------|
| `SSH_LOG_PATH` | `/var/log/auth.log` | **必填**。Debian/Ubuntu 使用 `auth.log`,RHEL/CentOS/Fedora 使用 `/var/log/secure`。 |
| `NGINX_LOG_PATH` | `/var/log/nginx/access.log` | 可选。如果您不使用 Nginx,请将其留空或指向您的 access log(如果 Apache 使用 combined 格式则也可用)。 |
| `VPS_LAT` | `40.4168` | **必填**。您 VPS 的纬度 —— 弧线的“阵雨”降落的位置。 |
| `VPS_LON` | `-3.7038` | **必填**。您 VPS 的经度。 |
| `VPS_LABEL` | `My VPS` | 您将在 VPS 标记的弹出窗口中看到的文本。 |
| `GEO_PROVIDER` | `ip-api` | `ip-api`(免费,45 次请求/分钟)或 `ipinfo`(质量更好,需要 token)。 |
| `IPINFO_TOKEN` | _(空)_ | 仅当 `GEO_PROVIDER=ipinfo` 时需要。在 [ipinfo.io](https://ipinfo.io/) 获取免费 token。 |
| `ABUSEIPDB_API_KEY` | _(空)_ | 可选。启用信誉信息丰富功能。免费层:1000 次检查/天。 |
| `SHODAN_API_KEY` | _(空)_ | 可选。获取额外的端口/OS/漏洞数据。 |
| `MAX_EVENTS` | `10000` | 内存中的事件数(循环队列)。如果您的流量很大并需要较长的时间窗口,请提高此值。 |
| `GEO_CACHE_TTL` | `86400` | 地理位置缓存的 TTL(以秒为单位)(默认为 24 小时)。 |
| `ABUSE_CACHE_TTL` | `86400` | AbuseIPDB 缓存的 TTL。 |
| `WS_BROADCAST_INTERVAL` | `1.0` | WebSocket 发送间隔(以秒为单位)。如果您的 CPU 负担过重,请将其提高到 `2.0`。 |
| `FRONTEND_PORT` | `3000` | Dashboard 的端口。如果您的 3000 端口已被占用,请更改它。 |
| `BACKEND_PORT` | `8000` | FastAPI 后端的端口。 |
### 2. 您应用的“合法”HTTP 路由
如果您使用 Nginx 提供自己的网站服务,这**非常重要**。默认情况下,任何未列出的路由都会被标记为 `BOT_PROBE`(黄色)。为了让您的真实路由作为合法访问以蓝色显示:
编辑 `frontend/src/config/knownRoutes.js` 并添加您的路由:
```
export const KNOWN_ROUTES = [
'/',
'/about',
'/api/...',
// tus rutas aqui
]
```
### 3. VPS 坐标
如果您不知道服务器的纬度/经度,请从 VPS 使用 `curl ifconfig.co/json` 或查看您的提供商面板(Hetzner、DigitalOcean、OVH 等)。
### 4. 前端与后端部署在不同的主机上
如果您将前端和后端部署在独立的主机上(对于此应用不推荐,但可行):
- 编辑 `frontend/src/hooks/useWebSocket.js` 以指向正确的 WS(`ws://tu-backend:8000/ws`)。
- 编辑 `frontend/vite.config.js`(`proxy.target`)以适应开发模式。
- 在生产环境中,前端的 `nginx.conf` 假定后端位于名为 `backend` 的 docker 服务中。如果您的设置不同,请更改它。
### 5. 如果您的 VPS 已经在使用 3000/8000 端口
在 `.env` 中更改 `FRONTEND_PORT` 和 `BACKEND_PORT`,或者编辑 `docker-compose.yml` 中的端口映射。例如:
```
frontend:
ports:
- "8080:80" # accede en :8080
```
### 6. SSH 日志的权限
后端以只读方式读取挂载的日志。在大多数发行版中,`auth.log` 属于 `root:adm` 或 `root:syslog`。如果容器无法读取它:
```
sudo chmod o+r /var/log/auth.log
# 或调整 docker-compose.yml 中的容器用户
```
### 7. 自定义外观
- **Pip-Boy 主题**:CSS 变量位于 `frontend/src/styles/app.css` 的开头(`--pip-green`、`--pip-amber`、`--pip-bg` 等)。更改它们以拥有您自己的调色板。
- **攻击类型颜色**:在 `frontend/src/components/WorldMap.jsx`(`SSH_COLOR`、`HTTP_COLOR`、`VISITOR_COLOR`)中定义。
- **故障消息**:编辑 `frontend/src/components/StatsPanel.jsx` 中的 `GLITCH_LINES`。
## 架构
```
SSH/Nginx log --tail-F--> FastAPI ingesta
|
+--> parser (regex) --> SSHEvent / HttpEvent
|
+--> geo enrichment (ip-api / ipinfo, cached)
|
+--> threat intel (AbuseIPDB, opcional, cached)
|
+--> analyzer (patterns + MITRE TTPs)
|
+--> EventStore (deque circular en memoria)
|
+--> WebSocket broadcast (1s) --> React UI
|
+--> REST API (stats, profile, export)
```
### 后端 (`backend/app/`)
- `main.py` — FastAPI,两个异步任务:`process_log_lines()` 和 `flush_loop()`。
- `tail.py` — `async for line in tail_log(path)`,在 logrotate 后依然存活。
- `parser.py` — 正则表达式解析 SSH + HTTP(Nginx combined)。
- `geo.py` — 带有 TTL 缓存的地理定位。
- `threat_intel.py` — 带有速率限制(1 次请求/秒,900 次/天)的 AbuseIPDB 查询。
- `analyzer.py` — 启发式分类器,MITRE ATT&CK,7x24 热力图。
- `stix_export.py` — 无外部依赖的 STIX 2.1 bundle 生成。
- `store.py` — 带有循环 deque 并按分钟去重的 `EventStore`。
- `models.py` — 数据类 `SSHEvent`、`HttpEvent`、`GeoInfo`。
- `config.py` — 读取 `.env` 的单例 `settings`。
### 前端 (`frontend/src/`)
- `App.jsx` — 根组件,管理事件和抽屉面板的状态。
- `components/WorldMap.jsx` — Leaflet + canvas 粒子 + IntelCallout(带有 SVG 线条的间谍卡片)。
- `components/StatsPanel.jsx` — 带有标签页和标签云的 Pip-Boy 风格统计面板。
- `components/AttackerProfile.jsx` — 带有完整档案的 440px 抽屉面板。
- `components/EventFeed.jsx` — 可滚动的实时事件流。
- `components/Charts.jsx` — Recharts 时间轴。
- `components/HeatmapChart.jsx` — 7x24 网格(星期 x 小时)。
- `components/ExportPanel.jsx` — STIX / CSV / REPORT 按钮。
- `components/MitreBadge.jsx` — 可复用的 TTP 徽章。
- `hooks/useWebSocket.js` — WS 连接管理。
- `config/knownRoutes.js` — 合法路由白名单。
- `styles/app.css` — 所有 Pip-Boy 主题 + 动画。
## 内置的最佳实践
- `tail -F` 带有自动重试机制,在 `logrotate` 后依然存活。
- 针对地理位置(45 次请求/分钟)和 AbuseIPDB(1 次请求/秒,900 次/天)的**缓存**和**速率限制**。
- 轻量级**去重**(`ip:user:type:minute`)以避免虚高的指标。
- **多因素启发式方法**,结合速度、模式、用户名多样性和外部信誉。
- 容器中挂载的日志卷为**只读**模式。
- 无数据库:所有内容都位于有界限的内存 deque 中(重启时无需清理)。
## 操作与故障排除
```
# Health check
curl http://localhost:8000/api/health
# 实时日志
docker compose logs -f backend
docker compose logs -f frontend
# 原始数据
curl http://localhost:8000/api/events?limit=20
curl http://localhost:8000/api/stats/total
# Reset(不丢失主机日志)
docker compose restart backend
# 修改代码后 Rebuild
docker compose up -d --build
```
**我看不到事件:**
1. 容器能读取日志吗?`docker compose exec backend cat $SSH_LOG_PATH | head`(应该会输出内容)。
2. 有真实活动吗?在开发模式下使用 `python scripts/fake_ssh_log.py --output ./logs/auth.log --rate 2.0` 生成。
3. VPS 坐标是否正确?如果它们是 `0,0`,地图居中于海洋中部。
**地理位置显示 "Unknown":**
- ip-api 有速率限制。请等待或切换为使用 token 的 ipinfo。
- 私有 IP(`10.x`、`192.168.x`)被故意不进行地理定位。
**前端未连接 WS:**
- 查看浏览器控制台。如果 `/ws` 处出现 `404`,请检查 Vite 代理或 `nginx.conf` 是否指向了正确的后端。
## 路线图
- 可选的持久化(SQLite/DuckDB),用于长期历史记录和重放。
- 多传感器:将多个 VPS 聚合到一个仪表盘中。
- 基于威胁分数的 Webhooks/Slack 告警。
- 浅色模式(虽是异端,但为了完整性)。
- TLS/身份验证,以便公开暴露仪表盘。
## 许可证
MIT。随意 Fork 和修改。
标签:AbuseIPDB, AppImage, ATT&CK框架, AV绕过, Docker, Docker Compose, FastAPI, IP 地址批量处理, IP地理位置, Leaflet, Nginx日志分析, Pip-Boy风格, React, SSH日志分析, STIX 2.1, Syscalls, UI设计, VPS, WebSockets, Web应用防火墙, 后端开发, 复古终端, 威胁情报, 安全仪表盘, 安全防御评估, 密码管理, 库, 应急响应, 开发者工具, 攻击者画像, 数据可视化, 数据大屏, 日志处理, 网络安全, 请求拦截, 赛博朋克, 逆向工具, 隐私保护