adityapitale/Impossible-Travel-Detector
GitHub: adityapitale/Impossible-Travel-Detector
基于 UEBA 理念的身份验证异常检测引擎,通过 GeoIP 定位和移动速度计算识别凭证泄露后的「不可能旅行」攻击,并提供交互式 SOC 仪表板和分析师分诊工作流。
Stars: 0 | Forks: 0
# 🛡️ 不可能旅行检测器
一个受 UEBA 启发的检测引擎,用于分析身份验证日志、执行 GeoIP 查询、计算登录事件之间的移动速度、利用实时威胁情报(VPN/TOR/托管)丰富警报、分配风险评分,并在交互式 SOC 风格的仪表板上可视化结果。

## 🚀 它的功能
现代攻击者经常使用距离受害者真实位置很远的异地基础设施,利用窃取的凭证进行登录。此工具模拟了 Microsoft、Google 和 Okta 等公司如何检测此类行为:
1. 解析身份验证日志(用户、时间戳、IP、状态)
2. 使用 GeoLite2 将每个 IP 解析为地理位置
3. 计算连续登录之间的距离和所需的移动速度
4. 标记任何超过现实移动速度(民航客机 ≈ 900 km/h)的登录对
5. 通过实时威胁情报丰富警报 —— 检查该 IP 是否为已知的 VPN、TOR 退出节点或数据中心/托管 IP(通过 `ip-api.com`)
6. 计算加权风险评分(0–100)并分配严重程度级别
7. 在包含图表、全球移动地图和分析师分诊工作流的交互式 Flask 仪表板上显示所有内容
## 🧱 架构
登录日志 (CSV)
│
▼
日志解析器 → 为每个用户配对连续的登录记录
│
▼
GeoIP 查询 → IP → 国家、城市、纬度/经度 (GeoLite2)
│
▼
距离 + 速度引擎 → Haversine 距离,km/h
│
▼
威胁情报 → VPN / TOR / 托管检测 (ip-api.com)
│
▼
风险评分引擎 → 加权评分 → 严重程度 → 处置建议
│
▼
Flask 仪表板 → SQLite 存储、图表、移动地图、分析师分诊

## ✨ 特性
- **真实的移动速度检测**,使用 Haversine 公式
- **实时威胁情报** —— 没有硬编码的 IP 列表,每次分析运行时都会通过 ip-api.com 检查真实的 VPN/TOR/托管状态
- **加权风险评分**,结合了速度、新国家/地区、威胁情报和登录失败信号
- **交互式仪表板** —— 严重程度饼图、风险评分柱状图、曲线式全球移动地图展示每个用户的完整登录轨迹并带有悬浮提示
- **可过滤的警报表**,支持按用户、严重程度、威胁情报类型和开启/已批准状态进行过滤
- **分析师分诊工作流** —— 警报可以被批准(合法的商务旅行)或重新开启,并保留完整的审计追踪
- **防重复的安全重新分析** —— 多次运行分析绝不会导致警报重复或覆盖已批准的状态

## 🛠️ 技术栈
| 工具 | 用途 |
|---|---|
| Python | 核心检测逻辑 |
| Flask | Web 仪表板 |
| Pandas | 日志解析 |
| GeoPy | Haversine 距离计算 |
| GeoLite2 (MaxMind) | IP → 地理位置 |
| ip-api.com | 实时 VPN / TOR / 托管检测 |
| SQLite | 警报持久化 |
| Plotly.js | 图表和交互式世界地图 |
## 📦 设置
### 1. 克隆仓库
```
git clone https://github.com/YOUR_USERNAME/Impossible-Travel-Detector.git
cd Impossible-Travel-Detector
```
### 2. 创建并激活虚拟环境
```
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Mac/Linux
```
### 3. 安装依赖项
```
pip install -r requirements.txt
```
### 4. 下载 GeoLite2 数据库
必需 —— 由于 MaxMind 的许可条款,本仓库不包含此内容。
1. 在 [maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup) 免费注册
2. 下载 `GeoLite2-City.mmdb`
3. 将其放置在项目根目录下
### 5. 运行应用
```
python app.py
```
打开 [http://127.0.0.1:5000](http://127.0.0.1:5000) 并点击 **▶ Run Analysis**。
## 📊 检测结果示例

| 用户 | 路线 | 速度 | 威胁情报 | 风险评分 | 严重程度 |
|---|---|---|---|---|---|
| aditya | 孟买 → 勃兰登堡,德国 | 189,373 km/h | VPN | 80/100 | CRITICAL |
| arjun | 孟买 → TOR 节点,德国 | 189,373 km/h | VPN | 80/100 | CRITICAL |
| priya | 孟买 → 圣保罗,巴西 | 41,346 km/h | Hosting | 70/100 | HIGH |
| john | 美国 → 拉各斯,尼日利亚 | 25,328 km/h | Clean | 60/100 | HIGH |
## ✅ 分析师分诊工作流

每个警报的初始状态均为 **OPEN**。分析师可以:
- 点击 **✓ Approve** 将警报标记为合法的商务旅行
- 该记录将永久保留在数据库中 —— 不会删除任何内容(保留审计追踪)
- 如果决策错误,点击 **↺ Undo** 重新开启
- 随时可以通过状态过滤表 -> Open / Approved

## ⚠️ 为什么未公开部署
此工具处理敏感的身份验证数据,旨在安全内部网络中运行 —— 与 Microsoft Sentinel、Splunk ES 和 CrowdStrike 使用的模型相同:
- 身份验证日志包含 PII(用户名、IP、位置)—— 公开部署将违反 GDPR / 印度的 DPDP 法案
- SOC 仪表板始终仅限内部访问 —— 公开的 URL 会让攻击者看到他们哪些 IP 被标记,从而做出相应调整
- 未实现用户身份验证 —— 任何拥有该 URL 的人都可以批准或重新开启警报,且没有审计追踪
- 正确的部署模型是在本地或私有云 VPC 中,而不是在面向公众的 URL 上
## 🎯 这展示了什么
- 身份验证日志的解析和分析
- 行为分析(UEBA —— 用户和实体行为分析)
- 实时威胁情报丰富
- 基于风险的警报优先级排序
- 在 Microsoft Sentinel 和 Splunk ES 等真实工具中使用的 SOC 分析师分诊工作流
## 📌 备注
- `GeoLite2-City.mmdb`、`alerts.db` 和 `venv/` 已被排除在此仓库之外(参见 `.gitignore`)
- 示例登录日志仅为演示目的而合成的数据
- ip-api.com 免费版限制为每分钟 45 次请求 —— 足以满足演示用途
标签:Flask, Python, 后端开发, 威胁情报, 安全运营, 开发者工具, 异常检测, 扫描框架, 无后门, 身份认证分析, 逆向工具