ayushkasare-beep/LogHawk-SIEM
GitHub: ayushkasare-beep/LogHawk-SIEM
一个基于 React、Node.js、MongoDB 和 Python 构建的全栈 SIEM 平台,专注于 Linux 认证日志的解析、威胁检测与完整的事件响应工作流管理。
Stars: 0 | Forks: 0
# LogHawk — 安全日志分析平台
这是一个 SIEM (安全信息与事件管理) 作品集项目,能够摄取原始的 Linux 身份验证日志,将其解析为结构化事件,运行 8 个基于特征的威胁检测器,生成可用于分诊的告警,并提供完整的事件响应工作流。
本项目旨在展示在 SOC 工作流、日志解析架构、威胁检测设计以及全栈安全应用开发方面的实际知识。
## 目录
1. [项目概述](#1-project-overview)
2. [功能](#2-features)
3. [截图](#3-screenshots)
4. [架构](#4-architecture)
5. [技术栈](#5-technology-stack)
6. [安装指南](#6-installation-guide)
7. [配置](#7-configuration)
8. [使用说明](#8-usage)
9. [检测能力](#9-detection-capabilities)
10. [事件响应工作流](#10-incident-response-workflow)
11. [目录结构](#11-folder-structure)
12. [API 参考](#12-api-reference)
13. [未来改进](#13-future-improvements)
14. [简历描述](#14-resume-description)
## 1. 项目概述
LogHawk 模拟了安全运营中心的核心数据 pipeline:
- 分析师通过拖放界面上传原始 auth log 文件
- 后端异步调用 Python 子进程,使用编译好的 regex 模式解析日志行
- 解析后的事件被批量插入 MongoDB
- 8 个威胁特征检测器扫描事件并生成结构化告警
- 分析师对告警进行分诊,将其升级为事件,添加案例备注,并执行遏制措施(Block IP、Disable User)
- 被封禁的资产记录基于用户作用域,并可在专用的封禁资产视图中查看
该应用程序强制执行基于分析师的数据隔离 —— 每一个查询、告警、事件和封禁资产都会根据经过身份验证的用户的 MongoDB ObjectId 进行过滤。
## 2. 功能
| 功能 | 描述 |
|---------|-------------|
| **日志摄取** | 拖放上传 `.log` / `.txt` Linux auth log 文件。立即返回 `202 Accepted`;解析在后台运行。 |
| **日志浏览器** | 分页、可过滤的解析后日志事件表格。支持按用户名、源 IP、事件类型(`Login`、`Sudo`、`Session`)和状态(`Success`、`Failed`)进行过滤。 |
| **威胁检测** | 每次摄取时执行 8 个特征检测器。结果以结构化告警文档的形式呈现。基于分析师的规则开关状态持久化保存在 MongoDB 中。 |
| **告警中心** | 完整的告警生命周期:`Open → Investigating → Resolved`。告警详情抽屉显示相关日志事件、源 IP、建议措施和风险评分。 |
| **事件响应** | 将告警升级为事件案例。添加带有时间戳的分析师备注,跟踪审计日志时间线,执行遏制措施(Block IP、Disable User、Escalate)。 |
| **封禁资产** | 可搜索、分页的视图,显示通过事件遏制封锁的所有 IP 地址。基于用户作用域并带有时间戳。 |
| **密码重置** | 基于 token 的密码重置流程,使用 bcrypt 重新哈希,具有 30 分钟的有效期窗口。 |
| **设置** | 个人资料管理、密码修改以及实时的 API/数据库健康状态监控。 |
## 3. 截图
截图可以添加到 `assets/` 目录中。建议的命名规范:
| 文件 | 页面 |
|------|------|
| `assets/screenshot-login.png` | 登录和注册界面 |
| `assets/screenshot-dashboard.png` | 带有遥测数据统计的主 SOC dashboard |
| `assets/screenshot-logs.png` | 日志上传和日志浏览器 |
| `assets/screenshot-alerts.png` | 带有分诊抽屉的告警中心 |
| `assets/screenshot-detection.png` | 威胁检测规则面板 |
| `assets/screenshot-incidents.png` | 带有备注和时间线的事件工作区 |
| `assets/screenshot-blocked.png` | 封禁资产表格 |
| `assets/screenshot-settings.png` | 设置和个人资料管理 |
## 4. 架构
LogHawk 采用四层架构:
```
┌──────────────────────────────────────────────────────┐
│ PRESENTATION TIER │
│ React 19 + React Router v7 (Vite) │
└──────────────────────────┬───────────────────────────┘
│ JSON / REST API (Axios + JWT)
┌──────────────────────────▼───────────────────────────┐
│ APPLICATION TIER │
│ Node.js + Express.js REST API Gateway │
│ Multer file handler │ JWT auth middleware │
└──────────┬───────────────────────────────┬───────────┘
│ child_process.execFile │ Mongoose ODM
┌──────────▼───────────┐ ┌─────────────▼────────────┐
│ ANALYSIS TIER │ │ DATA TIER │
│ Python subprocess │ │ MongoDB (Atlas / local) │
│ linux_auth_parser.py│ │ 6 collections │
│ 8 threat detectors │ └───────────────────────────┘
└──────────────────────┘
```
**日志上传时的数据流:**
1. 前端以 `multipart/form-data` 格式 POST 日志文件
2. Multer 将文件保存到 `backend/uploads/`
3. Controller 返回 `202 Accepted` 并触发后台任务
4. `parserService.js` 通过 `execFile` 调用 Python,并传入 `--file`、`--output json` 和 `--enabled-rules` 参数
5. Python 返回包含解析后事件和检测到的威胁的 JSON blob
6. Node 批量插入 `ParsedLog` 文档并创建 `Alert` 文档
7. 前端轮询文件状态,直到状态变为 `complete`
## 5. 技术栈
| 层级 | 技术 |
|-------|-----------|
| Frontend | React 19, React Router v7, Axios, Vanilla CSS |
| Backend | Node.js, Express.js |
| 身份验证 | JSON Web Tokens (JWT), bcryptjs (12 salt rounds) |
| 文件处理 | Multer (disk storage) |
| 数据库 | MongoDB with Mongoose ODM |
| Python Engine | Python 3.10+, `re`, `collections`, `argparse`, `python-dateutil` |
| 开发服务器 | Vite 8, Nodemon |
## 6. 安装指南
### 前置条件
| 要求 | 版本 |
|-------------|---------|
| Node.js | 18+ |
| Python | 3.10+ |
| MongoDB | 6+ local instance **或者** MongoDB Atlas cluster |
### 克隆仓库
```
git clone https://github.com/your-github-username/LogHawk.git
cd LogHawk
```
### 后端设置
```
cd backend
cp .env.example .env # Copy environment template
# 编辑 .env 并设置你的 MONGO_URI 和 JWT_SECRET
npm install
npm run dev # Starts Express on port 5000
```
### 前端设置
```
cd frontend
npm install
npm run dev # Starts Vite dev server on port 5173
```
### Python Engine 设置
```
cd python-engine
pip install -r requirements.txt
```
Python engine 会被后端自动调用。无需手动启动。
## 7. 配置
所有的后端配置都通过 `backend/.env` 处理。复制 `backend/.env.example` 并填写相关值:
```
# Server
PORT=5000
NODE_ENV=development
# MongoDB 连接字符串(本地或 Atlas)
MONGO_URI=mongodb://127.0.0.1:27017/loghawk
# JWT 签名密钥 — 在生产环境中使用长随机字符串
JWT_SECRET=your_jwt_secret_key_here_change_in_production
JWT_EXPIRE=7d
# 用于 CORS 的 Frontend origin
CLIENT_URL=http://localhost:5173
# Python 解释器(如果未设置,则默认为 PATH 中的 'python')
# PYTHON_PATH=python3
# PYTHON_PATH=C:\Users\You\AppData\Local\Programs\Python\python.exe
```
**安全提示:** 切勿将 `.env` 提交到版本控制系统中。它已经被列入 `.gitignore` 中。
## 8. 使用说明
1. **注册** — 在 `/register` 创建一个分析师账号。密码必须满足复杂性要求(包含大写字母、小写字母、数字、特殊字符)。
2. **上传日志** — 导航至 **Logs**,拖放上传 Linux auth log 文件,或者使用位于 `python-engine/sample_logs/sample_auth.log` 的示例文件。
3. **监控解析** — 文件卡片会显示 `Processing → Complete`。刷新页面或等待状态自动更新。
4. **探索事件** — 使用日志浏览器来搜索、过滤和分页查看解析后的事件。
5. **分诊告警** — 前往 **Alerts** 查看生成的告警。点击任意告警打开详情抽屉:查看相关日志、严重程度、源 IP 和建议的缓解措施。
6. **创建事件** — 在告警抽屉中,点击 **Escalate to Incident**。这将在事件响应工作区中创建一个案例。
7. **管理事件** — 打开事件,分配分析师,添加案例备注,并执行遏制措施(Block IP、Disable User、Escalate)。
8. **审查封禁资产** — 导航至 **Blocked Assets**,查看通过遏制措施隔离的所有 IP 地址。
9. **管理规则** — 前往 **Threat Detection**,查看哪些特征处于激活状态,并开启或关闭单个规则。
## 9. 检测能力
Python 分析引擎包含 8 个独立的基于特征的检测器。每个都是一个独立的 class,接收解析后的日志事件列表,并返回结构化的威胁对象。
| 检测器 | MITRE ATT&CK | 严重程度 | 触发逻辑 |
|----------|-------------|----------|---------------|
| **BruteForceDetector** | T1110 | High | 5 分钟内来自同一 IP 的失败身份验证尝试 > 5 次 |
| **PasswordSprayDetector** | T1110.003 | High | 10 分钟内来自同一 IP 的针对唯一用户名的攻击 > 3 个 |
| **AccountEnumerationDetector** | T1087 | Medium | 来自同一 IP 的无效用户名尝试 > 5 次 |
| **AbnormalLoginDetector** | T1078 | Medium | 来自匹配可疑网络块的 IP 的成功登录 |
| **PrivilegeEscalationDetector** | T1068 | Critical | 失败的 `su`/`sudo` 命令或未经授权的 sudoers 访问 |
| **ReconnaissanceDetector** | T1595 | Medium | 引用已知扫描器路径(`.env`、`wp-admin`、`/etc/passwd`)的日志行 |
| **SuspiciousIPDetector** | T1090 | Medium | 源 IP 出现在先前的告警历史记录中 |
| **PortScanDetector** | T1046 | Medium | 来自单个 IP 对多个唯一端口的快速连接 |
每个威胁 payload 包括:`type`、`source_ip`、`severity`、`confidence`、`description` 和 `recommendation`。
基于分析师的规则开关通过 `DetectionRule` 集合持久化保存在 MongoDB 中。在解析时,通过将 `--enabled-rules` 作为 JSON 参数传递给 Python 子进程,被禁用的规则将被跳过。
## 10. 事件响应工作流
```
Uploaded Log File
│
▼
Python Parser (regex extraction)
│
▼
Threat Detectors (8 signatures)
│
▼
Alert Generated → Alert Center (status: Open)
│
▼
Analyst Triages Alert → status: Investigating
│
▼
Escalate to Incident → Incident Response workspace
│
├─► Add Notes (timestamped, audit trail)
├─► Assign Analyst
├─► Execute Containment:
│ • Block IP (creates BlockedAsset record)
│ • Disable User Account
│ • Escalate to Senior Analyst
│
▼
Resolve Incident → status: Resolved
```
所有的操作都会记录在事件的审计日志时间线中。
## 11. 目录结构
```
LogHawk/
├── LICENSE
├── README.md
├── DOCUMENTATION.md
├── .gitignore
├── assets/ # Screenshots for README (add manually)
│
├── backend/ # Express.js REST API
│ ├── .env.example # Environment variable template
│ ├── server.js # Entry point – middleware + route registration
│ ├── config/
│ │ └── db.js # MongoDB connection via Mongoose
│ ├── controllers/
│ │ ├── authController.js # Register, login, password reset, profile
│ │ ├── logController.js # Upload, list, query, delete log files
│ │ ├── alertController.js # Alert listing, detail, status updates
│ │ ├── incidentController.js # Case management, notes, containment actions
│ │ └── detectionRulesController.js # Per-user rule toggle persistence
│ ├── middleware/
│ │ ├── auth.js # JWT verification middleware
│ │ ├── upload.js # Multer configuration
│ │ └── errorHandler.js # Global error handler
│ ├── models/
│ │ ├── User.js # Analyst account schema
│ │ ├── UploadedFile.js # Uploaded file metadata schema
│ │ ├── ParsedLog.js # Individual parsed security event schema
│ │ ├── Alert.js # Threat alert schema
│ │ ├── Incident.js # Incident case schema
│ │ ├── BlockedAsset.js # Blocked IP containment record schema
│ │ └── DetectionRule.js # Per-user rule enabled/disabled state
│ ├── routes/
│ │ ├── authRoutes.js
│ │ ├── logRoutes.js
│ │ ├── alertRoutes.js
│ │ ├── incidentRoutes.js
│ │ └── detectionRulesRoutes.js
│ ├── services/
│ │ └── parserService.js # Python subprocess bridge + bulk insert logic
│ └── utils/
│ └── sendEmail.js # Email utility (password reset — stub)
│
├── frontend/ # React 19 SPA (Vite)
│ └── src/
│ ├── App.jsx # Route definitions
│ ├── main.jsx # React root + BrowserRouter
│ ├── index.css # Global CSS design tokens
│ ├── components/ # Reusable UI components
│ │ ├── Sidebar.jsx / .css
│ │ ├── Navbar.jsx / .css
│ │ ├── LogUpload.jsx / .css
│ │ ├── LogExplorer.jsx / .css
│ │ ├── FileList.jsx / .css
│ │ └── StatCard.jsx / .css
│ ├── context/
│ │ └── AuthContext.jsx # JWT session + user state provider
│ ├── layouts/
│ │ └── DashboardLayout.jsx
│ ├── pages/
│ │ ├── Dashboard.jsx / .css
│ │ ├── Logs.jsx / .css
│ │ ├── Alerts.jsx / .css
│ │ ├── ThreatDetection.jsx / .css
│ │ ├── IncidentResponse.jsx / .css
│ │ ├── BlockedAssets.jsx / .css
│ │ ├── Settings.jsx / .css
│ │ ├── Login.jsx
│ │ ├── Register.jsx
│ │ ├── ForgotPassword.jsx / .css
│ │ └── ResetPassword.jsx / .css
│ └── services/
│ └── api.js # Axios instance with JWT interceptors
│
└── python-engine/ # Log analysis subprocess
├── requirements.txt
├── main.py # Standalone CLI entry point (for manual use)
├── parsers/
│ ├── linux_auth_parser.py # Primary parser — called by backend
│ └── log_parser.py # Multi-format parser (architecture reference)
├── detectors/
│ ├── brute_force_detector.py
│ ├── password_spray_detector.py
│ ├── account_enumeration_detector.py
│ ├── abnormal_login_detector.py
│ ├── privilege_escalation_detector.py
│ ├── reconnaissance_detector.py
│ ├── suspicious_ip_detector.py
│ └── portscan_detector.py
├── sample_logs/
│ └── sample_auth.log # Sample Linux auth log for testing
└── reports/ # Output directory for standalone CLI use
```
## 12. API 参考
除 `/api/auth/*` 和 `/api/health` 外,所有的 endpoint 都需要在 `Authorization: Bearer ` 请求头中提供有效的 JWT。
### 身份验证 — `/api/auth`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| POST | `/register` | 注册新的分析师账号 |
| POST | `/login` | 身份验证并接收 JWT |
| POST | `/logout` | 使 session 失效 (无状态) |
| GET | `/me` | 返回当前用户资料 |
| PUT | `/profile` | 更新用户名和邮箱 |
| PATCH | `/me/password` | 修改密码(需要当前的密码) |
| POST | `/forgot-password` | 生成密码重置 token |
| POST | `/reset-password` | 提交重置 token 和新密码 |
### 日志管理 — `/api/logs`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| POST | `/upload` | 上传日志文件(字段:`logfile`)— 返回 202 |
| GET | `/files` | 列出当前用户上传的文件 |
| DELETE | `/files/:id` | 删除文件、事件及相关告警 |
| GET | `/` | 分页日志查询(`page`, `limit`, `search`, `status`, `eventType`, `fileId`) |
| GET | `/stats` | 聚合 dashboard 遥测数据 |
### 告警中心 — `/api/alerts`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `/` | 列出告警(`status`, `severity`, `page`, `limit`) |
| GET | `/stats` | 统计未解决和未关闭的告警 |
| GET | `/:id` | 获取告警详情及相关日志摘录 |
| PATCH | `/:id/status` | 更新告警状态(`Open`, `Investigating`, `Resolved`) |
### 事件响应 — `/api/incidents`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `/` | 列出事件案例 |
| POST | `/` | 从告警 ID 创建事件 |
| GET | `/:id` | 获取包含备注和审计日志的完整事件 |
| POST | `/:id/assign` | 分配分析师 |
| POST | `/:id/note` | 追加备注 |
| POST | `/:id/respond` | 执行遏制措施(`block_ip`, `disable_user`, `escalate`) |
| POST | `/:id/resolve` | 解决案例 |
### 封禁资产 — `/api/blocked-assets`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `/` | 列出当前用户被封锁的 IP(`search`, `page`, `limit`) |
### 检测规则 — `/api/detection-rules`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `/` | 获取全部 8 个规则的开启/关闭状态 |
| PATCH | `/:ruleId` | 开启或关闭某项规则(body: `{ "enabled": true }`) |
### 健康检查
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `//health` | 返回服务器状态、运行时间和时间戳 |
## 13. 未来改进
- 支持 Windows Event Log (XML/EVTX) 以及 Apache/Nginx access log 格式
- 自定义规则阈值编辑器 — 允许分析师通过 UI 调整暴力破解的时间窗口和次数参数
- 针对 `Critical` 严重级别告警的邮件或 webhook 通知
- 将事件报告导出为 PDF 或 Markdown
- 提供 Docker Compose 设置以实现零配置的本地部署
## 14. 简历描述
标签:AMSI绕过, GNU通用公共许可证, MITM代理, MongoDB, Node.js, Python, React, SIEM平台, Syscalls, 威胁检测, 无后门, 自定义脚本, 逆向工具