HeheYash/siem-dashboard
GitHub: HeheYash/siem-dashboard
自托管 SIEM 仪表盘,集成 syslog 日志接入、声明式事件关联检测与实时告警可视化。
Stars: 1 | Forks: 0
# 🛡️ Sentryline
**一个自托管的 SIEM 仪表盘 —— 集日志接入、事件关联和实时告警于一体。**
[](https://github.com/HeheYash/siem-dashboard/actions/workflows/ci.yml)
[](LICENSE)
[](requirements.txt)
[](https://fastapi.tiangolo.com/)
[](frontend/package.json)
[](.flake8)
[功能](#features) · [截图](#screenshots) · [架构](#architecture) · [快速开始](#quickstart) · [检测规则](#how-detection-works) · [测试](#testing)
Sentryline 从多个来源接入日志,将其标准化为统一的事件 schema,通过声明式规则集进行关联,以捕捉真实的攻击模式(暴力破解、端口扫描、SQL 注入尝试、恶意软件检测),发出告警,并在实时仪表盘中直观呈现所有这些信息。
本项目作为作品集项目开发,旨在展示日志接入 pipeline、检测工程、带身份验证的 REST API 设计以及实时安全运营 UI —— 它并非生产级 SIEM(请参阅[范围](#scope--limitations))。
## 截图
**概览** —— 一目了然地查看事件量、严重程度分布和最近的告警

**告警** —— 被关联引擎捕获的暴力破解攻击,按严重程度和风险评分排序

**事件日志** —— 每一个标准化事件组成的可搜索、可过滤的流

## 功能
| | |
|---|---|
| 🌐 **多源接入** | 实时 syslog 接收器(UDP + TCP)以及用于现有日志(`auth.log`、防火墙日志、IDS 转储)的文件上传 endpoint |
| 🧩 **标准化** | 无论源格式如何,每一行日志都映射到一个 `Event` schema —— 时间戳、源/目标 IP、用户、事件类型、严重程度、消息 |
| 🔎 **声明式关联引擎** | 检测逻辑位于 [`rules/correlation_rules.yaml`](rules/correlation_rules.yaml) 中 —— 添加或调整规则无需修改代码 |
| 🔗 **序列感知检测** | 捕捉诸如“来自同一 IP 的 5 次失败登录*紧接着*一次成功”之类的模式 —— 这比仅凭失败尝试是强得多的暴力破解信号 |
| 🔔 **疲劳感知告警** | 可配置的 webhook 通知(兼容 Slack),带有严重程度阈值,因此低优先级的告警不会在凌晨 3 点叫醒任何人 |
| 🔐 **JWT 身份验证** | Bcrypt 密码哈希,基于角色的访问控制(admin 与 analyst) |
| 📊 **实时仪表盘** | 事件量时间轴、严重程度分布、带有一键确认功能的工单式告警流、可搜索的事件日志 |
| ✅ **经过测试 + CI 流水线** | 涵盖身份验证、日志接入和关联逻辑的 Pytest 套件;GitHub Actions 会在每次推送时跨 Python 3.11–3.13 运行它 |
## 架构
```
syslog UDP/TCP ──┐
├──▶ normalize_event() ──▶ Event (SQLite/Postgres) ──▶ correlation engine ──▶ Alert ──▶ webhook
file upload ──────┘ │ (rules.yaml)
▼
FastAPI REST API ──▶ React dashboard
```
完整的设计说明,包括为什么这样构建,以及一次单一的暴力破解攻击是如何在系统中端到端流转的:[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。
## 项目结构
```
siem-dashboard/
├── backend/
│ ├── main.py FastAPI app, REST endpoints, background correlation loop
│ ├── models.py SQLAlchemy models: Event, Alert, User
│ ├── schemas.py Pydantic request/response models
│ ├── database.py DB engine/session setup (SQLite by default)
│ ├── auth.py JWT auth, password hashing
│ ├── ingestion.py Syslog UDP/TCP receiver, log file parser, normalization
│ ├── correlation.py Rule engine that evaluates rules against stored events
│ ├── alerting.py Webhook notification dispatch
│ └── sample_data/ Generates realistic demo data + a planted attack scenario
├── frontend/ React (Vite) dashboard
├── tests/ Pytest suite (auth, ingestion, correlation)
├── rules/correlation_rules.yaml Declarative detection rules
├── docs/ARCHITECTURE.md System design writeup
└── .github/workflows/ci.yml Lint + test + build, on every push
```
## 快速开始
### 后端
```
git clone https://github.com/HeheYash/siem-dashboard.git
cd siem-dashboard
python3 -m venv .venv
source .venv/bin/activate # .venv\Scripts\activate on Windows
pip install -r requirements.txt
# 用真实的示例事件 + 植入的 brute-force 攻击填充数据库
python3 -m backend.sample_data.generate_sample_logs
# 启动 API(同时启动 syslog receiver 和 background correlation loop)
uvicorn backend.main:app --reload --port 8000
```
首次运行时会创建 `siem.db` (SQLite) 和一个默认的 admin 用户:
```
username: admin
password: change-me-now
```
在你自己的机器以外的任何地方运行此命令之前,请设置 `SIEM_ADMIN_PASSWORD`。交互式 API 文档:`http://localhost:8000/docs`。
### 前端
```
cd frontend
npm install
npm run dev
```
打开 `http://localhost:3000` 并使用上述 admin 凭据登录。仪表盘每 15 秒轮询一次 API;使用 **Run correlation** 按钮可按需触发检测流程,无需等待后台循环(默认每 30 秒一次)。
### 接入真实日志
**Syslog** —— 将任何设备或 `rsyslog`/`syslog-ng` 配置指向此主机的 UDP 或 TCP 端口 `5140`(非特权端口;通过防火墙规则重映射到标准的 514 端口,或者以 root 身份运行并设置 `SIEM_SYSLOG_UDP_PORT`/`SIEM_SYSLOG_TCP_PORT`):
```
# 快速手动测试
logger -n localhost -P 5140 -T "Failed password for root from 203.0.113.5 port 4444 ssh2"
```
**文件上传** —— 带有日志文件和 `source_name` 查询参数的 `POST /ingest/file` 请求,或者使用仪表盘顶部栏中的 **Ingest log file** 按钮。
## 配置
| 环境变量 | 默认值 | 用途 |
|---|---|---|
| `SIEM_DATABASE_URL` | `sqlite:///./siem.db` | SQLAlchemy DSN —— 在生产环境中替换为 Postgres |
| `SIEM_SECRET_KEY` | dev key | JWT 签名密钥 —— 部署前**务必设置此项** |
| `SIEM_ADMIN_PASSWORD` | `change-me-now` | 自动创建的 admin 用户的密码 |
| `SIEM_CORRELATION_INTERVAL` | `30` | 后台关联处理之间的间隔秒数 |
| `SIEM_SYSLOG_UDP_PORT` / `SIEM_SYSLOG_TCP_PORT` | `5140` | syslog 接收器端口 |
| `SIEM_ALERT_WEBHOOK_URL` | unset | 用于通知的兼容 Slack 的入站 webhook |
| `SIEM_NOTIFY_MIN_SEVERITY` | `high` | 触发 webhook 的最低严重程度(`low`/`medium`/`high`/`critical`) |
| `SIEM_CORS_ORIGINS` | `http://localhost:3000` | 允许的前端来源,以逗号分隔 |
## 检测工作原理
规则位于 [`rules/correlation_rules.yaml`](rules/correlation_rules.yaml) 中,并按计时器定期评估。示例 —— 暴力破解成功规则:
```
- name: "Brute Force Followed By Success"
description: "5+ failed logins from a source IP, followed by a successful login."
group_by: source_ip
match:
event_type: auth_failure
threshold: 5
window_seconds: 300
followed_by:
event_type: auth_success
window_seconds: 60
severity: critical
risk_score: 90
```
此操作按 `source_ip` 对事件进行分组,等待在 5 分钟时间窗口内出现 5 次或更多 `auth_failure` 事件,然后检查*同一 IP* 是否在 60 秒内发生了 `auth_success`。如果发生,系统将发出严重告警,并引用每一个相关事件以便进行取证调查。
## 测试
```
pip install -r requirements-dev.txt
pytest tests/ --cov=backend --cov-report=term-missing
flake8 backend/
```
该套件涵盖了登录/身份验证失败路径、事件接入和标准化,以及最关键的部分 —— 验证关联引擎既能捕捉到真实的暴力破解序列,*又*不会对分散、不相关的失败尝试产生误报。该测试通过 [GitHub Actions](.github/workflows/ci.yml) 在每次推送时自动运行,覆盖 Python 3.11、3.12 和 3.13 版本,并进行前端生产构建检查。
## 范围与限制
这是一个作品集/演示项目,而不是生产级 SIEM。真实的部署还需要:用于大容量接入的横向扩展能力(本项目使用单一的 SQLite/Postgres 实例)、用于大规模事件表的时间序列存储、身份验证上的速率限制和 refresh token,以及针对特定供应商日志格式的更广泛的解析器库(本项目使用正则表达式/关键词启发式方法,这对于 `sshd` 和 `iptables` 等常见格式很有效,但无法完美解析所有专有格式)。
## 贡献
欢迎提交 Bug 报告和 PR —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 许可证
[MIT](LICENSE)标签:AV绕过, CISA项目, FastAPI, React, Syscalls, 安全告警, 安全运营, 扫描框架, 插件系统, 时间线生成, 逆向工具