minkong05/LDR-platform

GitHub: minkong05/LDR-platform

一个自建的微型 SOC 平台,为小型 Web 服务提供日志采集、规则检测、告警调查和安全响应的完整闭环。

Stars: 1 | Forks: 0

![Python](https://img.shields.io/badge/python-3.12-3776AB?logo=python&logoColor=white) ![FastAPI](https://img.shields.io/badge/FastAPI-0.111-009688?logo=fastapi&logoColor=white) ![Flask](https://img.shields.io/badge/Flask-3.0-000000?logo=flask&logoColor=white) ![Docker](https://img.shields.io/badge/docker-compose-2496ED?logo=docker&logoColor=white) ![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg) ![License](https://img.shields.io/badge/license-MIT-green) # 轻量级检测与响应 (LDR) 平台 一个自建的微型 SOC 平台,用于 Web 服务——作为一个为期 16 周的学习和作品集项目而构建。它从 Flask 和 Nginx 接收日志,将其规范化为受 ECS 启发的 schema,运行基于 YAML 的检测规则,在调查看板中展示告警,并支持带有完整审计跟踪的安全响应操作。 ## 功能说明 ``` Agent → Ingest API → Normaliser → Event Store → Detection Worker ↓ Alert Writer → Email ↓ Investigation Dashboard ↓ Response Actions → Audit Log ``` 1. 日志 **agent** 使用共享密钥 token 将批量事件(Flask 访问日志、Nginx 访问日志)传送到 ingest API。 2. **ingest API** 对每个事件进行去重、限流、解析,并将其规范化为受 ECS 启发的 schema,然后将其存储在 PostgreSQL 中。 3. **检测 worker** 每 30 秒轮询一次,根据最近的事件评估 YAML 阈值规则,并将告警写入数据库。高危和严重告警会触发邮件通知。 4. **调查看板**(Flask + Bootstrap 5)允许分析师浏览告警,切换到 IP 时间线,查看风险评分,并将证据包导出为 ZIP 文件。 5. 在任何 IP 调查页面,分析师都可以一键**封禁或解封** IP。每一个操作都会写入在看板中可见的、不可篡改的**审计日志**。 ## 路线图 - [x] Ingestion API — agent token 认证、稳定的去重哈希、限流 - [x] 规范化 — Nginx + Flask 解析器 → 受 ECS 启发的 schema - [x] 事件存储 + 查询 endpoint — 过滤、分页、IP 摘要 - [x] 运营基础 — 结构化日志、request-id、全局错误处理、保留策略 CLI - [x] 检测引擎 — YAML 规则加载器、阈值窗口、告警写入器 - [x] 邮件通知 — 高危/严重告警触发 SMTP 邮件 - [x] 调查看板 — 告警列表、告警详情、分类处理工作流 - [x] IP 调查 — 事件时间线、风险评分、热门路径、状态码 - [x] 证据导出 — ZIP 包(summary.md + alerts.json + events.json) - [x] 响应操作 — 封禁 IP、解封 IP、封禁状态 — 完整的审计跟踪 - [x] 审计日志看板 — 所有响应操作的分页视图 ## 技术栈 | 层级 | 技术 | |---|---| | 后端 API | FastAPI + Pydantic v2 + SQLAlchemy 2 | | 看板 | Flask 3 + Bootstrap 5 暗黑主题 + Jinja2 | | 数据库 | PostgreSQL(JSONB 列)+ Alembic 迁移 | | 检测 worker | Python 轮询循环、YAML 规则、structlog | | 认证 | 共享 agent token(X-Agent-Token 标头)| | 测试 | pytest — 单元测试 + 集成测试(RUN_INTEGRATION_TESTS=1)| | CI | GitHub Actions | | 基础设施 | Docker Compose | ## 快速开始 ``` git clone https://github.com/minkong05/LDR-platform.git cd LDR-platform cp .env.example .env # review defaults before running ./scripts/dev_up.sh # starts postgres, backend, worker, dashboard # 验证 stack 已启动 curl http://localhost:8000/v1/health # {"status": "ok"} open http://localhost:5001 # dashboard ``` ### 填充演示数据 ``` # 使用 synthetic events 触发所有 detection rules ./scripts/trigger_all_rules.sh # 等待约 30 秒让 worker 触发,然后打开 dashboard open http://localhost:5001 ``` ### 攻击模拟与检测覆盖率报告 `python -m app.cli simulate`(从 `apps/backend` 运行)会根据每条检测规则伪造一批合成攻击,等待 worker 对其进行评估,并检查哪些规则实际被触发——其理念与 `trigger_all_rules.sh` 相同,但这不仅是一个可测试的 Python 工具,还会报告此检测套件*未*涵盖的内容(参见 `mitre_reference.py`)。它会将一份可重新生成的报告写入 `docs/detection-coverage.md`。仅限本地/演示使用——当 `ENV=production` 时将拒绝运行。 ## 项目结构 ``` LDR-platform/ ├── apps/ │ ├── backend/ # FastAPI — ingest, events, alerts, entities, response │ │ ├── app/ │ │ │ ├── routers/ │ │ │ ├── services/ # detection, normaliser, risk, evidence, email, response │ │ │ ├── db/ # ORM models + Alembic migrations │ │ │ └── schemas/ │ │ └── tests/ # unit + integration │ ├── worker/ # detection polling loop │ └── dashboard/ # Flask UI │ └── dashboard/ │ ├── routes/ │ └── templates/ ├── rules/ # YAML detection rules ├── scripts/ # dev helpers └── docs/ ``` ## 检测规则 规则以 YAML 文件的形式存放在 `rules/` 目录中。示例: ``` id: LDR-WEB-001 name: Brute force login failures severity: high confidence: high technique_id: T1110 condition: type: threshold field: event.action value: login_failed threshold: 10 window_seconds: 300 group_by: - source.ip ``` 引擎会根据规范化后事件的滑动窗口对每条规则进行评估。当越过阈值时,将写入一条带有计算出的风险评分的告警。 ## 测试 ``` # Unit tests(无外部依赖) pytest -q # Integration tests(需要运行中的 Postgres) docker compose up -d postgres RUN_INTEGRATION_TESTS=1 pytest -q # 运行所有内容 ./scripts/test_all.sh ``` ## 已知局限性 这些是刻意的设计决策和环境限制,并非 bug。 - **封禁执行仅限于数据库层面。** 封禁 IP 会向 PostgreSQL 和审计日志写入一条记录。这里没有 Nginx 或防火墙的执行机制——因为该平台是为无法访问系统网络配置的受限本地环境而设计的。但其架构设计允许真实的执行层(iptables、Nginx `geo` 封禁、云端 WAF)读取 `blocked_ips` 表来实施强制封禁。 - **单一 SMTP 收件人。** 邮件通知仅发送至一个地址(`SMTP_TO`)。未实现多收件人或值班路由功能。 - **看板无身份认证。** Flask 看板没有登录拦截。仅适用于内部/本地使用。 - **无跨规则关联。** 检测引擎独立评估每条规则。不支持“当规则 A 和规则 B 同时针对同一个 IP 触发时才告警”。 - **Redis 已预配但未被使用。** Docker Compose 技术栈中包含了 Redis,预留给未来的限流存储或任务队列使用。目前使用的是基于内存的限流器。 ## 作者 由 **Kong Yu Min** 构建 格拉斯哥大学 Python | 后端 | 安全 [GitHub](https://github.com/minkong05) · [LinkedIn](https://linkedin.com/in/kong-yu-min)
标签:AMSI绕过, AV绕过, FastAPI, Flask, Python, SIOS, 威胁检测, 安全规则引擎, 安全运营, 扫描框架, 无后门, 测试用例, 版权保护, 逆向工具