superduperpiyuxh/narrator-ai
GitHub: superduperpiyuxh/narrator-ai
一款 AI 驱动的 SOC 仪表板,将原始 SIEM 日志自动关联分组、映射 MITRE ATT&CK 技术并生成可读的攻击叙述,帮助安全分析师快速理解事件全貌。
Stars: 0 | Forks: 0
# 🛡️ Nexus
### AI 驱动的安全事件叙述生成器
**使用 AI 将原始 SIEM 告警转化为按时间顺序排列的攻击故事。**
[](https://go.dev)
[](https://nextjs.org)
[](https://typescriptlang.org)
[](https://tailwindcss.com)
[](LICENSE)
[快速开始](#-quick-start) • [功能](#-features) • [技术栈](#-tech-stack) • [API](#-api-reference) • [Docker](#-docker-setup)
## 🚀 快速开始
### 前置条件
- **Go** 1.26+
- **Node.js** 18+
- **npm** 或 **yarn**
### 1. 克隆与配置
```
git clone https://github.com/superduperpiyuxh/narrator-ai.git
cd narrator-ai
# 创建你的 config
cp .env.example backend/.env
# 编辑 backend/.env 并添加你的 OpenRouter API key
```
### 2. 启动后端
```
cd backend
go build -o narrator-ai .
./narrator-ai
# Backend 运行在 http://localhost:8080
```
### 3. 启动前端
```
cd frontend
npm install
npm run dev
# Frontend 运行在 http://localhost:3000
```
### 4. 打开并登录
访问 **http://localhost:3000** 并登录:
| 字段 | 值 |
|-------|-------|
| Email | `admin@nexus.ai` |
| Password | `admin123` |
## 🎯 功能简介
Nexus 会提取原始安全事件日志(SIEM 数据),将它们分组为事件,映射到 MITRE ATT&CK 技术,并使用 AI 生成通俗易懂的攻击叙述 —— 这样您的 SOC 团队无需解析 500 行 JSON 就能了解发生了什么。
### 痛点问题
安全分析师花费数小时在各种仪表板之间关联事件,手动编写事件报告,并试图向非技术背景的利益相关者解释技术告警。
### 解决方案
Nexus 会自动完成关联、分组、技术映射和叙述生成。只需输入事件,即可获得故事。
## ✨ 功能
### 核心
- **AI 叙述生成** — LLM 读取数百个事件,并编写带有来源追踪的按时间顺序排列的攻击故事
- **MITRE ATT&CK 映射** — 自动识别技术并可视化杀伤链
- **事件分组** — 根据源 IP 和时间窗口自动对相关事件进行分组
- **严重性评分** — 严重 / 高 / 中 / 低 分类
- **实时流** — 基于 SSE 的实时事件摄取,支持自动重连
- **BYOK(自带密钥)** — 使用您自己的 OpenRouter API 密钥进行 LLM 访问
### 仪表板
- **全宽垂直布局** — 统计卡片、热力图、实时流、事件网格
- **MITRE ATT&CK 热力图** — 跨战术的可视化技术覆盖范围
- **杀伤链视图** — 跨阶段的可视化攻击进程
- **时间线视图** — 带有可展开详情的按时间顺序排列的事件浏览器
- **命令面板** — `Ctrl+K` 即时搜索事件
- **键盘快捷键** — `j/k` 导航,`Enter` 打开,`g+h` 回到主页
### 安全性
- **JWT 身份验证** — 基于 token 的会话,使用 bcrypt 进行密码哈希处理
- **用户级范围界定** — 每个用户只能看到自己的数据
- **4 层 LLM 安全流水线** — 模式检测 → XML 封装 → 输出验证 → 置信度评分
- **速率限制** — 每个用户每分钟生成 5 次叙述
- **输入净化** — 防止 SQL 注入和 XSS
### 排版
- **Space Grotesk** — 用于 UI 文本的几何无衬线字体
- **Fira Code** — 带有连字功能的等宽字体,用于代码/数据视图
- **CSS 变量系统** — 18+ 个语义 token 用于主题化
## 🛠️ 技术栈
### 后端
| 组件 | 技术 |
|-----------|-----------|
| 语言 | Go 1.26 |
| HTTP 框架 | Gin |
| 数据库 | SQLite (WAL 模式) |
| 认证 | JWT + bcrypt |
| LLM 提供商 | OpenRouter (免费模型轮换) |
| 速率限制器 | 内存级用户独立限制 |
| 实时 | Server-Sent Events (SSE) |
### 前端
| 组件 | 技术 |
|-----------|-----------|
| 框架 | Next.js 16 (App Router) |
| 语言 | TypeScript 5 |
| 样式 | Tailwind CSS 4 |
| 状态 | SWR + React hooks |
| 图标 | Lucide React |
| 通知 | React Hot Toast |
### 关键库
- **gin-gonic/gin** — HTTP 框架
- **golang-jwt/jwt** — JWT token
- **mattn/go-sqlite3** — SQLite 驱动
- **joho/godotenv** — .env 文件加载
- **swr** — 带有缓存的数据获取
- **tailwind-merge** — Class 去重
- **lucide-react** — 图标系统
## 📁 项目结构
```
narrator-ai/
├── backend/
│ ├── main.go # Entry point, route registration
│ ├── internal/
│ │ ├── auth/
│ │ │ ├── service.go # User/Claims, Signup, Login
│ │ │ ├── middleware.go # JWT auth middleware
│ │ │ └── ratelimit.go # Per-user rate limiter
│ │ ├── config/
│ │ │ └── config.go # Environment config
│ │ ├── database/
│ │ │ ├── queries.go # Event CRUD, search
│ │ │ └── incidents.go # Incident CRUD
│ │ └── handler/
│ │ ├── handler.go # Health, events, search
│ │ ├── incident_handler.go # Incidents, techniques
│ │ ├── narrative_handler.go # LLM narrative generation
│ │ ├── feedback_handler.go # User feedback
│ │ ├── ingest_handler.go # Event ingestion
│ │ └── stream_handler.go # SSE real-time streaming
│ ├── Dockerfile
│ └── go.mod
├── frontend/
│ ├── src/
│ │ ├── app/
│ │ │ ├── page.tsx # Dashboard (main)
│ │ │ ├── layout.tsx # Root layout + fonts
│ │ │ ├── globals.css # CSS variables + tokens
│ │ │ ├── login/page.tsx # Login
│ │ │ ├── signup/page.tsx # Signup
│ │ │ ├── settings/page.tsx # API key management
│ │ │ └── incidents/[id]/ # Incident detail
│ │ ├── components/
│ │ │ ├── CommandPalette.tsx # Cmd+K search
│ │ │ ├── TechniqueHeatmap.tsx # MITRE heatmap
│ │ │ ├── KillChain.tsx # Kill chain view
│ │ │ ├── TimelineView.tsx # Event timeline
│ │ │ ├── LiveEventStream.tsx # SSE event ticker
│ │ │ ├── IncidentCard.tsx # Incident cards
│ │ │ ├── StoryCard.tsx # Narrative display
│ │ │ ├── NarrativeSentence.tsx # Sentence with source links
│ │ │ └── ... (15+ components)
│ │ ├── hooks/
│ │ │ ├── useSSE.ts # SSE with auto-reconnect
│ │ │ └── useCommandPalette.ts
│ │ └── lib/
│ │ ├── api.ts # Auth-aware API client
│ │ ├── types.ts # TypeScript interfaces
│ │ └── utils.ts # cn(), formatters
│ ├── Dockerfile
│ └── package.json
├── data/ # Sample JSON datasets
├── scripts/ # Import utilities
├── docker-compose.yml
├── start.sh # Start backend
├── stop.sh # Stop backend
└── .env.example # Configuration template
```
## 🐳 Docker 设置
```
# 复制并配置环境
cp .env.example .env
# 编辑 .env 并填入你的 OPENROUTER_API_KEY
# 构建并运行
docker-compose up --build
# 访问
# Frontend: http://localhost:3000
# Backend: http://localhost:8080
```
### Docker 服务
| 服务 | 端口 | 描述 |
|---------|------|-------------|
| `backend` | 8080 | 带有 SQLite 的 Go API 服务器 |
| `frontend` | 3000 | Next.js 仪表板 |
## ⚙️ 配置
所有配置都在 `backend/.env` 中(启动时自动加载):
```
# 必需:用于 LLM 叙述的 OpenRouter API key
OPENROUTER_API_KEY=sk-or-v1-your-key-here
# 安全:用于 session token 的 JWT secret
JWT_SECRET=your-random-secret-here
# 认证:默认管理员密码
ADMIN_PASSWORD=changeme-in-production
# Server
PORT=8080
# Database
DATABASE_PATH=./narratorai.db
# 示例数据
DATA_DIR=../data/sample_json_20260301
```
### 获取 OpenRouter API 密钥
1. 前往 [openrouter.ai/keys](https://openrouter.ai/keys)
2. 创建一个免费账户
3. 生成 API 密钥
4. 将其添加到 `backend/.env`
Nexus 使用带有自动轮换机制的免费模型:
- `gpt-4o-mini`
- `llama-4-maverick:free`
- `nemotron-70b:free`
## 📡 API 参考
### 公共端点
| 方法 | 端点 | 描述 |
|--------|----------|-------------|
| `GET` | `/health` | 健康检查 |
| `POST` | `/api/auth/signup` | 创建账户 |
| `POST` | `/api/auth/login` | 登录 |
### 受保护的端点(需要 `Authorization: Bearer
**由 [superduperpiyuxh](https://github.com/superduperpiyuxh) 用 💪 构建**
*如果这个项目对您有帮助,请给它一个 ⭐*
标签:DLL 劫持, EVTX分析, Go, Ruby工具, SOC仪表盘, 大语言模型, 安全运营, 扫描框架, 日志审计, 请求拦截