gokul-dev47/siem-platform

GitHub: gokul-dev47/siem-platform

基于ELK Stack与Flask构建的生产级SIEM平台,提供实时威胁检测、告警与日志分析能力。

Stars: 0 | Forks: 0

# 🛡️ SIEM 平台 ## 📸 截图 | 仪表盘 | 日志 | 告警 | |-----------|------|--------| | ![仪表盘](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/dashboard.png) | ![日志](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/logs.png) | ![告警](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/alerts.png) | | 规则 | 攻击地图 | 设置 | |-------|-----------|----------| | ![规则](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/rules.png) | ![地图](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/map.png) | ![设置](https://raw.githubusercontent.com/gokul-dev47/siem-platform/main/screenshots/settings.png) | ## 🚀 快速开始 (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, 内容过滤, 后端开发, 威胁检测, 安全运营, 安全防御评估, 扫描框架, 搜索引擎查询, 测试用例, 请求拦截, 逆向工具