Ahmedredda2020/SIREN-Smart-Incident-Response-Event-Notifier
GitHub: Ahmedredda2020/SIREN-Smart-Incident-Response-Event-Notifier
一个基于Node.js全栈架构的轻量级安全运营中心工具,提供进程监控、文件完整性扫描、IOC威胁狩猎、行为异常检测和事件响应的一体化终端安全防护方案。
Stars: 0 | Forks: 0
# Sentinel — 安全运营中心
一个用于进程监控、文件完整性扫描、IOC 威胁狩猎、行为异常检测和事件响应的全栈 SOC 工具。
## 开始之前你需要准备什么
你的机器上需要安装 **3 样东西**:
| 工具 | 用途 | 安装 |
|:-----|:----|:--------|
| **Node.js v20+** | 运行服务端并构建客户端 | [nodejs.org](https://nodejs.org) 或 `sudo apt install nodejs npm` |
| **MongoDB** | 存储用户、告警、异常和基线数据 | [mongodb.com](https://www.mongodb.com/try/download/community) 或 `sudo apt install mongodb` |
| **Git** | 克隆代码仓库 | `sudo apt install git` |
### 验证是否已安装
```
node -v # Should print v20.x.x or higher
mongosh # Should open the MongoDB shell (type 'exit' to close)
git --version
```
## 循序渐进:本地运行(最简单的方法)
### 1. 克隆项目
```
git clone
cd SIERN_EX
```
### 2. 启动 MongoDB
确保 MongoDB 正在后台运行:
```
# 在基于 systemd 的 Linux 上:
sudo systemctl start mongod
# 验证它正在运行:
sudo systemctl status mongod
# 应显示 "active (running)"
```
**替代方案:使用 Docker 运行 MongoDB**(无需在系统中安装):
```
sudo docker run -d \
--name mongodb \
-p 27017:27017 \
-v mongodb_data:/data/db \
mongo
```
这将在容器中启动 MongoDB 并监听 `localhost:27017`。常用命令:
```
docker ps # Verify it's running
docker stop mongodb # Stop it
docker start mongodb # Start it again
docker rm mongodb # Remove the container
docker volume rm mongodb_data # Delete all data
```
### 3. 创建 `.env` 文件
复制模板并填入你的密钥:
```
cp .env.example server/.env
```
现在编辑 `server/.env`:
```
PORT=3000
DATABASE_URL=mongodb://localhost:27017/sentinel
NODE_ENV=development
AUTH_STRATEGY=email
JWT_SECRET=change_this_to_a_random_64_char_string
REFRESH_TOKEN_SECRET=change_this_to_another_random_64_char_string
CLIENT_URL=http://localhost:5173
```
### 4. 安装所有依赖
在项目根目录下运行:
```
npm install
npm run postinstall
```
这将自动安装根目录依赖,以及 `shared/`、`client/` 和 `server/` 的依赖。
### 5. 启动开发服务器
```
npm run dev
```
这将**同时启动 3 个服务**:
- `shared` — TypeScript 监听器(更改时重新构建共享类型)
- `client` — 位于 **** 的 Vite 开发服务器
- `server` — 位于 **** 的 Express API
### 6. 打开应用
打开浏览器并访问:
```
http://localhost:5173
```
你将被重定向到**登录**页面。
## 首次设置:创建用户
由于这是一个全新的数据库,你需要进行注册:
1. 导航到 `http://localhost:5173/register`
2. 输入邮箱和密码
3. 点击 **Register**
4. 你将自动登录并被重定向到仪表板
## 如何测试每一个功能
登录后,使用侧边栏进行导航。以下是每个页面的测试方法:
### 1. 仪表板 (`/`)
**功能描述:** 显示系统概览 — 活跃进程数、过去 24 小时的告警数、系统状态。
**测试方法:**
- 登录后打开仪表板。
- 你应该会看到实时统计数据(进程数是从你的实际机器上拉取的)。
- 在你触发扫描之前,告警数将是 `0`。
### 2. 进程监控 (`/processes`)
**功能描述:** 列出机器上所有正在运行的进程及其风险评分。
**测试方法:**
- 从侧边栏导航到 **Process Monitor**。
- 你应该会看到一个包含所有正在运行进程的表格(Firefox、node、bash 等)。
- 在可疑路径(如 `/tmp/`)中的进程将具有更高的风险评分。
- **终止测试:** 找到一个非关键进程(例如,在终端中运行 `sleep 9999 &`),然后点击其上的 **Kill**。验证它是否消失。
### 3. 文件完整性扫描器 (`/scanner`)
**功能描述:** 对文件进行哈希处理 (SHA256),并与存储的基线进行比较,以检测未经授权的更改。
**测试方法:**
1. **创建一个测试目录:**
mkdir -p /tmp/sentinel_test
echo "hello world" > /tmp/sentinel_test/file1.txt
echo "secret data" > /tmp/sentinel_test/file2.txt
2. 在 Scanner 页面中,输入路径:`/tmp/sentinel_test`
3. 勾选 "Include Subdirectories" 并点击 **Create Baseline**。
4. 现在**修改一个文件:**
echo "HACKED" >> /tmp/sentinel_test/file1.txt
5. 在启用 **Scan with Compare Against Baseline** 的情况下运行扫描。
6. 你应该会看到 `file1.txt` 被标记为 **MODIFIED**,并附带风险等级。
### 4. IOC 威胁狩猎 (`/ioc-hunt`)
**功能描述:** 在运行中的进程和文件系统中搜索恶意的入侵指标(哈希、IP、域名)。
**测试方法:**
1. 导航到 **IOC Hunt**。
2. 输入一个已知的哈希(例如,从扫描器测试中获取的 `file1.txt` 的 SHA256):
sha256sum /tmp/sentinel_test/file1.txt
3. 粘贴该哈希值,将范围设置为 **Filesystem**,搜索路径设置为 `/tmp/sentinel_test`。
4. 点击 **Start Hunt**。
5. 如果哈希匹配,你将看到一个 **Critical** 级别的命中。
**进程测试:** 输入一个进程名(如 `node`)作为域名类型的 IOC,范围设置为 **Processes**,然后运行狩猎。它应该会匹配到你正在运行的 node 服务器。
### 5. 行为检测 (`/behavioral`)
**功能描述:** 使用内置规则检测可疑的进程行为。
**测试方法:**
1. 导航到 **Behavioral Detection**。
2. 初始状态的异常表格将是空的。
3. 点击 **View Rules** 查看 3 条检测规则 (BR-001, BR-002, BR-004)。
4. 点击任意规则旁的 **Simulate**。
5. 模拟的异常应立即出现在表格中。
6. 刷新页面 — 异常应该持续存在(它已存储在 MongoDB 中,不再是模拟数据)。
### 6. 响应中心 (`/response`)
**功能描述:** 跟踪遏制操作(终止、隔离、隔离区)及完整的审计历史。
**测试方法:**
1. 导航到 **Response Center**。
2. 初始状态下,两个选项卡(Active Containments,Action History)都将为空。
3. 若要填充数据,请从 **Process Monitor** 页面终止一个进程 — 这将创建一条遏制操作记录。
4. 返回 Response Center — 你应该会在历史记录中看到该终止操作。
5. 测试活动遏制上的 **Undo** 按钮。
### 7. 设置 (`/settings`)
**功能描述:** 用户偏好和主题切换。
**测试方法:** 切换深色/浅色模式并验证其在重新加载后是否保持不变。
## 测试认证系统
### 登录/登出流程
1. 在 `/register` **注册**一个新用户。
2. **登出**(应重定向到 `/login`)。
3. 使用相同的凭证再次**登录**。
4. 关闭浏览器标签页,重新打开一个访问 `http://localhost:5173` 的标签页 — 你应该仍然处于登录状态(token 持久化在 localStorage 中)。
### Token 刷新测试
1. 成功登录。
2. 等待或手动从 `localStorage` 中删除 `accessToken`(DevTools → Application → Local Storage)。
3. 导航到任何受保护的页面。
4. 应用应自动使用 `refreshToken` 刷新并继续工作。
5. 如果两个 token 都被删除,你应该会被重定向到 `/login`。
## 快速检查清单:一切正常吗?
| # | 功能 | 测试 | 预期 |
|:--|:--------|:-----|:---------|
| 1 | MongoDB 连接 | 检查终端输出 | `MongoDB Connected: localhost` |
| 2 | 用户注册 | POST 到 `/register` | 账户已创建,自动登录 |
| 3 | 仪表盘统计 | 打开 `/` | 活跃进程数 > 0 |
| 4 | 进程列表 | 打开 `/processes` | 真实操作系统进程表格 |
| 5 | 进程终止 | 终止一个测试进程 | 进程消失 |
| 6 | 扫描器基线 | 在 `/tmp/sentinel_test` 上创建基线 | "Baseline created" 消息 |
| 7 | 扫描器检测 | 修改文件,重新扫描 | 显示 MODIFIED 状态 |
| 8 | IOC 狩猎 (哈希) | 狩猎已知 SHA256 | 发现匹配及严重程度 |
| 9 | IOC 狩猎 (进程) | 狩猎 "node" | 在运行进程中匹配 |
| 10 | 行为模拟 | 点击 BR-001 上的 Simulate | 异常出现在表格中 |
| 11 | 行为持久化 | 模拟后刷新页面 | 异常依然可见 |
| 12 | 响应中心 | 终止一个进程,检查历史记录 | 操作记录在审计轨迹中 |
| 13 | 认证 token 刷新 | 删除 accessToken,导航 | 自动刷新,未登出 |
| 14 | 深色/浅色模式 | 在 Settings 中切换 | 主题改变并保持 |
## 故障排除
| 问题 | 解决方案 |
|:--------|:---------|
| `Error: DATABASE_URL variables in .env missing` | 你忘记创建 `server/.env` 了。运行 `cp .env.example server/.env` |
| `MongoServerError: connect ECONNREFUSED` | MongoDB 未运行。使用 `sudo systemctl start mongod` 启动它 |
| Processes 页面为空 | `ps-list` 包需要 Linux 或 macOS。在没有原生访问权限的 Windows WSL 上无法工作。 |
| 浏览器控制台出现 CORS 错误 | 确保你的 `.env` 中包含 `CLIENT_URL=http://localhost:5173` |
| `Cannot find module` TypeScript 错误 | 运行 `npm run postinstall` 安装所有依赖 |
## 攻击模拟测试
两个脚本模拟了**真实的攻击者攻击链**,以触发 Sentinel 的每一个检测功能。它们是完全安全的 — 它们只创建临时文件,生成无害进程,并在最后清理所有内容。
### 在 Linux 上运行
```
# 确保 Sentinel 正在首先运行
npm run dev
# 在第二个终端中:
chmod +x test-attack-linux.sh
./test-attack-linux.sh
```
### 在 Windows 上运行
```
# 确保 Sentinel 正在首先运行 (START-SENTINEL.bat 或 npm run dev)
# 右键点击 test-attack-windows.ps1 > "使用 PowerShell 运行"
# 或者打开 PowerShell 并运行:
PowerShell -ExecutionPolicy Bypass -File test-attack-windows.ps1
```
这两个脚本会要求输入你的**邮箱 + 密码**,然后自动运行 6 个攻击阶段。
### 攻击阶段
| 阶段 | 攻击 | 描述 |
|:------|:-------|:-------------|
| 1 | 初始访问 | 投放伪造的恶意软件文件(`dropper.exe`、`beacon.dll`、webshell) |
| 2 | 持久化 | 创建文件基线,然后篡改配置文件(启用 root 登录,禁用防火墙) |
| 3 | 执行 | 生成编码命令、临时目录进程、netcat 监听器 (Linux) / certutil 滥用 (Windows)、C2 回调 |
| 4 | 检测 | 调用 Sentinel 行为扫描 + 模拟所有 3 条规则 (BR-001, BR-002, BR-004) |
| 5 | 狩猎 | 狩猎植入的恶意软件哈希、C2 IP (192.168.13.37) 和 evil.com 域名 |
| 6 | 报告 | 打印摘要并等待你在清理前审查 Sentinel UI |
### 你将在 Sentinel 中看到的内容
**仪表板:**
- 告警数跃升至 **6 条以上的严重/警告告警**
- 告警列表显示 `Encoded Command Execution`、`Temp Directory Spawning`、`Process Injection`
**进程监控:**
- Linux:`nc`、`curl`、`wget` 出现并带有**高风险评分**
- Windows:`certutil.exe`、`powershell.exe` 被标记为高/中风险
**完整性扫描器:**
- 将路径设置为攻击测试目录,并勾选 "Compare against baseline" 进行扫描
- Linux:`/tmp/sentinel_attack_test/etc` — `sshd_config` 显示为 **MODIFIED**
- Windows:`C:\temp\sentinel_attack_test\config` — `firewall.conf` 显示为 **MODIFIED**
- 新的后门文件显示为 **NEW**
**IOC 狩猎:**
- 粘贴脚本打印出的 SHA256 哈希
- 搜索攻击目录 — `dropper.exe` 匹配为 **Critical**
- 在进程中搜索 `192.168.13.37` — C2 回调进程匹配
**行为检测:**
- **BR-001**:编码命令执行 (base64 / `-encodedcommand`)
- **BR-002**:临时目录生成 (`/tmp` 或 `%TEMP%`)
- **BR-004**:进程注入签名(模拟)
**响应中心:**
- 每个严重检测都会在队列中创建一个遏制操作
- 点击 **Undo** 解除它们
### 清理
在出现提示时按 **Enter** — 脚本将自动终止所有生成的进程并删除所有临时文件。
## Windows ( / 10 / 11) 设置
本项目完全支持 Windows。请按照以下步骤操作,而不是上述 Linux 的步骤。
### 一键设置(最简单的方法)
只需双击项目文件夹中的 **`START-SENTINEL.bat`**。它将会:
1. ✅ 检查 Node.js 是否已安装
2. ✅ 启动 MongoDB(Docker 或 Windows 服务)
3. ✅ 使用自动生成的密钥创建 `server\.env`(如果不存在)
4. ✅ 安装所有依赖
5. ✅ 启动开发服务器
6. ✅ 在浏览器中打开 `http://localhost:5173`
### 手动设置(循序渐进)
### 1. 安装前置条件
下载并安装这些(均使用默认设置):
| 工具 | 下载 |
|:-----|:---------|
| **Node.js v20+** | [nodejs.org/en/download](https://nodejs.org/en/download) — 选择 **Windows Installer (.msi)** |
| **Git for Windows** | [git-scm.com/download/win](https://git-scm.com/download/win) |
| **MongoDB Community** | [mongodb.com/try/download/community](https://www.mongodb.com/try/download/community) — 选择 **Windows x64 MSI** |
### 2. 验证安装
打开 **PowerShell** 或 **Command Prompt** 并运行:
```
node -v # Should print v20.x.x or higher
git --version # Should print git version x.x.x
mongosh # Should open MongoDB shell (type 'exit' to close)
```
如果 `mongosh` 失败,可能是 MongoDB 服务未运行。启动它:
```
# PowerShell (以管理员身份):
net start MongoDB
```
**替代方案:使用 Docker Desktop 运行 MongoDB:**
如果你安装了 [Docker Desktop](https://www.docker.com/products/docker-desktop/):
```
docker run -d --name mongodb -p 27017:27017 -v mongodb_data:/data/db mongo
```
### 3. 克隆并设置
```
git clone
cd SIERN_EX
```
### 4. 创建 `.env` 文件
```
copy .env.example server\.env
```
在记事本(或任何编辑器)中编辑 `server\.env`:
```
PORT=3000
DATABASE_URL=mongodb://localhost:27017/sentinel
NODE_ENV=development
AUTH_STRATEGY=email
JWT_SECRET=paste_a_random_64_char_string_here
REFRESH_TOKEN_SECRET=paste_another_random_64_char_string_here
CLIENT_URL=http://localhost:5173
```
在 PowerShell 中生成随机密钥:
```
-join ((65..90) + (97..122) + (48..57) | Get-Random -Count 64 | % {[char]$_})
```
运行两次 — 将一个用于 `JWT_SECRET`,另一个用于 `REFRESH_TOKEN_SECRET`。
### 5. 安装依赖
```
npm install
npm run postinstall
```
### 6. 启动开发服务器
```
npm run dev
```
这将启动共享类型监听器、客户端(运行在 `http://localhost:5173` 的 Vite)和服务器(运行在 `http://localhost:3000` 的 Express)。
### 7. 打开应用
在浏览器中打开:
```
http://localhost:5173
```
在 `/register` 注册一个新账户,然后你将看到仪表板。
### Windows 特定说明
| 功能 | Windows 行为 |
|:--------|:-----------------|
| **进程监控** | 列出所有 Windows 进程(`.exe` 文件)。终止操作使用 `taskkill /PID /F`。 |
| **文件扫描器** | 适用于 Windows 路径(例如 `C:\Users\YourName\Documents`)。请使用反斜杠。 |
| **IOC 狩猎** | 搜索 Windows 进程和文件系统。使用诸如 `C:\temp\test` 的路径。 |
| **行为检测** | 检测 Windows 特定的威胁:`svchost.exe`、`lsass.exe` 注入、`%TEMP%` 目录生成、编码的 PowerShell 命令。 |
### Windows 故障排除
| 问题 | 解决方案 |
|:--------|:---------|
| 无法识别 `mongosh` | 将 MongoDB 的 `bin` 文件夹添加到你的 PATH 中:`C:\Program Files\MongoDB\Server\7.0\bin` |
| `net start MongoDB` 失败 | 打开服务 (`services.msc`),找到 "MongoDB Server",右键点击 → 启动 |
| `npm install` 因 Python 错误而失败 | 安装 Windows Build Tools:`npm install -g windows-build-tools`(以管理员身份运行) |
| 终止进程时权限被拒绝 | 以**管理员身份**运行终端 |
| 端口 3000 已被占用 | 找到并终止它:`netstat -ano \| findstr :3000` 然后 `taskkill /PID /F` |
## 项目结构
```
SIERN_EX/
├── client/ # React Frontend (Vite)
│ ├── src/
│ │ ├── api/ # Axios API clients
│ │ ├── components/ # UI components (Shadcn/Radix)
│ │ ├── contexts/ # Auth context provider
│ │ ├── pages/ # Route pages
│ │ └── App.tsx # Router definition
│ └── vite.config.ts # Dev server + API proxy config
├── server/ # Express Backend
│ ├── config/ # DB connection
│ ├── models/ # Mongoose schemas
│ ├── routes/ # API route handlers
│ ├── services/ # Business logic
│ ├── utils/ # JWT helpers
│ └── server.ts # Entry point
├── shared/ # Shared TypeScript types
├── .env.example # Environment template
└── package.json # Root monorepo scripts
```
## 许可证
ISC
标签:Docker, EDR, GNU通用公共许可证, HTTP/HTTPS抓包, IOC狩猎, MITM代理, MongoDB, Node.js, osquery, Web安全, 子域名变形, 子域名枚举, 安全运营中心, 安全防御评估, 库, 应急响应, 态势感知, 无线安全, 端点安全, 系统安全, 网络安全, 网络安全审计, 网络映射, 脆弱性评估, 自动化攻击, 蓝队分析, 行为异常检测, 补丁管理, 请求拦截, 运维安全, 隐私保护