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), 网络钓鱼, 自动化攻击, 账户接管