hokytawio/CloudFlare-Threat-Landscape-Monitor
GitHub: hokytawio/CloudFlare-Threat-Landscape-Monitor
基于 Cloudflare Radar API 构建的葡萄牙区域威胁情报实时仪表板,以可视化方式呈现 DDoS 攻击、bot 流量和网络异常等安全态势数据。
Stars: 0 | Forks: 0
Radar PT — 威胁态势仪表板
面向葡萄牙的威胁情报仪表板,在
[Cloudflare Radar API](https://developers.cloudflare.com/radar/) 的基础上构建(在 AI 的辅助下)。实时
显示针对葡萄牙的 DDoS 攻击(layer 3/4 和 layer 7)、来源国家/地区、
IPv6 采用率、自动化流量(bot)百分比,以及 Cloudflare 报告的流量
异常。
- 项目初衷
我构建此项目作为我向 SOC/Blue Team 分析师转型的一部分——目标不仅是“拥有一个漂亮的仪表板”,而是练习我当前
工作中每天使用的技能(关联安全数据、设计检测、思考监控
系统的可靠性),并将其应用于我所在公司的封闭
环境之外,结合真实的公开威胁情报 API。
- 架构
```
┌─────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ Browser │──HTTP──▶│ Backend FastAPI │──HTTP──▶│ Cloudflare Radar │
│ React/Vite │◀────────│ (proxy + cache) │◀────────│ API │
└─────────────┘ └──────────────────┘ └────────────────────┘
```
前端从不直接与 Cloudflare 通信。所有请求
都经过自建的 backend,它会:
- 将 API token 保存在浏览器无法访问的位置;
- 在内存中进行缓存(TTL 为 60 秒),以免耗尽 Radar API 的速率限制
或重复不必要的调用;
- 在将错误返回给客户端之前对其进行标准化(参见安全章节)。
```
backend/ FastAPI — chama a Radar API com o token e faz cache
└── app/
├── main.py entrypoint + CORS
├── config.py settings via .env (pydantic-settings)
├── radar_client.py cliente HTTP + cache TTL
└── routers/radar.py endpoints consumidos pelo frontend
frontend/ React + Vite + Tailwind + Recharts
└── src/
├── App.jsx fetch de dados + parsing defensivo do JSON
├── api.js wrapper de chamadas ao backend
└── components/
├── Header.jsx relógio + indicador live/erro
├── RadarSweep.jsx elemento assinatura: radar giratório com os
│ países de origem dos ataques como "blips"
├── AttacksTimeline.jsx layer3 vs layer7 ao longo do tempo
├── StatCard.jsx
└── AnomaliesFeed.jsx
```
- 技术栈
**Backend:** Python, FastAPI, httpx (async), pydantic-settings
**Frontend:** React 18, Vite, Tailwind CSS, Recharts
**数据源:** Cloudflare Radar API v4(endpoint 包括 `attacks/layer3`、
`attacks/layer7`、`http/summary/*`、`annotations`)
- 解决的技术挑战
代码审查中发现的实际问题:
1. 异常 endpoint 需要强制的时间范围**
`/radar/annotations` endpoint 返回 `400 Bad Request` 并带有提示
`"You must send either range or start & end dates"`。最初的请求并未
包含 `dateRange`。修复方法:在 backend 中添加缺失的参数。
单凭这一点并不算严重——但它揭示了第二个问题:
2. 单个 endpoint 失败会导致整个仪表板崩溃**
前端使用 `Promise.all()` 并行请求 6 个 endpoint。
只要**一个** promise 失败,`Promise.all` 就会拒绝,这意味着其他
5 个图表——本来已经有有效数据——仅仅因为异常 endpoint 就会卡在
错误状态。使用
`Promise.allSettled()` 修复:每个 widget 独立处理其自己的结果,
并且只有在**所有**请求都失败时,仪表板才会显示错误。这
与任何生产环境监控面板所期望的**优雅降级**是相同的原则——SIEM 不会因为特定的
数据源宕机而致盲。
3. 速率限制 / 环境配置**
backend 中 60 秒的缓存 TTL 专门用于避免在开发期间耗尽
Radar API 的速率限制,因为前端
每 5 分钟自动重新查询一次数据,并且在每次手动刷新页面时也会查询。
安全考量!
我将其视为内部包含有效凭证的任何服务来处理,即使
这是一个本地项目:
| 风险 | 状态 |
|---|---|
| token 暴露在浏览器端 | 已缓解——token 仅存在于 backend |
| token 被提交到 git | 已缓解——`.gitignore` 排除了 `backend/.env` |
| 通过错误消息泄露内部细节 | 已缓解——upstream 错误仅保留在服务器日志中;客户端
接收通用错误消息 |
| 通过 API 数据进行 XSS | 默认已缓解——React 默认会对文本进行转义;未使用 `dangerouslySetInnerHTML` |
| 某个 endpoint 宕机导致一切崩溃 | 已缓解——`Promise.allSettled` + 按 widget 实现
优雅降级 |
| backend 未经认证暴露 | **未缓解**——设计为在 `localhost` 运行。如果公开暴露,任何人都可以调用
`/api/*` 并耗尽 token 配额(open proxy)。前端需要加入
专属认证 |
| 自身 endpoint 无速率限制 | **未缓解**——60 秒的缓存有所帮助,但并不能防止对 backend 的直接
滥用 |
| token 权限范围 | 取决于始终使用“Radar”模板(read-only),绝对不要使用具有
zone/DNS 访问权限的 token |
如果你想在本地测试,请遵循以下教程:
#1. 获取 Cloudflare Radar token
1. https://dash.cloudflare.com/profile/api-tokens
2. **Create Token** → 模板 **"Radar"**(或带有 `Account > Radar > Read` 的自定义配置)
3. 保存 token——它只会显示一次
4. Backend
```
cd backend
python -m venv venv
venv\Scripts\activate # Windows (PowerShell: venv\Scripts\Activate.ps1)
# source venv/bin/activate # macOS/Linux
pip install -r requirements.txt
copy .env.example .env # macOS/Linux: cp .env.example .env
# 编辑 .env 并粘贴 CLOUDFLARE_API_TOKEN
uvicorn app.main:app --reload --port 8000
```
在 http://localhost:8000/health 确认
3. Frontend
```
cd frontend
npm install
npm run dev
```
打开 http://localhost:5173
理想化者?
Octávio Garcia,在 Claudinho(AKA CLAUDE AI)的协助下完成!
Cybersecurity - SOC - Blue Team analyst.
标签:自定义脚本, 运行时操纵, 逆向工具