Aiyeesha/incident-response-tracker
GitHub: Aiyeesha/incident-response-tracker
一款基于 FastAPI 和 React 的安全事件工单系统,通过强制状态机和分级 SLA 计时器确保每个安全事件都按规范流程被跟踪和解决。
Stars: 0 | Forks: 0
# 🚨 Incident Response Tracker
*[下方为法文版本](#-incident-response-tracker-1)*
一个用于安全事件的工单工作流 —— 将原始警报转化为受跟踪的案件,具有强制执行的生命周期、基于严重程度的 SLA 计时器,以及记录每次状态更改、评论和分配的带时间戳审计跟踪。
## 为什么做这个项目
警报仪表板只是工作的一半 —— 必须有人负责每一个警报,直到它真正被解决,并证明它遵循了 SLA。这个跟踪器强制执行该工作流,而不是将其留给惯例:你不能直接从“新建”跳转到“已解决”,每一次转换都会根据明确的合法操作集进行验证,并且每个操作都会留下带时间戳的痕迹。
## 功能
- **强制执行的生命周期** — `new → triaged → investigating → contained →
resolved → closed`,误报可直接转为已关闭,如果问题复发也可以从已关闭恢复至调查中
- **非法转换被拒绝并返回明确的 409** — 例如,`new → resolved`
会被拒绝,并返回实际允许的下一个状态列表
- **按严重程度划分的 SLA 计时器** — 严重:4小时,高:24小时,中:72小时,低:7
天 — 从创建时间开始计算,违约时标记为逾期
- **审计跟踪** — 每次状态更改、评论和分配都会附加到按事件划分的时间线中,包含操作者、消息和时间戳
- **MTTC**(平均关闭时间)根据实际已关闭的事件计算
- **按状态过滤**,并在统计面板中显示逾期计数
## 架构
```
┌─────────────┐ REST (fetch) ┌──────────────────────┐
│ React UI │ ───────────────► │ FastAPI routers │
│ (Vite/TS) │ ◄─────────────── │ incidents / stats │
└─────────────┘ └──────────┬─────────────┘
│
┌────────▼────────┐
│ state_machine.py │ ← pure, unit-tested
└────────┬────────┘ transition + SLA rules
┌────────▼────────┐
│ crud.py │ (timeline + orchestration)
└────────┬────────┘
┌────────▼────────┐
│ SQLAlchemy │
│ (SQLite) │
└──────────────────┘
```
`state_machine.py` 包含了真正定义产品行为的两件事 —— 哪些转换是合法的,以及 SLA 截止日期是如何计算的 ——
作为没有 I/O 的纯函数。这使得工作流规则可以独立于数据库和 API 层进行单元测试。
## 技术栈
| 层级 | 技术 |
|-------|------------|
| 后端 | Python 3.11+、FastAPI、SQLAlchemy |
| 数据库 | SQLite(基于文件,零配置) |
| 认证 | 在所有更改操作的 endpoint 上使用 API key(创建、转换、评论、分配) |
| 前端 | React 18、TypeScript、Vite |
| 测试 | Pytest — 状态机单元测试 + 完整的 API 测试 |
| 容器 | Docker Compose |
## 快速开始
### 使用 Docker Compose
```
docker-compose up
```
然后打开 [http://localhost:5175](http://localhost:5175)。
### 手动设置
**后端**
```
cd backend
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
cp .env.example .env
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8002
```
**前端**
```
cd frontend
npm install
npm run dev
```
### 运行测试
```
cd backend
pip install -r requirements-dev.txt
pytest -v
```
## API 参考
| 方法 | Endpoint | 认证 | 描述 |
|--------|----------|------|-------------|
| `GET` | `/api/incidents` | — | 列出事件(可选 `?status=triaged&severity=high&limit=50`) |
| `POST` | `/api/incidents` | `X-API-Key` | 创建事件(初始状态为 `new`) |
| `GET` | `/api/incidents/{id}` | — | 事件详情,包含其完整的时间线 |
| `PATCH` | `/api/incidents/{id}/status` | `X-API-Key` | 转换状态;如果操作不合法则返回 `409` |
| `POST` | `/api/incidents/{id}/comments` | `X-API-Key` | 在时间线上附加评论 |
| `PATCH` | `/api/incidents/{id}/assign` | `X-API-Key` | 分配/重新分配事件 |
| `GET` | `/api/stats` | — | 总计、打开/逾期计数、MTTC |
后端运行后,可在 `/docs` 查看交互式 OpenAPI 文档。
## 项目结构
```
.
├── backend/
│ ├── app/
│ │ ├── main.py # App factory, lifespan (DB init + seed)
│ │ ├── config.py # Settings
│ │ ├── database.py # SQLAlchemy engine/session
│ │ ├── models.py # IncidentORM, TimelineEventORM
│ │ ├── schemas.py # Pydantic schemas (Incident exposes a computed `ref`, e.g. INC-0001)
│ │ ├── state_machine.py # Legal transitions + SLA targets (pure, unit-tested)
│ │ ├── crud.py # Timeline-aware orchestration
│ │ ├── security.py # API-key dependency
│ │ ├── seed_data.py # Demo incidents across the whole lifecycle
│ │ └── routers/
│ │ ├── incidents.py
│ │ └── stats.py
│ ├── tests/
│ │ ├── test_state_machine.py # Pure unit tests, no DB
│ │ └── test_api.py
│ ├── requirements.txt
│ ├── requirements-dev.txt
│ ├── .env.example
│ └── Dockerfile
├── frontend/
│ └── src/
│ ├── api/client.ts
│ ├── hooks/useIncidents.ts
│ └── components/
│ ├── StatsPanel.tsx
│ ├── IncidentTable.tsx
│ └── IncidentDetailPanel.tsx
└── docker-compose.yml
```
## 已知限制
- 操作者身份是一个自由文本字段,而不是经过身份验证的用户账户 ——
适合用于演示,在生产环境中使用需要真正的身份验证(以及针对每个分析师的权限)
- 当 SLA 即将违约时没有通知 —— 仪表板会显示逾期事件,但不会推送任何警报
- 单个 SQLite 文件,与相关项目有相同的警告:适合用于演示,在多实例并发使用时需要 Postgres
## 许可证
MIT
# 🚨 Incident Response Tracker
*[上方为英文版本](#-incident-response-tracker)*
一个用于安全事件的工单工作流 —— 将原始警报转化为受跟踪的案件,具有强制执行的生命周期、基于严重程度的 SLA 计时器,以及记录每次状态更改、评论和分配的带时间戳审计跟踪。
## 为什么做这个项目
警报仪表板只是工作的一半 —— 必须有人负责每一个警报,直到它真正被解决,并证明遵循了 SLA。这个跟踪器强制执行该工作流,而不是将其留给惯例:不可能直接从“新建”跳转到
“已解决”,每一次转换都会根据明确的合法操作集进行验证,并且每个操作都会留下带时间戳的痕迹。
## 功能
- **强制执行的生命周期** — `nouveau → trié → en investigation → contenu →
résolu → clôturé`,误报可直接转为已关闭,如果事件复发也可以从已关闭恢复至调查中
- **非法转换被拒绝并返回明确的 409** — 例如,`nouveau →
résolu` 会被拒绝,并返回实际允许的下一个状态列表
- **按严重程度划分的 SLA 计时器** — 严重:4小时,高:24小时,中:72小时,
低:7天 — 从创建时间开始计算,违约时标记为逾期
- **审计跟踪** — 每次状态更改、评论和
分配都会附加到按事件划分的时间线中,包含操作者、消息和时间戳
- **MTTC**(平均关闭时间)根据实际已关闭的事件计算
- **按状态过滤**,并在统计面板中显示逾期计数
## 架构
```
┌─────────────┐ REST (fetch) ┌──────────────────────┐
│ UI React │ ───────────────► │ Routers FastAPI │
│ (Vite/TS) │ ◄─────────────── │ incidents / stats │
└─────────────┘ └──────────┬─────────────┘
│
┌────────▼────────┐
│ state_machine.py │ ← règles de transition
└────────┬────────┘ et de SLA, pures, testées
┌────────▼────────┐
│ crud.py │ (orchestration + timeline)
└────────┬────────┘
┌────────▼────────┐
│ SQLAlchemy │
│ (SQLite) │
└──────────────────┘
```
`state_machine.py` 包含了真正定义产品行为的两件事 —— 哪些转换是合法的,以及如何计算
SLA 截止日期 ——
作为没有 I/O 的纯函数。这使得工作流规则可以独立于数据库和 API 层进行单元测试。
## 技术栈
| 层级 | 技术 |
|--------|-------------|
| 后端 | Python 3.11+、FastAPI、SQLAlchemy |
| 数据库 | SQLite(本地文件,零配置) |
| 认证 | 在所有更改操作的 endpoint 上使用 API key(创建、转换、评论、分配) |
| 前端 | React 18、TypeScript、Vite |
| 测试 | Pytest — 状态机单元测试 + 完整的 API 测试 |
| 容器 | Docker Compose |
## 快速开始
### 使用 Docker Compose
```
docker-compose up
```
然后打开 [http://localhost:5175](http://localhost:5175)。
### 手动安装
**后端**
```
cd backend
python -m venv .venv && source .venv/bin/activate # Windows : .venv\Scripts\activate
cp .env.example .env
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8002
```
**前端**
```
cd frontend
npm install
npm run dev
```
### 运行测试
```
cd backend
pip install -r requirements-dev.txt
pytest -v
```
## API 参考
| 方法 | Endpoint | 认证 | 描述 |
|---------|----------|------|--------------|
| `GET` | `/api/incidents` | — | 事件列表(可选 `?status=triaged&severity=high&limit=50`) |
| `POST` | `/api/incidents` | `X-API-Key` | 创建事件(初始状态为 `new`) |
| `GET` | `/api/incidents/{id}` | — | 事件详情,包含其完整的时间线 |
| `PATCH` | `/api/incidents/{id}/status` | `X-API-Key` | 转换状态;如果操作不合法则返回 `409` |
| `POST` | `/api/incidents/{id}/comments` | `X-API-Key` | 在时间线上附加评论 |
| `PATCH` | `/api/incidents/{id}/assign` | `X-API-Key` | 分配/重新分配事件 |
| `GET` | `/api/stats` | — | 总计、打开/逾期计数、MTTC |
后端运行后,可在 `/docs` 查看交互式 OpenAPI 文档。
## 项目结构
```
.
├── backend/
│ ├── app/
│ │ ├── main.py # Factory de l'app, lifespan (init DB + seed)
│ │ ├── config.py # Configuration
│ │ ├── database.py # Moteur/session SQLAlchemy
│ │ ├── models.py # IncidentORM, TimelineEventORM
│ │ ├── schemas.py # Schémas Pydantic (Incident expose un `ref` calculé, ex. INC-0001)
│ │ ├── state_machine.py # Transitions légales + cibles SLA (pur, testé)
│ │ ├── crud.py # Orchestration consciente de la chronologie
│ │ ├── security.py # Dépendance clé API
│ │ ├── seed_data.py # Incidents de démo couvrant tout le cycle de vie
│ │ └── routers/
│ │ ├── incidents.py
│ │ └── stats.py
│ ├── tests/
│ │ ├── test_state_machine.py # Tests unitaires purs, sans DB
│ │ └── test_api.py
│ ├── requirements.txt
│ ├── requirements-dev.txt
│ ├── .env.example
│ └── Dockerfile
├── frontend/
│ └── src/
│ ├── api/client.ts
│ ├── hooks/useIncidents.ts
│ └── components/
│ ├── StatsPanel.tsx
│ ├── IncidentTable.tsx
│ └── IncidentDetailPanel.tsx
└── docker-compose.yml
```
## 已知限制
- 操作者身份是一个自由文本字段,而不是经过身份验证的用户账户 ——
适合用于演示,在生产环境中使用需要真正的身份验证(以及针对每个分析师的权限)
- 当 SLA 即将违约时没有通知 —— 仪表板会显示逾期事件,但不会推送任何警报
- 单个 SQLite 文件,与相关项目有相同的限制:适合用于演示,在多实例并发使用时需要 Postgres
## 许可证
MIT
标签:AV绕过, FastAPI, React, SLA跟踪, Syscalls, 安全事件响应, 工单系统, 版权保护, 状态机, 网络测绘, 网络研究, 逆向工具