SynapCores/sentryGraph
GitHub: SynapCores/sentryGraph
基于 SynapCores AIDB 的实时威胁检测演示项目,通过图遍历、向量相似度和 NL2SQL 在单一 SQL 平台上将钓鱼到 BEC 的完整攻击链在 60 秒内关联展示。
Stars: 0 | Forks: 0
# SentryGraph
SentryGraph 是一个基于 **SynapCores AIDB** 构建的演示者驱动型演示。它展示了该平台为安全工作负载所整合的能力:HTTP + 身份验证 + 邮件事件流、跨 IP / JA3 / 用户 / 域名节点的图遍历、针对行为和内容嵌入的向量相似度,以及 NL2SQL —— 所有这些都可以通过单个 Node.js SDK 访问。
本代码仓库是驱动该演示的 **前端 + BFF (Backend for Frontend)**。数据库引擎 (AIDB) 是一个独立的依赖项。
## 演示展示的内容
一个协同的撞库僵尸网络反复失败后,转移到 TOR 出口节点 IP,并最终找到了正确的密码。SOC (安全运营中心) 能够看到这一点。但它通常看不到——并且本演示在同一个查询平面上展示出来的——是登录事件周围的所有信息:
1. **通过一个 JA3 TLS 指纹关联起来的 12 节点僵尸网络。** 最终成功的 IP 从 SIEM 规则的角度来看是“干净”的(没有来自它的失败登录记录)。通过共享的 JA3 哈希进行的一跳图遍历揭示了,它与刚刚花费 47 次尝试暴力破解的 12 个 IP 同属于一个攻击者基础设施。
2. **一个发生在 14 分钟前的钓鱼链接点击。** 被攻陷的同一个用户在 14 分钟前点击了 `paypa1-secure.com`。在用户节点上的图遍历会经过 `(User)-[CLICKED]→(Domain)-[SHARES_REGISTRAR]→(Domain)`,并揭示出一个在同一周注册的同源恶意域名。
3. **更广泛的攻击活动。** 一条 SQL/NL2SQL 查询(`SELECT users who clicked paypa1-secure.com in the last 24h`)返回了 7 名员工,而不仅仅是被攻陷的那一位——SOC 可以先发制人地撤销会话并强制重置密码。
4. **同一 `incident_id` 下的第二个警报。** 被劫持的会话立即起草了一封发往 `finance@acme.com` 的修改汇款账户邮件。由于它与现有的活跃事件相关联,而不仅仅是基于原始分数,因此其严重级别被自动判定为严重。
到最后,观众将看到 HTTP 请求、身份验证事件、邮件事件、图遍历、向量相似度和 NL2SQL——所有这些都位于同一个数据库中,全部在没有 ETL 的情况下实时关联。
## 演示环节时间表
| 时间 | 环节 | 亮灯显示内容 |
|-------|-------------------------|-------------------------------------------------------------|
| 0:00 | 背景 HTTP / 身份验证 | 流式ticker,EPS 计数器 |
| 0:18 | `cred_stuffing_burst` | 来自共享 JA3 #1 的 12 个 IP 的 47 次失败(黄带,无警报) |
| 0:22 | `ato_success` | TOR 出口节点成功 → **严重警报**,触发图谱展示 |
| 0:36 | `phish_reveal` | 发生在 14 分钟前的钓鱼链接点击被拉回至 ticker |
| 0:44 | `bec_attempt` | 修改汇款账户邮件 → **第二个严重警报**,同一事件|
## 系统架构
```
┌─────────────────────────┐ WebSocket + REST ┌──────────────────────────┐
│ React + Vite frontend │ ◀────────────────────▶ │ Node.js BFF (Fastify) │
│ - event ticker │ │ - synthetic generator │
│ - risk panel + gauge │ │ - WS broadcast hub │
│ - graph reveal │ │ - graph/vector queries │
│ - NL2SQL console │ │ │
└─────────────────────────┘ └────────────┬─────────────┘
│ @synapcores/sdk
▼
┌──────────────────────────┐
│ SynapCores AIDB │
│ (gateway + vector + │
│ graph engine + AutoML │
│ + trigger runtime) │
└──────────────────────────┘
```
浏览器**永远不直接发送 SQL**。浏览器通过 WebSocket 向 BFF 发送 JSON。BFF 调用 SDK。这与真实应用程序具有相同的架构分层。
## 数据模型
### SQL 数据表 (`bff/src/bootstrap/schema.sql`)
| 数据表 | 作用 |
|--------------------|------------------------------------------------------------------------|
| `ip_addresses` | 1 个 TOR 出口节点 + 12 个僵尸网络 IP + 35 个背景住宅 IP |
| `ja3_fingerprints` | 5 个指纹;`mirai-bot` 哈希由 IP #1-#13 共享 |
| `sentry_users` | 50 个组织用户;`j.morgan@acme.com` 是锚点用户 |
| `domains` | 2 个恶意域名 (`paypa1-secure.com`, `paypa1-login.com`) + 8 个良性发件人|
| `http_requests` | 高写入流(约 30 req/s 的基础流量 + 场景爆发流量) |
| `auth_events` | login_fail / login_success / mfa_* / session_drop |
| `email_events` | receive / click / send / flag |
| `security_alerts` | BFF 订阅的集合。两个警报可能会共享同一个 `incident_id`,从而串联起攻击链时间线。 |
### Graph (在 `seed.ts` 中通过 Cypher 创建)
```
(Ip {tor_exit}) ─[USES_JA3]─▶ (Ja3 {mirai-bot}) ◀─[USES_JA3]─ (Ip {DigitalOcean × 12})
│
│ (after the ATO, the reveal also walks:)
│
└─▶ (User {j.morgan}) ─[CLICKED]─▶ (Domain {paypa1-secure}) ─[SHARES_REGISTRAR]─▶ (Domain {paypa1-login})
```
从 13 个 IP 中的任何一个进行 1 跳遍历,都会通过共享的 JA3 节点暴露出整个僵尸网络。从该用户进行 2 跳遍历会暴露出成对的恶意域名。
## 风险模型
`bff/src/generator/risk-model.ts` —— 一个透明的五特征评分器,其结构与 AutoML 训练器产生的结构相同 (`{score, contributions: [{name, weight}]}`):
| 特征 | 权重上限 | 触发条件 |
|-------------------------|-----------:|----------------------------------------|
| 失败登录频率 | 0.45 | 60 秒内来自同一 IP 的 47 次失败尝试 |
| JA3 僵尸网络共享 | 0.70 | 12 个 IP 共享同一个 TLS 指纹 |
| ASN 信誉 | 0.60 | TOR 出口节点 / 已知恶意 ASN |
| Endpoint 敏感度 | 0.55 | /login, /admin, 发往 finance@ 的出站邮件 |
| 地理熵 | 0.40 | 用户会话发生跨国跳跃 |
结合 `1 − ∏(1 − cᵢ)` 公式,使得任何单个大权重因子都可以将分数推高至 0.85 以上,而无需所有条件同时满足。每个场景的具体数学计算详见 `risk-model.ts` 的底部。
## BFF 接口
| 方法 | 路径 | 备注 |
|--------|-------------------------------|----------------------------------------------------|
| GET | `/healthz` | 存活探针. |
| POST | `/demo/start` | 启动生成器。幂等操作. |
| POST | `/demo/reset` | 停止生成器. |
| GET | `/demo/status` | 运行标志 + incidentId. |
| GET | `/graph/reveal?ip_id=N` | 格式化为 `{nodes, links}` 以供 react-force-graph 使用. |
| GET | `/vector/similar?user_id=N&k=`| Top-K 行为相似的用户. |
| GET | `/email/campaign?domain=…` | 点击过指定发件人域名的所有用户. |
| WS | `/ws` | 实时事件流 + 警报 + 统计数据. |
## 设置说明
### 1. 安装并启动 SynapCores 社区版
从 **** 下载 SynapCores CE 二进制文件,并按照适用于您平台的安装程序说明进行操作。安装完成后,启动网关:
```
synapcores --port 8080
```
当以下命令返回 `ok` 时,表示网关已成功启动并可访问:
```
curl http://127.0.0.1:8080/v1/health
```
### 2. 生成 API key
在浏览器中打开 ,使用安装程序最后屏幕上显示的初始管理员凭据登录,然后转到 **Settings → API Keys → Create API key**。复制该 key——它以 `aidb_` 开头。
### 3. 配置并运行 SentryGraph
```
git clone https://github.com//sentrygraph.git
cd sentrygraph
cp .env.example .env # then edit: paste your aidb_… key into AIDB_API_KEY
npm install # installs @synapcores/sdk + workspace deps
npm run bootstrap # create schema + seed IPs/users/domains/graph
npm run dev # frontend (5173) + BFF (4000), both with watch
```
打开 ,点击 **Start 60-second demo**,然后稍作等待。第一个环节 (`cred_stuffing_burst`) 将在 t=18s 时触发。
## 代码仓库布局
| 路径 | 内容 |
|-----------------------------------|-----------------------------------------------------------------|
| `frontend/` | React + Vite + TypeScript SPA |
| `bff/` | Fastify BFF,生成器,SDK 引导程序,查询路由 |
| `bff/src/generator/risk-model.ts` | 特征权重评分器(充当“预训练的 AutoML”替代方案) |
| `bff/src/generator/scenarios/` | 四个演示环节 — `credStuffing`, `atoSuccess`, `phishReveal`, `becAttempt` |
| `bff/src/bootstrap/` | `schema.sql`, `seed.ts`, `run.ts` (引导程序编排器) |
| `scripts/` | `probe-perf.ts` (性能预算探测) |
| `docs/` | 架构说明 (`SENTRYGRAPH.md`) |
## 演示中刻意未包含的内容
- **未声称可替代生产环境的 EDR/XDR。** 我们不打算取代 CrowdStrike 或 SentinelOne。SentryGraph 展示的是该数据库整合的能力,而不是在销售一个成品 SOC 产品。
- **没有真实的 JA3 捕获。** 这些指纹是预设的静态值。在生产环境部署中,它们将通过 TLS 检查代理(Suricata、Zeek、mitmproxy)提取,并关联到同一个 `ja3_fingerprints` 数据表中。
- **没有实时重训练。** 该风险模型是“预训练模型”的替代品。通过 `client.automl.train()` 进行实时重训练是一个单独的可选展示环节,不属于这个 60 秒主循环的一部分。
- **没有合成的数据包捕获。** HTTP 请求流是在应用程序事件级别(method、path、status)生成的,而不是来自合成的 pcap 文件。真实部署会通过 Vector 或 Fluent Bit 将四层网络流遥测数据关联到同一个 `http_requests` 数据表中。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
## 诚实声明
- **数据是合成的。** 生成器会生成带有嵌入式攻击场景且看起来逼真的事件。本代码库从未接触过任何真实的客户数据。
- **这不是一个生产级的 SOC 平台。** 没有 SOC2,没有 MFA,没有分析师案例管理。我们展示的是该平台整合的能力,而不是在销售一个成品。
- **47 次暴力破解之所以成功,是因为演示设定让它成功**——实际上并没有进行密码验证。真正的惊叹点应该在于图谱的展示,而不是暴力破解本身。
- **向量相似度匹配使用的是在引导阶段播种的确定性伪随机嵌入。** 它们在多次运行中是稳定的,但并不代表真实的行为指纹。在生产环境部署中,同一列将通过针对行为序列模型的 `EMBED()` 调用来填充。
- **NL2SQL 在 CE (社区版) 构建中被限制使用。** 控制台会渲染一条友好的“enable in your [stats.features] config”消息,而不是调用一个不存在的端点。在您的 AIDB 配置中开启该开关即可使用它。
- **`incident_id` 关联是 BFF 端的应用程序逻辑。** 真实的部署会将其移入 AIDB 触发器或分析师端的案例管理层中。
## 致谢
由 SynapCores 解决方案工程团队构建,旨在展示 SynapCores AIDB 在网络安全工作负载中的应用。
标签:AIDB数据库, AMSI绕过, CISA项目, GNU通用公共许可证, IP 地址批量处理, JA3指纹, MITM代理, NL2SQL, Node.js, Object Callbacks, SQL安全, 关联 incident, 凭证填充, 前端演示, 向量相似度, 商务电子邮件入侵(BEC), 图遍历, 威胁检测, 安全运营中心(SOC), 实时安全, 攻击关联分析, 时序关联, 机器人网络(Botnet), 网络钓鱼, 自动化攻击, 账户接管