3mehmet3/threatlens
GitHub: 3mehmet3/threatlens
ThreatLens 是一款定期扫描 IP/域名资产并结合多源情报生成 0–100 风险评分的威胁情报监控应用,帮助团队持续评估和展示资产安全态势。
Stars: 0 | Forks: 0
# ThreatLens
一款定期扫描客户 IP/域名资产;结合外部 reputation 数据源(AbuseIPDB、VirusTotal)和自身的网络分析(DNS、TLS、HTTP header)生成 **0-100 风险评分**,并在 dashboard 中展示的威胁情报应用程序。
## 功能
- **网络分析**(无需 API key):DNS(A/AAAA/MX/NS)、TLS handshake(证书有效性、self-signed/expired 检测、TLS 版本)、HTTP 安全 header(HSTS、CSP、X-Frame-Options)以及服务器 banner 泄露
- **WHOIS 域名年龄**(无需 key):标记注册时间少于 30 天的新域名
- **Hosting/datacenter 检测**(无需 key):通过 ipinfo.io 检测 IP 是否属于 AWS、Google、Azure、DigitalOcean、OVH、Hetzner 等提供商
- **Reputation**(需要 API key):AbuseIPDB (IP)、VirusTotal (IP/domain)
- **风险评分**:通过加权信号生成 0-100 分数及 Low/Medium/High 标签
- **定期扫描**:通过 APScheduler 配置扫描间隔(默认 60 分钟)
- **并行扫描**:使用 ThreadPoolExecutor 同时扫描多个 asset(`SCAN_MAX_WORKERS`,默认 4)——在大量 asset 时有明显加速
- **Dashboard**:添加客户/asset、实时风险面板、扫描历史、手动“立即扫描”
## 安装
```
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # API key'leri (opsiyonel) doldurun
python app.py
```
通过浏览器访问:
### 加载示例数据(可选)
为了快速体验,您可以添加示例客户/asset 记录(此操作是幂等的,重复运行也是安全的):
```
python seed.py
```
在 Docker container 内部:
```
docker run --rm -v threatlens-data:/data --env-file .env threatlens python seed.py
```
## 配置 (`.env`)
| 变量 | 说明 | 默认值 |
|---|---|---|
| `ABUSEIPDB_API_KEY` | AbuseIPDB key(可选) | — |
| `VIRUSTOTAL_API_KEY` | VirusTotal key(可选) | — |
| `SCAN_INTERVAL_MINUTES` | 扫描间隔(分钟) | `60` |
| `SCAN_MAX_WORKERS` | 并行扫描 worker 数量 | `4` |
| `FLASK_HOST` / `FLASK_PORT` | 服务器地址 | `0.0.0.0` / `5000` |
| `FLASK_DEBUG` | Debug 模式 | `false` |
| `DATABASE_PATH` | SQLite 文件路径 | `threatlens.db` |
| `DNS_TIMEOUT` | DNS 查询 timeout(秒) | `5.0` |
| `TLS_TIMEOUT` | TLS handshake timeout(秒) | `8.0` |
| `HTTP_TIMEOUT` | HTTP 请求 timeout(秒) | `8.0` |
## API endpoint
| 方法 | 路径 | 说明 |
|---|---|---|
| `POST` | `/customers` | 添加客户 `{"name": "..."}` |
| `GET` | `/customers` | 列出客户 |
| `POST` | `/assets` | 添加 asset `{"customer_id", "target"}`(类型自动识别) |
| `GET` | `/assets` | 列出 asset |
| `POST` | `/scan` | 立即扫描所有 asset |
| `GET` | `/dashboard` | 获取每个 asset 的最新分数 |
| `GET` | `/history?asset_id=X` | 获取某个 asset 的扫描历史 |
| `GET` | `/health` | 健康检查 |
## 风险评分逻辑
| 信号 | 分数 |
|---|---|
| AbuseIPDB 分数 > 50 | +30 |
| VirusTotal 上 ≥3 个引擎标记为 "malicious" | +30 |
| TLS 证书无效/self-signed | +15 |
| 旧版 TLS(TLS 1.0/1.1) | +10 |
| 缺少关键安全 header(HSTS/CSP) | +10 |
| 域名注册时间少于 30 天 | +15 |
| IP 属于 hosting/datacenter 提供商 | +10 |
| 均未触发 | 5(基准安全分数) |
等级:**Low** 0-30 · **Medium** 31-60 · **High** 61-100
## 架构
```
app.py Flask giriş noktası + scheduler başlatma
config.py .env okuma
database.py SQLite şema + CRUD
analyzers/
network_analyzer.py DNS / TLS / HTTP header
reputation.py AbuseIPDB + VirusTotal
whois_lookup.py WHOIS domain yaşı
geo_lookup.py ipinfo.io hosting/datacenter tespiti
scorer.py risk skoru
scanner.py tüm asset'leri tarayan orkestrasyon
scheduler.py APScheduler periyodik tetikleme
routes/
customers.py müşteri/varlık ekleme
lookups.py dashboard / geçmiş / manuel tarama
templates/
index.html dashboard (vanilla JS)
```
## Docker
```
docker build -t threatlens .
docker run -p 5000:5000 \
-v threatlens-data:/data \
--env-file .env \
threatlens
```
数据库持久化存储在 `/data` volume 中。
## 单独测试模块
```
python -m analyzers.network_analyzer example.com # network analizi
python -m analyzers.reputation 8.8.8.8 # reputation (key gerekir)
python -m analyzers.whois_lookup google.com # WHOIS domain yaşı
python -m analyzers.geo_lookup 8.8.8.8 # hosting/datacenter tespiti
python -m analyzers.scorer # skorlama örnekleri
python scanner.py # tüm asset'leri tara
```
## 范围之外(后续可能会添加)
- 用户登录 / authentication
- 端口扫描(出于道德/法律原因未包含)
- 多个 scheduler interval
标签:GitHub, Python, Web仪表盘, 占用监测, 威胁情报, 实时处理, 开发者工具, 无后门, 网络安全, 网络测绘, 请求拦截, 资产管理, 逆向工具, 隐私保护