ihabkhaled/auraspear-backend
GitHub: ihabkhaled/auraspear-backend
基于 NestJS 构建的多租户 AI 安全运营平台后端,通过统一 API 编排 Wazuh、Graylog、MISP 等安全工具,为 SOC 团队提供告警管理、事件响应、威胁狩猎、SOAR 自动化和 AI 辅助分析的一体化工作流。
Stars: 0 | Forks: 0
# AuraSpear SOC 后端
一个基于 NestJS 11 构建的多租户 **安全信息与事件管理 (SIEM) 服务于前端的后端** API。通过告警管理、案例追踪、威胁狩猎、威胁情报、连接器集成和 AI 辅助分析等功能为 AuraSpear SOC 仪表盘提供支持——所有功能均限定在隔离的租户范围内。
本仓库中的运维仪表盘契约保持查询驱动和可重用性,以便前端能够基于真实的后端聚合数据构建高管和操作员视图,而不是依赖页面本地的占位符计算逻辑。
## 目录
- [技术栈](#tech-stack)
- [架构](#architecture)
- [快速入门](#getting-started)
- [环境变量](#environment-variables)
- [项目结构](#project-structure)
- [API 模块](#api-modules)
- [身份验证与授权](#authentication--authorization)
- [安全加固](#security-hardening)
- [连接器集成](#connector-integrations)
- [数据库与种子数据](#database--seed-data)
- [Docker](#docker)
- [NPM 脚本](#npm-scripts)
- [代码质量](#code-quality)
## 技术栈
| 类别 | 技术 | 版本 |
| ---------------- | ------------------------ | ---- |
| 运行时 | Node.js | 22 |
| 框架 | NestJS | 11 |
| 语言 | TypeScript (严格模式) | 5.7 |
| ORM | Prisma | 6 |
| 数据库 | PostgreSQL | 16 |
| 缓存 | Redis (ioredis) | 7 |
| 校验 | Zod | 3.23 |
| 身份验证 | JWT + JWKS | 9 |
| 日志 | nestjs-pino | 4 |
| 限流 | @nestjs/throttler | 6 |
| 安全标头 | Helmet | 8 |
| API 文档 | @nestjs/swagger | 11 |
## 架构
```
Frontend (Next.js) ──► BFF (NestJS) ──┬──► Wazuh Manager (SIEM)
├──► Wazuh Indexer (Alert search)
├──► Graylog (Log management)
├──► Velociraptor (EDR / DFIR)
├──► Grafana (Dashboards)
├──► InfluxDB (Time-series)
├──► MISP (Threat intel)
├──► Shuffle (SOAR)
├──► AWS Bedrock (AI analysis)
└──► PostgreSQL + Redis (State & cache)
```
### 请求管道
每个请求都会经过一个守卫链:
1. **ThrottlerGuard** — 基于 IP 的限流
2. **AuthGuard** — JWT 验证 + 用户激活状态检查 + Token 黑名单
3. **TenantGuard** — 租户上下文验证
4. **PermissionsGuard** — 基于动态权限的授权(取代静态 RolesGuard)
5. **AuditInterceptor** — 变更日志记录(异步)
### 分层
```
Controller → Service → Repository → Prisma
↓
Utilities
```
- **Controllers** — HTTP 路由、验证、响应。不包含业务逻辑。
- **Services** — 精简的编排器。调用 repository 和 utility 函数。
- **Repositories** — 纯 Prisma 数据访问。每个查询都通过 `tenantId` 进行范围限定。
- **Utilities** — 所有业务逻辑:映射器、构建器、验证器、格式化器。
## 快速入门
### 前置条件
- Node.js >= 18, npm >= 9
- Docker + Docker Compose
### 快速启动
```
# 安装依赖项
npm install
# 配置环境
cp .env.example .env
# 编辑 .env — 设置 DATABASE_URL, JWT_SECRET, CONFIG_ENCRYPTION_KEY, SEED_DEFAULT_PASSWORD
# 启动基础设施 (Postgres + Redis + PgAdmin)
npm run docker:infra
# 运行 migrations 和 seed
npm run prisma:migrate
npm run prisma:seed
# 启动开发服务器
npm run start:dev
```
- **API**: `http://localhost:4000/api/v1`
- **Swagger**: `http://localhost:4000/api/docs` (仅限开发环境)
- **PgAdmin**: `http://localhost:5050`
### 生产环境
```
npm run build
npm start # Runs migrations + seed + production server
```
## 环境变量
将 `.env.example` 复制为 `.env`。所有变量均在那里有详细说明。
### 必需项
| 变量 | 描述 |
| ----------------------- | ------------------------------------------------ |
| `DATABASE_URL` | PostgreSQL 连接字符串 |
| `JWT_SECRET` | 用于 HS256 签名的最少 64 位十六进制字符 |
| `CONFIG_ENCRYPTION_KEY` | 用于 AES-256-GCM 的恰好 64 位十六进制字符 (32 字节) |
| `SEED_DEFAULT_PASSWORD` | 种子管理员使用的强密码(无备用方案) |
### 应用配置(含默认值)
| 变量 | 默认值 | 描述 |
| --------------------- | ----------------------- | ------------------------------ |
| `PORT` | `4000` | HTTP 服务器端口 |
| `NODE_ENV` | `production` | `production` / `development` |
| `LOG_LEVEL` | `info` | Pino 日志级别 |
| `CORS_ORIGINS` | `http://localhost:3000` | 逗号分隔的允许来源 |
| `JWT_ACCESS_EXPIRY` | `15m` | 访问令牌 TTL |
| `JWT_REFRESH_EXPIRY` | `7d` | 刷新令牌 TTL |
| `REDIS_HOST` | `localhost` | Redis 主机 |
| `REDIS_PORT` | `6379` | Redis 端口 |
### OIDC(可选 — 启用则需全部配置)
| 变量 | 描述 |
| -------------------- | -------------------------------- |
| `OIDC_AUTHORITY` | Entra ID 颁发者 URL |
| `OIDC_CLIENT_ID` | OAuth 客户端 ID |
| `OIDC_REDIRECT_URI` | 登录后重定向 URI |
| `OIDC_JWKS_URI` | 用于 RS256 验证的 JWKS 端点 |
### 连接器 URL(可选 — 在数据库中按租户覆盖)
`WAZUH_MANAGER_URL`, `WAZUH_INDEXER_URL`, `GRAYLOG_BASE_URL`, `VELOCIRAPTOR_BASE_URL`, `GRAFANA_BASE_URL`, `INFLUXDB_BASE_URL`, `MISP_BASE_URL`, `SHUFFLE_BASE_URL`
### AWS Bedrock(可选)
`AWS_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_BEDROCK_MODEL_ID`
### 种子连接器凭证(可选)
`SEED_WAZUH_PASSWORD`, `SEED_WAZUH_INDEXER_PASSWORD`, `SEED_GRAYLOG_PASSWORD`, `SEED_VELOCIRAPTOR_PASSWORD`, `SEED_GRAFANA_API_KEY`, `SEED_INFLUXDB_TOKEN`, `SEED_MISP_AUTH_KEY`, `SEED_SHUFFLE_API_KEY`
## 项目结构
```
src/
├── main.ts # Bootstrap (Helmet, CORS, Swagger, rate limits)
├── app.module.ts # Root module
├── common/
│ ├── decorators/ # @CurrentUser, @RequirePermission, @Public, @TenantId
│ ├── filters/ # GlobalExceptionFilter (error sanitization)
│ ├── guards/ # AuthGuard, TenantGuard, PermissionsGuard
│ ├── interceptors/ # AuditInterceptor
│ ├── interfaces/ # JwtPayload, AuthenticatedRequest
│ ├── pipes/ # ZodValidationPipe
│ ├── enums/ # Shared enums
│ ├── constants/ # Shared constants
│ └── utils/ # encryption, mask, ssrf, es-sanitize, query
├── config/ # env.validation.ts (Zod env schema)
├── modules/ # 32 API modules (see below)
└── prisma/ # PrismaModule, PrismaService
```
### 模块结构
每个模块遵循以下模式:
```
src/modules//
├── .module.ts
├── .controller.ts
├── .service.ts
├── .repository.ts
├── .utilities.ts
├── .types.ts
├── .enums.ts
├── .constants.ts
└── dto/
└── .dto.ts
```
## API 模块
| 模块 | 描述 |
| ------------------------ | ---------------------------------------------------------------- |
| **auth** | 登录,JWT 刷新,登出,Token 黑名单,带权限的 /me 接口 |
| **alerts** | 告警搜索、分诊、调查、摄取、批量操作 |
| **cases** | 案例 CRUD、笔记、时间线、关联告警、工件 |
| **role-settings** | 动态 RBAC 权限矩阵管理 |
| **case-cycles** | 案例周期管理 |
| **incidents** | 事件生命周期管理 |
| **hunts** | 结合 AI 的威胁狩猎会话 |
| **intel** | MISP 威胁情报、IOC 搜索与匹配 |
| **connectors** | 连接器 CRUD、测试、开关(9 种类型) |
| **connector-sync** | 连接器数据同步 |
| **connector-workspaces** | 特定工作区的操作(Wazuh、Graylog) |
| **dashboards** | KPI、趋势、MITRE 统计、管道健康状况 |
| **data-explorer** | 跨连接器的日志/事件搜索 |
| **correlation** | 关联规则引擎 |
| **detection-rules** | 检测规则管理 |
| **normalization** | 日志规范化管道 |
| **attack-paths** | 攻击路径分析 |
| **cloud-security** | 云账号发现 |
| **compliance** | 合规框架追踪 |
| **vulnerabilities** | 漏洞追踪 |
| **ueba** | 用户与实体行为分析 |
| **soar** | Shuffle SOAR 剧本管理 |
| **ai-agents** | AI 代理管理 |
| **ai** | AI 驱动的分析 (Bedrock) |
| **reports** | 报告生成(PDF、CSV、HTML) |
| **notifications** | WebSocket 实时通知 |
| **tenants** | 多租户 CRUD |
| **users** | 用户资料与偏好设置 |
| **audit-logs** | 审计追踪查询 |
| **app-logs** | 应用日志 |
| **health** | 系统健康检查 |
| **system-health** | 详细服务监控 |
## 身份验证与授权
### Token 生命周期
1. **登录** — 签发访问令牌 (15分钟) + 刷新令牌 (7天),两者均包含 `jti` 和 `tokenType`。响应包含基于租户和角色的 `permissions[]` 数组
2. **刷新** — 验证 Token 类型 + 黑名单,签发新 Token 对,并将旧的刷新 JTI 加入黑名单
3. **登出** — 将访问和刷新的 JTI 都加入 Redis 黑名单
4. **每次请求** — 验证 JWT,检查 `tokenType === 'access'`,检查 Redis 黑名单,验证用户是否处于激活状态
### 角色层级
| 角色 | 级别 | 描述 |
| -------------------- | ---- | ---------------- |
| `GLOBAL_ADMIN` | 1 | 平台管理员 |
| `TENANT_ADMIN` | 2 | 租户管理员 |
| `SOC_ANALYST_L2` | 3 | 高级分析师 |
| `THREAT_HUNTER` | 4 | 威胁猎人 |
| `SOC_ANALYST_L1` | 5 | 初级分析师 |
| `EXECUTIVE_READONLY` | 6 | 只读高管 |
### 动态 RBAC 与权限系统
AuraSpear 使用**数据库支持的权限矩阵**取代了静态角色检查。该系统由两个 Prisma 模型组成 — `PermissionDefinition`(包含约 70 个细粒度权限的目录)和 `RolePermission`(按租户、按角色的授权表)。
**关键行为:**
- 所有端点上的 **`@RequirePermission()` 装饰器** 取代了旧的 `@Roles()` 方法。`PermissionsGuard` 解析当前用户的角色 + 租户,查找已授予的权限,并允许或拒绝访问。
- **GLOBAL_ADMIN 始终拥有完全访问权限** — 守卫会对此角色进行短路处理。
- **具有 5 分钟 TTL 的内存缓存** 用于权限查找,避免每次请求都访问数据库。
- **登录和 `/auth/me` 会返回 `permissions[]` 数组**,以便前端可以根据实际的权限集来控制 UI 的可见性。
#### 权限类别(约 70 个权限)
权限遵循 `MODULE_ACTION` 命名约定。示例:
| 权限 | 描述 |
| ------------------------ | ---------------------------- |
| `ALERTS_VIEW` | 查看告警列表和详情 |
| `ALERTS_ESCALATE` | 将告警升级为事件 |
| `ALERTS_BULK_ACKNOWLEDGE` | 批量确认告警 |
| `ALERTS_BULK_CLOSE` | 批量关闭告警 |
| `INCIDENTS_VIEW` | 查看事件列表和详情 |
| `INCIDENTS_CHANGE_STATUS` | 更改事件状态 |
| `INCIDENTS_ADD_TIMELINE` | 添加时间线条目 |
| `CASES_CREATE` | 创建新案例 |
| `HUNTS_EXECUTE` | 执行威胁狩猎会话 |
| `CONNECTORS_MANAGE` | 创建/更新/删除连接器 |
| `USERS_MANAGE` | 管理租户用户 |
| `ROLE_SETTINGS_VIEW` | 查看角色权限矩阵 |
| `ROLE_SETTINGS_MANAGE` | 更新角色权限 |
#### 角色设置 API
| 方法 | 端点 | 描述 |
| ---- | ----------------------- | ---------------------------------------- |
| GET | `/role-settings` | 获取完整权限矩阵 |
| PUT | `/role-settings` | 更新角色权限(仅限 GLOBAL_ADMIN) |
| POST | `/role-settings/reset` | 将权限重置为种子默认值 |
数据填充程序会为所有角色填充默认权限,确保每次全新部署都有一个可用的 RBAC 基线。
### 批量告警操作
| 方法 | 端点 | 描述 |
| ---- | ------------------------- | ---------------------- |
| POST | `/alerts/bulk/acknowledge` | 批量确认多个告警 | POST | `/alerts/bulk/close` | 批量关闭多个告警 |
这两个端点都接受一个告警 ID 数组,并且需要相应的批量操作权限。
### GLOBAL_ADMIN 租户切换
GLOBAL_ADMIN 用户可以发送 `X-Tenant-Id` 标头来切换租户上下文。身份验证守卫会覆盖 `request.user.tenantId`,以便所有 `@TenantId()` 装饰器自动返回切换后的租户。
### 用户管理
- **软删除**:`status: 'inactive'`(可恢复)
- **封禁**:`status: 'suspended'`(可解封)
- **受保护用户**:种子 GLOBAL_ADMIN 拥有 `isProtected: true` 属性 — 无法被删除、封禁或更改角色
## 安全加固
| 功能 | 实现 |
| -------------------------- | ---------------------------------------------------------------- |
| **限流** | 分层:身份验证 5次/分钟,CRUD 30次/分钟,批量 5次/分钟,AI 10次/分钟 |
| **Token 撤销** | 由 Redis 支持的带 TTL 的 JTI 黑名单 |
| **静态加密** | 使用 AES-256-GCM 加密连接器配置 |
| **SSRF 防护** | 输入时的 URL 验证 + 阻止私有 IP |
| **ES 查询清理** | 剥离 `script`、`_search`、`_mapping`、`_cluster` 模式 |
| **时序攻击防护** | 针对缺失用户进行常量时间 bcrypt 比较 |
| **错误清理** | 剥离文件路径,将消息截断为 500 个字符 |
| **安全标头** | Helmet (CSP, HSTS 1年, X-Frame-Options: DENY) |
| **请求体大小限制** | 全局 1MB,每个 JSON 字段 64KB |
| **请求追踪** | X-Request-ID 中间件(每个请求生成一个 UUID) |
| **密码脱敏** | Pino `redact` 数组覆盖日志中的所有凭证字段 |
| **审计日志** | 所有变更通过 AuditInterceptor 记录 |
| **Source maps** | 在生产环境中禁用 |
| **环境变量验证** | Zod schema 拒绝零熵密钥及生产环境中的 localhost |
## 连接器集成
| 连接器 | 用途 | 认证类型 |
| ------------ | ------------------ | ----------------- |
| Wazuh Manager | SIEM 告警与代理 | 用户名/密码 |
| Wazuh Indexer | OpenSearch 日志搜索 | 用户名/密码 |
| Graylog | 日志管理 | 用户名/密码 |
| Velociraptor | EDR / DFIR | 用户名/密码 |
| Grafana | 指标仪表盘 | API Key |
| InfluxDB | 时间序列数据 | Token |
| MISP | 威胁情报 | Auth Key |
| Shuffle | SOAR 工作流 | API Key |
| AWS Bedrock | AI 分析 | IAM 凭证 |
所有连接器配置均使用 AES-256-GCM 加密,并在存储前使用按类型划分的 Zod schema 进行验证。
## 数据库与种子数据
### Schema
通过 Prisma 使用 PostgreSQL,包含 20 多个模型,包括:`Tenant`、`TenantUser`、`TenantMembership`、`ConnectorConfig`、`Alert`、`Case`、`CaseNote`、`CaseTimeline`、`HuntSession`、`HuntEvent`、`IntelIOC`、`IntelMispEvent`、`AuditLog`、`AiAuditLog`、`Incident`、`SavedQuery`、`PermissionDefinition`、`RolePermission`,以及用于合规、漏洞、UEBA、SOAR、检测规则和关联的领域特定模型。
### 数据填充
种子脚本是**幂等的** — 可以安全地多次运行。它们会创建:
- 具有确定性 UUID 的默认租户
- 受保护的 GLOBAL_ADMIN 用户
- 默认权限定义(约 70 个细粒度权限)
- 每个租户下所有角色的默认角色权限分配
- 示例连接器配置(凭证来自环境变量,无硬编码密码)
- 示例告警、案例和查找数据
```
npm run prisma:seed
```
## Docker
### Compose 文件
| 文件 | 用途 |
| ------------------------------ | ------------------------------------------------- |
| `docker-compose.yml` | 生产环境 (Postgres + Redis + Backend) |
| `docker-compose.dev.yml` | 开发环境 (+ PgAdmin,热重载) |
| `docker-compose.prod.yml` | 生产环境构建 (仅暴露端口 4000) |
| `docker-compose.infra.yml` | 仅基础设施 (Postgres + Redis + PgAdmin) |
| `docker-compose.connectors.yml` | 安全连接器 (Wazuh, Graylog 等) |
### 常用命令
```
npm run docker:infra # Start Postgres + Redis + PgAdmin
npm run docker:dev # Full dev environment
npm run docker:prod # Production build
npm run docker:connectors # Security tool containers
npm run docker:all # Everything
```
## NPM 脚本
```
# 开发
npm run start:dev # Dev with watch mode
npm run start:debug # Debug with watch
# 构建与生产
npm run build # Production build
npm start # Migrations + seed + production server
# 验证 (提交前运行)
npm run validate # typecheck + lint:strict + format:check
npm run validate:full # validate + tests + production build
npm run validate:fix # lint:fix + format
# 数据库
npm run prisma:migrate # Run migrations (dev)
npm run prisma:seed # Seed database
npm run prisma:studio # Open Prisma Studio
# 测试
npm test # Unit tests
npm run test:cov # With coverage
npm run test:e2e # End-to-end tests
```
## 贡献者指南
- 迁移与种子数据: [`docs/migrations-and-seeds.md`](./docs/migrations-and-seeds.md)
- 权限与角色: [`docs/permissions-and-roles.md`](./docs/permissions-and-roles.md)
- 添加连接器: [`docs/adding-connectors.md`](./docs/adding-connectors.md)
- AI 代理安全性: [`docs/ai-agent-safety.md`](./docs/ai-agent-safety.md)
- AI 自动化系统: [`docs/AI-AUTOMATION.md`](./docs/AI-AUTOMATION.md) -- 28 个代理目录、执行流程、配置与安全性
- AI 提供者路由: [`docs/AI-ROUTING.md`](./docs/AI-ROUTING.md) -- Bedrock/LLM APIs/OpenClaw 选择、回退、能力矩阵
- 权限参考: [`docs/PERMISSIONS.md`](./docs/PERMISSIONS.md) -- 涵盖 12 个角色的完整 136 项权限矩阵
- 贡献工作流: [`CONTRIBUTING.md`](./CONTRIBUTING.md)
- 安装与本地环境: [`INSTALL.md`](./INSTALL.md)
## 代码质量
### 强制执行规则
- **禁止使用 `any`** — 请使用 `unknown`、泛型或适当的类型
- **禁止禁用 ESLint** — 必须修复根本原因
- **禁止使用 `console.log`** — 请使用 NestJS `Logger`
- **禁止使用原始字符串字面量** — 请使用枚举
- **禁止内联类型** — 所有类型必须位于 `*.types.ts` 文件中
- **禁止内联常量/枚举** — 所有定义必须位于 `*.constants.ts` / `*.enums.ts` 文件中
- **服务中禁止直接使用 Prisma** — 必须全部通过 repository
- **控制器中禁止包含业务逻辑** — 请委托给服务
- **repository 中禁止包含逻辑** — 仅限纯粹的数据访问
- 所有函数必须具有 **显式返回类型**
- 所有 Zod 字符串/数组字段必须使用 **`.max()`**
- 所有错误必须使用带有 `messageKey` 的 **`BusinessException`**(支持 6 种语言的 i18n)
- 每个 `update()` / `delete()` 的 where 子句中必须包含 **`tenantId`**
### 预提交钩子
每次提交都会运行 Husky + lint-staged:
1. 对暂存的 `.ts` 文件执行 ESLint
2. TypeScript 类型检查 (`tsc --noEmit`)
3. Prettier 格式化
### 提交约定
通过 commitlint 强制执行约定式提交:`feat:`、`fix:`、`refactor:`、`docs:`、`test:`、`chore:`
标签:AI助手, AI安全平台, AI智能体, BFF架构, FTP漏洞扫描, GPT, MITM代理, NestJS, PostgreSQL, Prisma, Redis, SOAR, TypeScript, UEBA, 全栈安全, 关联分析, 后端开发, 威胁情报, 安全插件, 安全编排, 安全运营中心, 开发者工具, 搜索引擎查询, 案件追踪, 测试用例, 漏洞管理, 网络映射, 自动化响应, 警报管理, 请求拦截