nathanlopes45/siem
GitHub: nathanlopes45/siem
一个从零自建的 SIEM 后端实验室项目,通过自定义日志摄取、事件关联规则和自动化告警来深入实践检测工程。
Stars: 0 | Forks: 0
# SIEM — 安全信息与事件管理 (Security Information & Event Management) 实践实验室
一个自定义构建的 SIEM 后端,能够摄取日志、关联事件,并对可疑活动发出警报 —— 从零开始构建,以理解检测工程在底层的实际运作方式,而不是仅仅操作别人的工具。
## 为什么会有这个项目
简历上的大多数 SIEM 经验都来自于点击 Splunk 或 Sentinel 的仪表板。这个项目更深入了一层:自己设计日志 schema、编写关联逻辑,并亲自权衡检测的取舍(误报、警报疲劳、时间窗口大小设定)。
## 架构
```
┌─────────────┐
raw logs ───► │ FastAPI │
│ (ingest + │
│ detection) │
└──────┬──────┘
│
▼
┌─────────────┐
│ PostgreSQL │
│ hosts/logs/ │
│ alerts │
└─────────────┘
```
- **API 层**:使用 FastAPI,处理日志摄取,并提供针对主机、日志和警报的查询 endpoint
- **存储**:通过 SQLAlchemy ORM 使用 PostgreSQL
- **检测引擎**:在每次写入时针对摄取的日志运行关联规则(路线图:将其转移至异步后台 worker —— 见下文)
- **部署**:使用 Docker Compose 完全容器化(API + Postgres)
## 已实现的检测
| 检测项 | 逻辑 | MITRE ATT&CK |
|---|---|---|
| 暴力破解尝试 | 同一 IP 针对某主机的失败密码尝试 ≥5 次 | [T1110 – Brute Force](https://attack.mitre.org/techniques/T1110/) |
| 快速暴力破解 | 同一 IP 在 2 分钟窗口内失败尝试 ≥5 次 | T1110(限时变体) |
| 成功的暴力破解 | 某个 IP 在之前发生 ≥5 次失败尝试后成功登录 | T1110 → T1078(Valid Accounts,失陷后阶段) |
| 威胁情报匹配 | 日志包含已知恶意 IP 列表中的源 IP | [T1071 – Application Layer Protocol](https://attack.mitre.org/techniques/T1071/)(C2 基础设施重用) |
## 技术栈
- **后端**:Python, FastAPI, SQLAlchemy
- **数据库**:PostgreSQL
- **容器化**:Docker, Docker Compose
- **检测工程**:自定义关联规则(基于正则表达式的日志解析、IP 提取、时间窗口聚合)
## 快速开始
### 前置条件
- 已安装 Docker 和 Docker Compose
### 设置
```
git clone https://github.com/nathanlopes45/siem.git
cd siem
cp .env.example .env
# 编辑 .env 并为 POSTGRES_PASSWORD 设置一个真实的密码
docker compose up --build
```
API 将在 `http://localhost:8000` 提供。
### 验证运行状态
```
curl http://localhost:8000/
# {"status":"SIEM backend running with database connected"}
```
## API 用法
### 注册主机
```
curl -X POST "http://localhost:8000/hosts?hostname=web-server-01&ip_address=10.0.0.5&os_type=linux"
```
### 摄取日志
```
curl -X POST "http://localhost:8000/logs" \
-d "host_id=" \
-d "log_source=sshd" \
-d "raw_log=Failed password for root from 185.220.101.1 port 4444 ssh2"
```
### 列出主机
```
curl http://localhost:8000/hosts
```
### 查询日志(可选:按主机或源进行过滤)
```
curl "http://localhost:8000/logs?host_id=&log_source=sshd"
```
### 查看触发的警报
```
curl http://localhost:8000/alerts
```
## 本仓库的安全实践
- 不提交任何密钥 —— 凭据从被 gitignore 忽略的 `.env` 文件中加载,并以 `.env.example` 作为模板
- 集成了 `detect-secrets` 基线扫描,以便在意外泄露凭据被推送前将其捕获
- 数据库连接重试/健康检查逻辑,以避免容器启动时出现竞态条件
## 路线图
- [ ] 针对 syslog/auth.log 格式的真实日志解析器(使用结构化字段,而非单一的正则表达式 IP 提取)
- [ ] 将检测引擎转移至异步后台 worker,使其与日志摄取请求路径解耦
- [ ] 跨主机关联(例如,同一个攻击者 IP 攻击多个主机 —— 横向移动 / 凭据填充信号)
- [ ] API 身份验证
- [ ] 警报集成(针对新警报的 Slack/webhook 通知)
- [ ] LLM 辅助的警报分诊:根据原始日志上下文生成的自然语言事件摘要和严重性建议
- [ ] 用于可视化警报和日志量随时间变化的仪表板
- [ ] 针对检测逻辑的自动化测试套件
## 许可证
MIT
标签:AV绕过, FastAPI, FOFA, PostgreSQL, 测试用例, 版权保护, 红队行动, 请求拦截, 逆向工具