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, 安全事件响应, 工单系统, 版权保护, 状态机, 网络测绘, 网络研究, 逆向工具