gokul-dev47/siem-platform
GitHub: gokul-dev47/siem-platform
基于ELK Stack与Flask构建的生产级SIEM平台,提供实时威胁检测、告警与日志分析能力。
Stars: 0 | Forks: 0
# 🛡️ SIEM 平台
## 📸 截图
| 仪表盘 | 日志 | 告警 |
|-----------|------|--------|
|  |  |  |
| 规则 | 攻击地图 | 设置 |
|-------|-----------|----------|
|  |  |  |
## 🚀 快速开始 (Ubuntu/Debian)
### 前置条件
```
# 安装 Docker + Docker Compose
sudo apt update && sudo apt install -y docker.io docker-compose-plugin git curl
sudo usermod -aG docker $USER
newgrp docker
# 验证
docker --version
docker compose version
```
### 运行平台
```
# 1. Clone
git clone https://github.com/YOUR_USERNAME/siem-platform.git
cd siem-platform
# 2. 配置环境
cp .env.example .env
# 可选:将 SLACK_WEBHOOK_URL 添加到 .env 以接收 Slack 警报
# 3. 启动所有服务
docker compose up -d --build
# 4. 查看启动过程(Elasticsearch 大约需要 60-90 秒)
docker compose logs -f elasticsearch siem-backend
# 5. 在浏览器中打开(一旦后端显示 "SIEM Backend loaded")
open http://localhost # Main dashboard
open http://localhost/health # Service health JSON
open http://localhost/kibana # Kibana (takes ~2 min)
```
### 全部运行?你会看到
```
$ docker compose ps
NAME STATUS PORTS
siem-elasticsearch Up (healthy) 0.0.0.0:9200->9200/tcp
siem-kibana Up (healthy) 0.0.0.0:5601->5601/tcp
siem-logstash Up (healthy) 0.0.0.0:5044->5044/tcp
siem-redis Up (healthy) 0.0.0.0:6379->6379/tcp
siem-postgres Up (healthy) 0.0.0.0:5432->5432/tcp
siem-backend Up (healthy) 0.0.0.0:8000->8000/tcp
siem-log-generator Up (no ports, internal)
siem-nginx Up (healthy) 0.0.0.0:80->80/tcp
```
## 🏗️ 架构
```
┌─────────────────────────────────────┐
│ Docker Network (172.20.x.x) │
│ │
Browser ──────────────▶ Nginx (80/443) │
│ │ │
│ ├──▶ Flask Backend (:8000) │
│ │ │ │
│ │ ├──▶ Elasticsearch │
│ │ ├──▶ Redis (alerts) │
│ │ ├──▶ PostgreSQL │
│ │ └──▶ Slack Webhook │
│ │ │
│ └──▶ Static Frontend (5 pages) │
│ │
Log Generator ────────────▶ Elasticsearch (direct ingest) │
│ │ │
Logstash ─────────────────▶ Elasticsearch (Beats/TCP) │
│ │
└─────────────────────────────────────┘
```
### 数据流
1. **Log Generator** 每 5 秒运行一次,模拟 SSH 暴力破解、端口扫描、SQLi、XSS、LFI、RCE
2. 事件直接写入 **Elasticsearch** (`siem-logs-YYYY.MM.DD` 索引)
3. 事件计数器在 **Redis** 中递增 (以规则 ID 为键)
4. **Flask** APScheduler 每 60 秒评估一次规则 — 如果计数器 ≥ 阈值 → 在 **PostgreSQL** 中创建告警
5. 告警通过 **Socket.IO WebSocket** 广播给所有已连接的浏览器客户端
6. 如果设置了 `SLACK_WEBHOOK_URL`,将发送 Slack 通知
7. **Kibana** 连接到 Elasticsearch 进行深入分析
## 📁 文件结构
```
siem-platform/
├── docker-compose.yml # All 8 services with health checks
├── .env.example # Environment variable template
├── .gitignore
├── README.md
│
├── backend/
│ ├── Dockerfile # Python 3.11 + gunicorn/eventlet
│ ├── requirements.txt
│ ├── app.py # Flask + SocketIO + alerting engine
│ └── alert_rules.json # 8 detection rules (configurable)
│
├── log-generator/
│ ├── Dockerfile
│ └── log_generator.py # Simulates: SSH BF, SQLi, XSS, LFI, RCE, port scans
│
├── frontend/
│ ├── index.html # Dashboard — stat widgets + 4 charts + live feed
│ ├── logs.html # Searchable table with syntax highlighting
│ ├── alerts.html # Card grid with status management
│ ├── rules.html # Toggle + threshold editor per rule
│ ├── map.html # Canvas attack map with animated arcs
│ ├── settings.html # Health check + Slack/email config
│ ├── style.css # Cyber Ops dark theme
│ └── dashboard.js # WebSocket + Chart.js + easter egg (Ctrl+Shift+S)
│
├── logstash/
│ ├── pipeline/siem.conf # TCP + Syslog + Beats input → ES output
│ └── config/logstash.yml
│
├── nginx/
│ └── nginx.conf # Reverse proxy + rate limiting + WS upgrade
│
├── postgres/
│ └── init.sql # Schema: alerts, blocked_ips, audit_log
│
└── .github/
└── workflows/ci.yml # GitHub Actions: lint + build on push
```
## 🔔 Slack 集成
1. 访问 https://api.slack.com/apps → 创建应用 (Create App) → Incoming Webhooks
2. 启用 Incoming Webhooks → 添加新 Webhook (Add New Webhook) → 选择频道
3. 复制 webhook URL
4. 添加到 `.env`:
```
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T.../B.../...
```
5. 重启后端:
```
docker compose restart siem-backend
```
发送到 Slack 的告警格式:
```
🔴 SIEM ALERT [CRITICAL]
Rule: SSH_BRUTE_FORCE
Severity: critical
Count: 23
Description: SSH brute force from 103.45.67.89 (23 attempts in 60s)
```
## 🔎 检测规则
| 规则 ID | 严重性 | 阈值 | 时间窗口 | 描述 |
|---------|----------|-----------|--------|-------------|
| SSH_BRUTE_FORCE | 严重 | 5 | 60s | 来自同一 IP 的 SSH 登录失败 |
| RCE_ATTEMPT | 严重 | 1 | 60s | 检测到远程代码执行 payload |
| SQL_INJECTION | 高 | 1 | 60s | HTTP 参数中的 SQLi 模式 |
| PORT_SCAN | 高 | 20 | 30s | 针对多个端口的 SYN 扫描 |
| AUTH_SPRAY | 高 | 15 | 300s | 多个不同用户的认证失败 |
| XSS_ATTEMPT | 中 | 3 | 60s | 请求中的 XSS payload |
| DIR_TRAVERSAL | 中 | 3 | 60s | 路径遍历模式 |
| SUSPICIOUS_UA | 中 | 1 | 60s | sqlmap / nikto / nmap user-agent |
编辑 `backend/alert_rules.json` 并重启以更改阈值。或者使用 UI 中的规则页面。
## 🐳 Docker 命令参考
```
# 启动
docker compose up -d
# 构建 + 启动(在代码更改后)
docker compose up -d --build
# 查看所有日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f siem-backend
docker compose logs -f log-generator
# 检查健康状态
curl http://localhost/health | python3 -m json.tool
# 停止所有内容
docker compose down
# 停止 + 删除所有数据(完全清理)
docker compose down -v
# 重启单个服务
docker compose restart siem-backend
# 通过 Shell 进入 backend
docker compose exec siem-backend bash
# 直接查询 Elasticsearch
curl http://localhost:9200/siem-logs-*/_count
curl http://localhost:9200/_cat/indices?v
```
## 📊 Kibana 设置(可选深入分析)
1. 打开 http://localhost/kibana
2. 转到 **Stack Management → Index Patterns**
3. 创建模式:`siem-logs-*`,时间字段:`@timestamp`
4. 转到 **Discover** → 选择 `siem-logs-*`
5. 你将看到来自日志生成器的所有事件
建议添加到你的简历截图中的 Kibana 可视化:
- 按严重性划分的事件时间序列
- 前 10 个源 IP(数据表)
- 攻击类型分布(饼图)
## 🛠️ 故障排除
| 问题 | 修复方法 |
|---------|-----|
| Elasticsearch 无法启动 | 将 Docker 内存增加到 4GB:Docker Desktop → Settings → Resources |
| "max virtual memory areas vm.max_map_count [65530] is too low" | `sudo sysctl -w vm.max_map_count=262144` |
| 后端不断重启 | `docker compose logs siem-backend` — 通常是因为 ES 尚未准备好,请等待 60 秒 |
| 仪表盘无数据 | 检查 log-generator:`docker compose logs log-generator` |
| 80 端口被占用 | 更改 docker-compose.yml 中的 nginx 端口:`"8080:80"` |
## 🎯 简历价值
本项目展示了印度产品公司实际安全工程岗位中所使用的技能:
**蓝队 / SOC 技能:**
- 日志摄取和标准化(ELK Stack — 在 Razorpay, Flipkart, Swiggy 等公司使用)
- 具有可配置阈值的实时告警
- OWASP Top 10 攻击模式检测(SQLi, XSS, LFI, RCE)
- 事件管理工作流(打开 → 调查中 → 已关闭)
**DevSecOps 技能:**
- 带有健康检查和重启策略的 Docker Compose
- GitHub Actions CI/CD pipeline
- 具有速率限制的 Nginx 反向代理
- 具有内部网络的服务网格
**开发技能:**
- Python(Flask, APScheduler, Elasticsearch 客户端)
- WebSocket 实时通信(Socket.IO)
- PostgreSQL schema 设计 + Redis 缓存
- 原生 JS + Chart.js 数据可视化
**简历要点:**
## 👤 作者
**Gokul** — 计算机科学工程(网络安全)最后一年
印度泰米尔纳德邦
社区:[nullchennai](https://nullchennai.in)
## 📝 许可证
MIT — 可自由用于学习和作品集目的。
标签:AMSI绕过, Docker, ELK Stack, Flask, 内容过滤, 后端开发, 威胁检测, 安全运营, 安全防御评估, 扫描框架, 搜索引擎查询, 测试用例, 请求拦截, 逆向工具