Snaksz/SIEM-Threat-Detection-Dashboard

GitHub: Snaksz/SIEM-Threat-Detection-Dashboard

一款微型 SIEM 工具,用于解析 Linux SSH/sudo 认证日志,运行基于规则的威胁检测,并通过交互式仪表板可视化安全告警。

Stars: 0 | Forks: 0

# SIEM 日志分析与威胁检测仪表板 一个微型 SIEM(安全信息与事件管理)工具,用于解析 Linux SSH/sudo 身份验证日志,将其存储在 SQL 中,运行基于规则的 威胁检测,并在交互式仪表板中可视化告警。 **仅供防御/教育使用。** 此处的所有操作均针对合成的、 本地生成的日志文件(或您提供的日志文件)运行——本仓库中的任何内容均不会 扫描、攻击或连接到任何外部系统。示例数据集中使用的所有“攻击者” IP 均来自 IANA 保留的文档地址范围(RFC 5737),而非真实主机。 ## 为什么开发这个项目 蓝队 / SOC 分析师的工作主要包括:将日志转换为结构化格式, 应用检测逻辑,按严重程度进行分类,并将发现转化为具体的 补救措施。本项目端到端地实现了这一完整闭环——日志解析、 关系型 schema、检测工程以及面向分析师的仪表板—— 基于一个足够小、便于手动阅读和验证的数据集。 ## 架构 ``` auth.log ──▶ src/parser.py ──▶ pandas DataFrame ──▶ src/db.py ──▶ SQLite (events) │ ▼ src/detectors.py (5 rules) │ ▼ src/db.py ──▶ SQLite (alerts) │ ▼ dashboard/app.py (Streamlit + Plotly) ``` `src/ingest.py` 将左半部分连接到 CLI pipeline;`dashboard/app.py` 将整个系统连接到一个交互式应用(它也可以直接摄取上传的 文件,而无需使用 CLI)。 ## 文件夹结构 ``` SIEM-Threat-Detection-Dashboard/ ├── README.md ├── requirements.txt ├── Dockerfile ├── docker-compose.yml ├── RESUME_BULLETS.md ├── db/ │ └── schema.sql # events + alerts tables ├── data/ │ ├── generate_sample_logs.py # synthetic auth.log generator │ └── sample_logs/ │ └── auth.log # generated sample dataset (attack scenario embedded) ├── src/ │ ├── parser.py # syslog regex parser -> DataFrame │ ├── db.py # SQLite init/insert/query helpers │ ├── detectors.py # 5 detection rules + severity scoring │ └── ingest.py # CLI: parse -> store -> detect -> alert ├── dashboard/ │ └── app.py # Streamlit dashboard ├── tests/ │ ├── test_parser.py │ └── test_detectors.py └── screenshots/ └── README.md # how to capture + where to place dashboard screenshots ``` ## 安装说明 ``` python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt ``` ## 快速开始 **选项 A —— 仅启动仪表板(推荐):** ``` streamlit run dashboard/app.py ``` 在侧边栏中:点击 **生成 / 重新生成示例日志**,然后点击 **运行 分析**。或者切换到“上传日志文件”以分析您自己的 `auth.log` 风格的文件(指定日志的年份——经典的 syslog 时间戳 会省略它)。 **选项 B —— CLI pipeline:** ``` python data/generate_sample_logs.py --days 6 --output data/sample_logs/auth.log python -m src.ingest --log-file data/sample_logs/auth.log --db data/siem.db --reset streamlit run dashboard/app.py # reads the same data/siem.db ``` **选项 C —— Docker:** ``` docker compose up --build # 打开 http://localhost:8501,然后从侧边栏生成/运行分析 ``` ## 示例数据集 `data/generate_sample_logs.py` 会生成一个确定性(带种子)且逼真的 `auth.log`,跨越数天,并内置了一个场景: - 5 名员工从内部 IP 进行的正常日常 SSH 登录,包含常规的 `sudo` 使用和偶尔的密码输入错误。 - 背景“互联网噪音”——机器人从分散的 IP 探测常见用户名 (`oracle`、`test`、`postgres`、...),量很小, 不会触发告警(逼真的无误报噪音)。 - 来自单个外部 IP(`203.0.113.7`,一个 RFC 5737 文档地址)的暴力破解攻击,尝试了多个用户名,并最终猜中了 `admin` 账户的弱密码。 - 被攻破后的权限提升尝试:攻击者的会话 尝试了几条 `sudo` 命令(`visudo`、`su -`、读取 `/etc/shadow`、 ...),但均被拒绝。 - 一名真实员工在非工作时间(凌晨 02:17)的一次合法登录。 这无需真实数据集即可演练所有五条检测规则。 ## 检测规则 | 规则 | 函数 | 捕获内容 | 默认阈值 | |---|---|---|---| | 登录失败激增 | `detect_failed_login_spikes` | 一台主机上来自任意 IP 组合的登录失败激增(例如密码喷洒) | 10 分钟内失败 15 次 | | IP 暴力破解 | `detect_brute_force_ips` | 单个源 IP 疯狂尝试登录 | 5 分钟内失败 5 次 | | 失败后成功 | `detect_success_after_failures` | 在来自同一 IP 的多次失败后立即成功的登录——极有可能是账户被攻破 | 15 分钟内先前的失败次数达到 3 次及以上 | | 非工作时间登录 | `detect_off_hours_logins` | 在工作时间之外的成功登录 | 09:00–18:00 之外 | | Sudo / 权限提升 | `detect_sudo_abuse` | 同一用户反复被拒绝/失败的 `sudo` 尝试 | 10 分钟内被拒绝 3 次 | 所有阈值均可在仪表板侧边栏中调整(或通过向 `detectors.run_all_detectors` 传递 `config` 字典来实现)。严重程度(低/中/高/ 严重)根据激增超过阈值的程度进行缩放——参见 `src/detectors.py` 中的 `_scale_severity`。 **实施说明 / 已知的简化处理**(值得了解,特意指出 而非隐藏): - 时间窗口规则使用真正的滑动窗口(基于 pandas 时间的 `.rolling()`),并且每次激增仅在其峰值处报告一次——而不是每行 报告一次告警。 - 经典的 syslog 时间戳没有年份;解析器会锚定到提供的 `--year`(默认值:当前年份)。真实的 SIEM 通过文件轮转 元数据或结构化的日志格式(例如 journald、CEF、JSON)来处理此问题。 - `detect_success_after_failures` 的复杂度是每个源 IP O(n²)——在日志文件 规模下没问题;生产环境的 pipeline 会使用流式/增量窗口。 ## 数据库 schema 两张表(`db/schema.sql`):`events`(每个解析后的日志行)和 `alerts` (规则生成的发现,带有严重性标签,并包含 `related_event_ids` 以供 下钻查看)。请参阅该文件以获取完整的列定义和索引。 ## 仪表板 - **概览**:总事件数、失败与成功的登录、总/严重 告警数。 - **失败与成功的登录**,**最可疑的 IP**。 - **随时间变化的告警**,按严重性堆叠。 - **用户风险评分** —— 每个用户告警的加权总和 (严重=10,高=5,中=2,低=1)。 - **最近的严重/高优先级事件**和可筛选的**所有告警**表格。 - **建议** —— 自动生成,与实际触发的规则相关联 (见下文)。 图表颜色遵循经验证的色盲友好调色板:严重性使用 固定的状态调色板(绝不用于其他任何地方),单序列 量级图表使用单一连续色调,多序列图表保持 固定的分类色调顺序。 ## 截图 _在本地运行应用后添加截图——有关确切步骤,请参阅 `screenshots/README.md`。_ ``` ![Overview](https://raw.githubusercontent.com/Snaksz/SIEM-Threat-Detection-Dashboard/main/screenshots/overview.png) ![Top suspicious IPs](https://raw.githubusercontent.com/Snaksz/SIEM-Threat-Detection-Dashboard/main/screenshots/top-ips.png) ![Alerts over time](https://raw.githubusercontent.com/Snaksz/SIEM-Threat-Detection-Dashboard/main/screenshots/alerts-over-time.png) ![User risk scores](https://raw.githubusercontent.com/Snaksz/SIEM-Threat-Detection-Dashboard/main/screenshots/user-risk.png) ![Alerts table](https://raw.githubusercontent.com/Snaksz/SIEM-Threat-Detection-Dashboard/main/screenshots/alerts-table.png) ``` ## 安全与业务建议 以下是仪表板针对每个发现所展示的通用的、与规则关联的缓解措施: - **暴力破解 / 密码喷洒** → 对违规 IP 进行速率限制或封锁(fail2ban、 WAF/防火墙规则),并强制目标账户轮换密码。 - **失败后成功** → 视为可能的账户被攻破:立即重置 凭证,审查该账户的后续活动,并在 今后的远程访问中要求使用 MFA。 - **非工作时间登录** → 根据值班/出差计划进行核对;如果 出人意料,暂停该账户以待调查,并考虑 基于时间或条件的访问策略。 - **Sudo / 权限提升尝试** → 审计用户的 sudoers 权限是否符合最小权限原则,并确切审查试图执行了哪些命令,以寻找横向移动的迹象。 - **程序层面**:将身份验证日志集中存储在主机外(这样攻击者就 无法篡改证据),在所有可行的地方启用 MFA,并将 告警量作为重新评估阈值的信号——低价值告警过多 会导致分析师疲劳,从而遗漏真正的安全事件。 ## 测试 ``` pytest ``` ## 可能的扩展 - 在 Linux auth.log 之外,提供 Windows 事件日志(EVTX/XML)和云提供商(AWS CloudTrail、Azure AD 登录日志)的解析器。 - 为每个用户/IP 持久化存储滚动基线,而不是使用固定阈值 (统计/ML 异常评分)。 - 告警去重/抑制窗口以及“误报”反馈 循环,以减少同一来源未来的噪音。 - 将 SQLite 替换为 PostgreSQL(`db/schema.sql` 是可移植的 SQL),以实现 并发的多用户摄取。
标签:AMSI绕过, Kubernetes, SQLite, Streamlit, 威胁检测, 安全, 访问控制, 请求拦截, 超时处理, 逆向工具