Dustin-Fuller/securiai-nexus
GitHub: Dustin-Fuller/securiai-nexus
一款面向大模型场景的零信任安全网关,融合身份认证、提示注入检测、审批工作流与 SIEM 联动,解决 AI 推理中的访问控制与威胁响应问题。
Stars: 0 | Forks: 0
# SecureAI Nexus
一个企业级 AI 安全网关,演示零信任身份治理、策略驱动自动化以及多智能体 AI 系统的实时威胁检测。
构建分为 9 个阶段,覆盖 AI 安全的完整生命周期:从身份与访问控制,到威胁检测、事件响应和运营加固。
## 截图
**认证并查询网关**

通过 `/auth/token` 使用 Bob 的凭证签发 JWT,随后立即用于向 `/query` 发送提示。网关验证令牌、检查 RBAC 权限、通过 PromptSecurityLayer 筛选提示,并返回模型响应——所有操作均在单个认证请求周期内完成。
**网关启动与实时请求处理**

Uvicorn 启动 FastAPI 应用,启动 WatchFiles 重载器并开始接收请求。`/auth/token` 和 `/query` 的 `200 OK` 响应确认完整中间件链——JWT 验证、RBAC 强制、速率限制与 PromptSecurityLayer——均已就绪。
**与 ECS 兼容的结构化审计日志**

每个请求在调用模型前将结构化 JSON 条目写入 `logs/audit.jsonl`。每行包含 `correlation_id`、`timestamp`、`sub`、`role`、`risk_score`、`risk_level` 和 `outcome` —— 字段与 Elastic Common Schema 对齐,以便日志可直接传输到任意企业 SIEM。
**提示注入测试套件**

针对运行中网关的第 3 阶段对抗测试套件。绿色行表示被正确拦截并返回 HTTP 400 的注入尝试。该套件涵盖直接覆盖、人格劫持、越狱关键词、结构化格式注入(`SYSTEM:`、`[ADMIN]`、` ```system ``` `)以及超置框架,验证没有一条提示到达模型。
**RBAC 强制——高风险操作排队**

Bob(操作员角色)对生产目标提交 `disable_account` 操作。风险评分器返回 `0.95 / critical`,自动覆盖其请求的 `auto` 模式并将操作强制加入 SQLite 审批队列。响应包含 `action_id`、`risk_score`、`risk_level` 和 `status: pending` —— 执行引擎在未获主管签名前拒绝继续。
**主管审批工作流**

Dave(主管角色)查询审批队列,审查待处理操作并批准其附带审计备注。队列条目状态从 `pending → approved → executed` 流转,且包含共享 `correlation_id` 的完整责任链(谁提交、谁批准、何时变更)均写入审计日志。
**n8n 事件响应工作流 —— 检测到注入**

针对 `injection_detected` 剧本的 n8n 事件响应工作流。当网关触发 Webhook 时,n8n 并行通过两个 HTTP 请求节点处理 1 个条目:一个 POST Discord 告警,另一个通过 ngrok 将审计回写写入网关的 `/webhook/alert` 端点。所有三个节点显示绿色 —— 完整事件响应流水线成功执行。
**Discord 安全告警实时触发**

三个不同的 IR 剧本触发至 Discord 告警频道:`injection_detected`(风险:严重)、`high_risk_execution`(风险:高)以及 `repeated_auth_failures` —— 在 Carol 于 10 分钟内达到 3 次失败阈值后触发。每个告警均包含 `correlation_id`、`agent`、`risk_level` 和时间戳,以便值班响应人员在无需打开仪表板的情况下获得完整上下文。
**安全测试套件——测试中途的失败正在解决**

一次中间测试运行,显示套件在捕获合法提示被过度拦截(误报)的同时,也遗漏了真实注入。这是调整 `system_prompts.py` 中 35+ 正则表达式的迭代过程:收紧遗漏攻击的模式,同时放宽将“DAN 在网络中代表什么?”之类问题误判为注入的模式。
**最终测试运行——139 通过**

全部 140 项测试的最终 pytest 运行:139 通过,1 跳过(需要运行中的 Ollama 实例的实时 bcrypt 集成测试),0 失败。这涵盖了认证、RBAC、注入检测、权限提升、间接注入、输出净化、执行引擎、审批队列、事件响应通知器、速率限制器、风险评分器以及 LDAP/OAuth 联合身份验证 —— 全面的安全覆盖端到端测试。
**Grafana SIEM 仪表板**

展示 24 小时活动的实时 Grafana 仪表板:**115 个关键事件**、**1 次高危执行**、**115 次注入尝试**以及 **95 次认证失败** —— 全部源自 `logs/audit.jsonl`,并通过 Promtail 与 Loki 获取。左侧“按风险级别随时间变化的事件”面板显示了对抗测试期间的峰值。底部原始日志面板以实时方式流式传输与 ECS 兼容的 JSON 条目,并使用 `risk_level` 和 `event_type` 作为可查询的 Loki 标签。
## 作用
SecureAI Nexus 位于你的用户/智能体与本地 LLM(Ollama)之间,执行以下操作:
- **谁**可以调用模型(JWT + RBAC,4 种身份类型)
- **什么**可以询问(提示注入检测、系统提示隔离)
- **什么操作**模型可触发(带审批工作流的执行引擎)
- **记录什么**(与 ECS 兼容的审计追踪、Grafana/Loki SIEM)
- **当出错时通知谁**(n8n 事件响应工作流 → Discord)
## 架构
```
Incoming request
→ Identity Middleware (JWT validation → role resolution → rate limiting)
→ PromptSecurityLayer (injection screening → system prompt → output sanitization)
→ model_client (Ollama LLM) / ExecutionEngine (actions)
→ Structured audit log (ECS-aligned JSON → Loki → Grafana)
→ IR notification (n8n webhook → Discord alert)
```
### 身份入口点
| 路径 | 提供者 | 身份类型 |
|------|--------|----------|
| `/auth/token` | 本地 users.yaml / LDAP | HumanUser、AIAgent、ServiceAccount、APIClient |
| `/auth/okta/login` | Okta SSO | HumanUser |
| `/auth/entra/token` | 微软 Entra ID | ServiceAccount |
## 安全覆盖范围
| OWASP LLM 风险 | 缓解措施 |
|----------------|----------|
| LLM01 — 提示注入 | `PromptSecurityLayer`:30+ 正则表达式模式,在调用模型前预筛选 |
| LLM06 — 敏感信息泄露 | 输出净化:脱敏 JWT、bcrypt 哈希、环境变量、PEM 密钥 |
| LLM08 — 过度代理 | 执行引擎:模拟 / 手动(SQLite 审批队列)/ 自动;高风险操作需要主管令牌 |
## 阶段分解
| 阶段 | 构建内容 |
|------|----------|
| 1 | FastAPI 网关包装 Ollama;关联 ID + 结构化 JSON 日志 |
| 2 | RBAC 身份层:`HumanUser`、`ServiceAccount`、`AIAgent`、`APIClient`;JWT 中间件;YAML 权限矩阵 |
| 3 | `PromptSecurityLayer`:注入检测(LLM01)、系统提示隔离、输出净化(LLM06) |
| 4 | 通过 `ldap3` 集成 AD/LDAP —— AD 组 → 内部角色 → 作用域 JWT |
| 5 | Okta + 微软 Entra ID 联合 OAuth 2.0(人类用户与服务账户) |
| 6 | 执行引擎:`模拟` / `手动`(SQLite 审批队列)/ `自动`;高风险操作需要主管令牌(LLM08) |
| 7 | 与 ECS 兼容的日志模式、规则化风险评分器、Grafana + LokiEM 堆栈 |
| 8 | n8n 事件响应工作流:注入检测 / 重复认证失败 / 高风险执行 → Discord 告警 + 审计回写 |
| 9 | 令牌桶速率限制(每个身份)、STRIDE 威胁模型、`SECURITY.md`、`RUNBOOK.md`、mTLS 文档 |
## 技术栈
- **网关**:Python 3.14、FastAPI、uvicorn
- **LLM**:Ollama(本地)
- **认证**:PyJWT、bcrypt、ldap3、httpx(用于 Okta/Entra)
- **存储**:SQLite(审批队列)
- **SIEM**:Grafana + Loki + Promtail(Docker Compose)
- **事件响应**:n8n(自托管)、Discord Webhooks
- **测试**:pytest、pytest-asyncio —— 139/140 通过
## 快速启动
```
# 1. Clone and create virtual environment
git clone https://github.com/Dustin-Fuller/securiai-nexus.git
cd securiai-nexus
python -m venv venv
.\venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/macOS
# 2. Install dependencies
pip install -r requirements.txt
# 3. Configure environment
cp .env.example .env
# Edit .env — set JWT_SECRET_KEY at minimum
# 4. Start Ollama (required for /query endpoint)
ollama pull llama3.2
# 5. Run the gateway
uvicorn gateway.main:app --reload --port 8000
# 6. Run tests
pytest tests/ -v
```
## 关键端点
| 方法 | 路径 | 描述 |
|------|------|------|
| `POST` | `/auth/token` | 签发 JWT(用户名 + 密码) |
| `POST` | `/auth/okta/login` | 启动 Okta SSO 流程 |
| `POST` | `/auth/entra/token` | Entra ID 客户端凭据 |
| `POST` | `/query` | 向 LLM 发送提示(经过注入筛查) |
| `POST` | `/execute` | 向执行引擎提交操作 |
| `GET` | `/queue` | 列出待审批项(主管) |
| `POST` | `/approve/{id}` | 审批排队操作 |
| `POST` | `/reject/{id}` | 拒绝排队操作 |
| `GET` | `/health` | 健康检查 |
## SIEM 堆栈(阶段 7)
```
cd monitoring
docker compose up -d
```
- **Grafana**:http://localhost:3000(admin/admin)
- **Loki**:从 `logs/audit.jsonl` 聚合日志
- **Promtail**:以 `risk_level` 和 `event_type` 标签传输日志
仪表板面板:提示注入尝试、认证失败、执行事件、风险评分时间线。
## 事件响应工作流(阶段 8)
由网关安全事件触发的三个 n8n 剧本:
| 触发条件 | 条件 | 操作 |
|----------|------|------|
| `injection_detected` | 任意提示注入尝试 | Discord 告警 + 审计回写 |
| `repeated_auth_failures` | 同一身份在 10 分钟内 3 次失败 | Discord 告警 + 审计回写 |
| `high_risk_execution` | 执行事件风险级别为 high/critical | Discord 告警 + 审计回写 |
需要一个自托管的 n8n 实例和 Discord Webhook URL —— 在 `.env` 中配置。
## 项目结构
```
securiai-nexus/
├── gateway/ # FastAPI app — middleware, auth, security, logging
│ ├── main.py # Route definitions
│ ├── middleware.py # JWT validation + rate limiting
│ ├── security.py # PromptSecurityLayer
│ ├── auth.py # JWT issue/decode, RBAC, credential verification
│ ├── logger.py # ECS-aligned structured log writer + IR triggers
│ ├── ir_notifier.py # Async n8n webhook fire-and-forget
│ └── rate_limiter.py # Token bucket (per identity)
├── executor/ # Action execution engine + SQLite approval queue
├── identity/ # rbac.yaml permissions matrix, users.yaml
├── monitoring/ # Grafana + Loki + Promtail Docker Compose stack
├── tests/
│ └── attacks/ # Adversarial test scripts (injection, escalation, indirect)
├── docs/ # STRIDE.md, RUNBOOK.md, mtls.md
├── scripts/ # gen_certs.sh for mTLS local dev
└── SECURITY.md # Vulnerability disclosure policy
```
## 文档
- [`docs/STRIDE.md`](docs/STRIDE.md) —— 27 威胁 STRIDE 威胁模型及剩余风险评级
- [`docs/RUNBOOK.md`](docs/RUNBOOK.md) —— 运营事件响应流程
- [`docs/mtls.md`](docs/mtls.md) —— 服务间认证的 mTLS 部署指南
- [`SECURITY.md`](SECURITY.md) —— 漏洞披露策略
## 许可证
MIT
标签:AI安全网关, AI生命周期安全, AI风险缓解, AMSI绕过, API网关, AV绕过, ECS, Elastic Common Schema, FastAPI, HTTPS, JSONLines, JSONL日志, JWT, OWASP LLM01, OWASP LLM06, OWASP LLM08, PB级数据处理, PyRIT, RBAC, reloader, Terraform, Uvicorn, WatchFiles热重载, 事中响应, 企业安全, 多智能体系统, 威胁检测, 安全中间件, 安全规则引擎, 安全运维, 实时威胁检测, 提示词注入检测, 日志采集, 构建工具, 策略自动化, 结构化审计日志, 网络资产管理, 角色权限控制, 身份治理, 逆向工具, 零信任, 零信任架构, 零日漏洞检测, 风险评分