dshapi/AI-SPM
GitHub: dshapi/AI-SPM
企业级 AI 安全态势管理方案,覆盖 AI 资产盘点、风险防控、策略执行与合规审计。
Stars: 5 | Forks: 0
# Orbyx AI SPM - AI 安全态势管理
本项目致力于实现企业级 AI-SPM。通过这样做,组织可以主动保护其 AI 系统免受威胁,最小化数据暴露,并保持其 AI 应用程序(智能体、MPC 服务器、模型等)的可信度。
您的组织正在全力以赴投入 AI 应用程序——您准备好保护它们了吗?
在回答之前,请思考以下具体问题:
您能识别出环境中所有的影子 AI(包括 AI 模型、智能体及相关资源)吗?
您是否有效地保护 AI 数据以防止数据投毒、偏见和合规违规?
您知道如何根据上下文优先处理关键 AI 风险吗?
您是否有信心能够检测并快速响应 AI 管道中的可疑活动?
如果对上述问题中的任何一个回答“不确定”或“否”,那么您应该更深入地了解这个项目。这是了解您 AI 生态系统安全现状的方式。 发现您的 AI 智能体、模型及相关资源的安全性。 识别 AI 应用程序供应链/流水线中的风险——这些风险可能导致数据外泄和资源滥用。 实施针对 AI 使用的适当治理控制。 [](https://opensource.org/licenses/Apache-2.0)   [](https://github.com/dshapi/AI-SPM/) 
## 📋 目录
- [项目信息](#ℹ️-project-information)
- [平台概览](#platform-at-a-glance)
- [功能特性](#features)
- [安全与访问控制](#security--access-control)
- [LLM 集成与网关](#llm-integration--gateway)
- [会话记忆](#conversation-memory)
- [可观测性与合规性](#observability--compliance)
- [基础设施与事件流水线](#infrastructure--event-pipeline)
- [UI 与开发者体验](#ui--developer-experience)
- [路线图](#roadmap)
- [安装](#installation)
- [先决条件](#prerequisites)
- [克隆与配置](#clone--configure)
- [API 密钥](#api-keys)
- [首次启动](#first-boot)
- [验证平台](#verify-the-platform)
- [访问 UI 与仪表板](#access-the-ui--dashboards)
- [运行烟雾测试](#run-the-smoke-test)
- [停止与清理](#stopping--cleaning-up)
- [使用 Keycloak + Traefik 进行本地 SSO](#local-sso-with-keycloak--traefik)
- [故障排除](#troubleshooting)
- [环境参考](#environment-reference)
- [用法](#usage)
- [技术栈](#tech-stack)
- [架构概述](#architecture-overview)
- [贡献](#contributing)
## ℹ️ 项目信息
- **👤 作者:** Dany Shapiro
- [](https://linkedin.com/in/danyshapiro) https://www.linkedin.com/in/danyshapiro/
- **📦 版本:** 1.0.0
- **📄 许可证:** Apache-2.0
- **📂 仓库:** [https://github.com/dshapi/AI-SPM](https://github.com/dshapi/AI-SPM)
## 功能特性
## 平台概览
| | |
|--------------------------|------------------------------------------------------------------|
| **微服务** | 16 |
| **OPA 策略** | 6 |
| **Kafka 主题** | 12+ |
| **管理用户界面** | 1(管理员门户) |
| **支持模型** | Anthropic / OpenAI 兼容端点 / 第三方模型导入 |
| **合规框架** | NIST AI RMF(GOVERN / MAP / MEASURE / MANAGE) |
`
### 检查用户姿态评分
```
TOKEN=$(make admin-token -s)
curl -H "Authorization: Bearer $TOKEN" \
"http://localhost:8092/posture?tenant_id=t1&user_id=user-demo-1"
```
### 模拟合规报告
```
make spm-compliance
```
返回一个 JSON 报告,将 NIST AI RMF 控制项映射为通过/部分/失败状态,依据当前平台配置。
## 技术栈
# Orbyx AI SPM — 技术栈
完整的技术清单。
## 架构概述

### 控制平面与数据路径

## 基础设施
| 组件 | 技术 | 版本 | 角色 |
|---|---|---|---|
| **容器运行时** | Docker + Docker Compose | Compose v2 | 在本地运行所有服务 |
| **消息代理** | Apache Kafka(Confluent) | 7.6.1 | 事件流 backbone —— 审计、姿态、CEP 事件 |
| **缓存 / 内存** | Redis | 7(Alpine) | 会话内存、长期对话历史、速率限制 |
| **数据库** | PostgreSQL | 16(Alpine) | SPM 审计日志、姿态快照、模型注册表 |
| **策略引擎** | Open Policy Agent(OPA) | 0.70.0 | 基于 Rego 的请求策略评估 |
| **指标** | Prometheus | v2.55.1 | 从所有服务抓取 `/metrics` |
| **仪表板** | Grafana | 11.4.0 | 预置的 AI SPM、工程与合规仪表板 |
## 后端服务
所有后端服务均使用 **Python 3.11** 编写,通过 **FastAPI + Uvicorn** 提供服务。
| 服务 | 端口 | 描述 |
|---|---|---|
| `api` | 8080 | 主网关 —— 认证、防护、LLM 代理、速率限制 |
| `guard-model` | 8200 | 内容审核(通过 Groq 的 Llama Guard 3 或内置正则降级) |
| `freeze-controller` | 8090 | 管理员冻结/解冻用户与租户 |
| `policy-simulator` | 8091 | 在样本事件上干运行策略变更 |
| `spm-api` | 8092 | 模型注册表、姿态 API、合规报告 |
| `spm-aggregator` | — | Kafka 消费者 → PostgreSQL 写入器、Prometheus 指标 |
| `processor` | — | Kafka 消费者 —— 为原始事件添加姿态评分 |
| `memory-service` | — | 在 Redis 中管理会话、长期与系统内存,含完整性哈希与注入防护 |
| `output-guard` | — | 对 Claude 响应进行二次 LLM 语义扫描 |
| `policy-decider` | — | 评估 OPA 决策并发布强制执行事件 |
| `retrieval-gateway` | — | 支持 RAG 的检索服务,对文档块进行可信度评分 |
| `tool-parser` | — | 解析并验证 LLM 输出的结构化工具调用 |
| `executor` | — | 执行已授权工具调用,附带审批流程用于副作用操作 |
| `agent-orchestrator` | 8094 | 会话生命周期、风险评分、威胁数据存储与案例管理 |
| `threat-hunting-agent` | — | 自主 AI 安全威胁狩猎 —— 9 个检测器 + LangChain/Groq LLM |
| `startup-orchestrator` | — | 一次性初始化容器:生成密钥、创建 Kafka 主题、种子 OPA、注册默认模型 |
### 核心 Python 库
| 库 | 版本 | 用途 |
|---|---|---|
| **FastAPI** | 0.115.x | REST API 框架 |
| **Uvicorn** | 0.30–0.32 | ASGI 服务器 |
| **Pydantic** | 2.9 | 请求/响应校验 |
| **anthropic** | 0.40.0 | Claude API 客户端(工具使用、流式传输) |
| **kafka-python-ng** | 2.2.3 | Kafka 生产者/消费者 |
| **redis** | 5.1–5.2 | Redis 客户端 |
| **PyJWT + cryptography** | 2.9–2.10 / 43.0 | RS256 JWT 签名与验证 |
| **httpx** | 0.27.2 | 异步 HTTP 客户端(工具获取、跨服务调用) |
| **requests** | 2.32 | 同步 HTTP 客户端 |
| **SQLAlchemy (asyncio)** | 2.0.36 | 异步 ORM,用于 SPM 数据库 |
| **asyncpg** | 0.30.0 | 异步 PostgreSQL 驱动 |
| **psycopg2-binary** | 2.9.9 | 同步 PostgreSQL 驱动 |
| **groq** | 0.11.0 | Groq 客户端(用于 Llama Guard 3 推理) |
| **tavily-python** | 0.5.0 | 网页搜索工具(Tavily API) |
| **beautifulsoup4 + lxml** | 4.12.3 / 5.3.0 | HTML 解析(用于网页获取工具) |
| **prometheus-client** | 0.21.1 | 暴露 `/metrics` 端点 |
| **prometheus-fastapi-instrumentator** | 7.0.0 | 自动为 FastAPI 集成 Prometheus |
| **weasyprint** | 62.3 | PDF 报告生成(合规导出) |
## 前端
技术 | 版本 | 角色 |
|---|---|---|
| **React** | 18.3 | UI 框架 |
| **Vite** | 5.4 | 构建工具与开发服务器 |
| **react-markdown** | 9.0 | 渲染 Claude 的 Markdown 响应 |
| **remark-gfm** | 4.0 | GitHub 风格 Markdown(表格、删除线等) |
前端是单页应用,由 Nginx 容器(端口 3000)提供服务。无外部 CSS 框架 —— 完全自定义设计,使用 CSS 变量实现主题。
## 外部 API
| 服务 | 用途 | 是否必需 |
|---|---|---|
| **Anthropic Claude** | LLM 后端(Haiku / Sonnet / Opus) | ✅ 必需 |
| **Tavily** | 实时网页搜索工具 | ⚠️ 可选 |
| **Groq** | 威胁狩猎智能体 LLM(LLaMA 3.3 70B) + Llama Guard 3 内容审核 | ✅ 必需(威胁狩猎) / ⚠️ 可选(防护) |
## 安全与认证
| 组件 | 技术 | 说明 |
|---|---|---|
| **认证** | RS256 JWT | 密钥对在启动时自动生成到 `./keys/` |
| **授权** | OPA + Rego | 策略即代码,按请求评估 |
| **内容审核** | Llama Guard 3(Groq)或正则降级 | 过滤有害内容类别 |
| **输出扫描** | 二次 LLM 语义检查 | 防止敏感数据泄露 |
| **速率限制** | Redis 计数器 | 每分钟每用户限制,可配置 |
| **提示注入检测** | 防护模型 + CEP 模式匹配 | 模式匹配与 ML 评分结合 |
## 可观测性
| 层级 | 技术 | 细节 |
|---|---|---|
| **指标** | Prometheus | 每 15 秒从所有服务抓取 `/metrics` |
| **仪表板** | Grafana | 3 个预置仪表板,自动加载 |
| **审计日志** | PostgreSQL (`audit_export` 表) | 每条请求以 JSONB 形式写入,支持 `ON CONFLICT DO NOTHING` 保证幂等 |
| **结构化日志** | Python `logging` → stdout | 通过 Docker 查看,`make logs` 可收集 |
| **姿态快照** | PostgreSQL + Prometheus | 每 5 分钟对每个模型/租户记录滚动平均值 |
## 数据流
```
User prompt
│
▼
JWT Auth → Rate Limit → Guard Model (content check)
│
▼
OPA Policy Evaluation
│
▼
Memory Load (Redis — last 20 turns, 30-day TTL)
│
▼
Claude API (tool loop — up to 3 rounds)
│ ├── web_search → Tavily
│ └── web_fetch → httpx + BeautifulSoup
▼
Output Guard (second-pass LLM scan)
│
▼
Audit Event → Kafka → SPM Aggregator → PostgreSQL + Prometheus
│
▼
Response → User
```
## 威胁狩猎智能体
**威胁狩猎智能体** 是一个自主 AI 安全服务,持续扫描平台以发现威胁 —— 与用户触发的请求无关。它运行一个 LangChain 代理,依赖 **Groq + Llama 3.3 70B Versatile** 并基于以下两种机制触发:
- **Kafka 消费者** — 近乎实时地响应会话事件
- **调度器** — 每 5 分钟(可配置)执行一次全平台主动扫描
### 主动扫描
每次扫描周期并行运行全部 9 个检测器。所有检测器查询实时数据(PostgreSQL、Redis、`/proc`)并生成结构化发现,由智能体通过 LLM 分析后提交至编排器。
| 扫描器 | 检测内容 |
|---|---|
| `exposed_credentials` | Redis 中意外命名空间下的 API 密钥、令牌、密码 |
| `sensitive_data_exposure` | PII 模式、数据库连接字符串等更广泛的数据泄露 |
| `unused_open_ports` | 内部服务端口处于开放但不应开放的状态 |
| `unexpected_listen_ports` | `/proc/net/tcp` 中处于 LISTEN 状态但不在允许服务列表的端口 |
| `overprivileged_tools` | 注册表中风险等级过高但仍为活跃状态的模型 |
| `runtime_anomaly_detection` | 高频操作者、每会话阻断簇(≥3/小时)、会话风暴(5+/10分钟) |
| `prompt_secret_exfiltration` | 提示或响应中的 API 密钥、Bearer 令牌 |
| `data_leakage_detection` | 响应中的 SSN、信用卡号、电子邮件地址 |
| `tool_misuse_detection` | 单会话工具调用频率过高(>20/小时)、快速链(>5/分钟)、高阻断比例 |
### 发现与案例
当扫描发现异常时,智能体会生成结构化的 **威胁发现**(严重等级、假设、证据、建议操作),并执行以下流程:
1. 通过 `POST /api/v1/threat-findings` 发送至编排器
2. 按批次哈希去重,避免重复告警
3. 按风险分数、时效性、发生次数自动优先级排序
4. 当 `should_open_case=true` 且优先级 ≥ 0.40 时自动升级为 **案例**
### 配置
```
GROQ_API_KEY=gsk_xxxxxxxxxxxx # required — service won't start without it
HUNT_MODEL=llama-3.3-70b-versatile # LLM model (any Groq-hosted model)
HUNT_BATCH_WINDOW_SEC=30 # Kafka batch window
THREATHUNTING_AI_INTERVAL_SEC=300 # Proactive scan interval (seconds)
```
### 数据库迁移
威胁狩猎采集器查询 `audit_export` 表的 `session_id` 列。若为现有安装,在启动智能体前需执行迁移:
```
# Option A — via Alembic (recommended)
docker compose exec spm-api alembic upgrade head
# Option B — direct SQL (if Alembic is unavailable)
docker compose exec spm-db psql -U spm_rw -d spm -c "
ALTER TABLE audit_export ADD COLUMN IF NOT EXISTS session_id VARCHAR(64);
CREATE INDEX IF NOT EXISTS idx_audit_export_session_id ON audit_export (session_id);
"
```
## Kafka 主题
| 主题 | 发布者 | 消费者 |
|---|---|---|
| `{tenant}.raw_events` | API 网关 | 处理器、CEP |
| `{tenant}.posture_enriched` | 处理器 | SPM 聚合器、策略决策器、Flink CEP |
| `{tenant}.enforcement_actions` | 策略决策器、冻结控制器 | SPM 聚合器 |
| `{tenant}.audit_export` | 所有服务 | SPM 聚合器 → PostgreSQL |
| `{tenant}.memory_request` | 智能体 | 内存服务 |
| `{tenant}.memory_result` | 内存服务 | 智能体 |
| `{tenant}.approval_request` | 执行器 | (人工审核员) |
| `{tenant}.freeze_control` | 冻结控制器 | 所有消费者 |
## 语言与运行时总结
| 层级 | 语言 | 运行时 |
|---|---|---|
| 所有后端服务 | Python 3.11 | CPython |
| 前端 | JavaScript(ESM) | Node 20(仅构建),Nginx(服务) |
| 策略 | Rego | OPA 0.70 |
| 基础设施配置 | YAML / Dockerfile | Docker Compose v2 |
| 数据库迁移 | SQL | PostgreSQL 16 |
| 构建自动化 | Make | GNU Make |
## 贡献
# 为 Orbyx AI SPM 贡献力量
感谢您的参与!以下是快速入门指南。
## 开始之前
1. Fork 本仓库并克隆您的 Fork
2. 按照 [INSTALL.md](./INSTALL.md) 在本地运行平台
3. 创建功能分支:`git checkout -b feat/your-feature-name`
## 开发流程
### 修改代码
大多数服务支持热重载。修改 Python 文件后,仅需重建受影响的服务:
```
docker compose up -d --build api # API changes
docker compose up -d --build spm-api # SPM API changes
docker compose up -d --build ui # Frontend changes
```
### 运行测试
```
make test # unit tests (no Docker needed)
make smoke-test # end-to-end test against running platform
```
测试位于 `tests/` 目录。为新功能或修复添加测试用例。
### 查看日志
```
make logs # all services
make logs-api # single service
```
## 拉取请求规范
- **单一关注点** — 每个 PR 聚焦一个变更点,便于审查
- **清晰的描述** — 说明修改了什么以及原因
- **包含测试** — 新功能与修复必须附带测试覆盖
- **通过 CI** — 所有测试必须为绿色再提交评审
- **更新文档** — 若修改行为,请更新相关 `.md` 文件
分支命名约定:
| 类型 | 模式 |
|---|---|
| 功能 | `feat/短描述` |
| 修复 | `fix/短描述` |
| 文档 | `docs/短描述` |
| 重构 | `refactor/短描述` |
## 本地 SSO(Keycloak + Traefik)
认证覆盖层在本地添加完整的 OIDC 登录流程,无需真实域名或 TLS 证书即可运行。
### 新增组件
| 组件 角色 |
|---|---|
| **Traefik v3** | 反向代理。路由 `aispm.local` → 管理界面,通过 ForwardAuth 中间件实现 SSO。无需 Docker 套接字即可使用静态文件配置。 |
| **Keycloak 24** | OIDC 身份提供者,开发模式下持久化领域配置至命名卷。 |
| **traefik-forward-auth** | 位于所有受保护路由之前。处理 OIDC 重定向流程,并在 `aispm.local` 上设置签名会话 Cookie。 |
### 一次性主机设置
在 `/etc/hosts` 添加以下条目(Mac 示例):
```
sudo sh -c 'echo "127.0.0.1 keycloak.local auth.local aispm.local" >> /etc/hosts'
```
### 启动 / 停止
```
./start.sh # full stack including auth
./stop.sh # tear everything down (volumes preserved)
```
### 首次 Keycloak 设置
仅需执行一次 —— Keycloak 领域配置会持久化至 `keycloak-data` Docker 卷。
1. 运行 `./start.sh` 并打开 **http://keycloak.local:8180/admin/**(账号:`admin` / 密码:`admin`)
2. 顶部下拉菜单 → **Create realm** → 命名 `aispm` → **Create**
3. **Clients** → **Create client**
- Client ID: `traefik-forward-auth`
- 开启 **Client authentication** → **Next**
- 有效重定向 URI: `http://aispm.local/_oauth`
- Web 源: `http://aispm.local` → **Save**
4. **Credentials** 标签页 → 复制 **Client secret** → 填入 `.env.auth`:
`PROVIDERS_OIDC_CLIENT_SECRET=<粘贴此处>`
5. **Users** → **Create user** → 设置用户名 → **Create**
6. **Credentials** 标签页 → 设置密码 → **关闭 Temporary** → **Save password**
7. 重启 forward-auth:`docker-compose -f docker-compose.yml -f docker-compose.auth.yml up -d traefik-forward-auth`
### 访问地址
| URL | 说明 |
|---|---|
| **http://aispm.local/admin** | 管理界面(SSO 保护 —— 重定向至 Keycloak 登录) |
| **http://keycloak.local:8180/admin/** | Keycloak 管理控制台 |
| **http://localhost:9091/dashboard/** | Traefik 路由仪表板 |
### 配置文件
| 文件 | 用途 |
|---|---|
| `docker-compose.auth.yml` | 覆盖层 —— 添加 Traefik、Keycloak 与 traefik-forward-auth |
| `auth/traefik.yml` | Traefik 静态配置(文件提供者、入口点、仪表板端口 `:9091`) |
| `auth/traefik-dynamic.yml` | 路由与中间件定义(aispm 路由器 + SSO ForwardAuth) |
| `.env.auth` | OIDC 客户端 ID、客户端密钥与 Cookie 签名密钥 |
在回答之前,请思考以下具体问题:
您能识别出环境中所有的影子 AI(包括 AI 模型、智能体及相关资源)吗?
您是否有效地保护 AI 数据以防止数据投毒、偏见和合规违规?
您知道如何根据上下文优先处理关键 AI 风险吗?
您是否有信心能够检测并快速响应 AI 管道中的可疑活动?
如果对上述问题中的任何一个回答“不确定”或“否”,那么您应该更深入地了解这个项目。这是了解您 AI 生态系统安全现状的方式。 发现您的 AI 智能体、模型及相关资源的安全性。 识别 AI 应用程序供应链/流水线中的风险——这些风险可能导致数据外泄和资源滥用。 实施针对 AI 使用的适当治理控制。 [](https://opensource.org/licenses/Apache-2.0)   [](https://github.com/dshapi/AI-SPM/) 

OrbiX AI SPM
Admin Portal - Overview
A Real-time AI security posture across every agent, model, and data source — inventory, runtime, policies, and threat response unified.

Admin Portal - Dashboard
An AI Security Posture Management control plane providing real-time visibility, risk detection, and policy enforcement across agents, models, and context flows.

Admin Portal - Inventory

ASCII 图
``` ┌─────────────────────────────────────────────────────────┐ │ Browser (React) │ └───────────────────────────┬─────────────────────────────┘ │ HTTP ┌───────────────────────────▼─────────────────────────────┐ │ API Gateway (FastAPI / Python) │ │ Auth · Rate limit · Guard · CEP · Memory · LLM tools │ └──────┬────────────┬────────────┬───────────┬────────────┘ │ Kafka │ Redis │ OPA │ Anthropic ┌──────▼──────┐ ┌───▼───┐ ┌────▼────┐ ┌─────▼──────────┐ │ Kafka │ │ Redis │ │ OPA │ │ Claude (LLM) │ │ (events) │ │(cache)│ │(policy) │ │ + Tavily │ └──────┬──────┘ └───────┘ └─────────┘ └────────────────┘ │ ├─────────────────────────────────────────────────┐ │ │ ┌──────▼──────────────────────────────────────────────┐ │ │ SPM Aggregator (Python) │ │ │ Consumes events → writes to Postgres │ │ └──────────────────────────┬──────────────────────────┘ │ │ SQL │ Kafka ┌──────────────────────────▼──────────────────────────┐ │ │ SPM API (FastAPI / Python) │ │ │ Model registry · Posture · Compliance · Enforce │ │ └──────────────────────────┬──────────────────────────┘ │ │ │ ┌──────────────────────────▼──────────────────────────┐ │ │ Observability (Prometheus + Grafana) │ │ └─────────────────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────────────────────▼┐ │ Threat Hunting Agent (LangChain + Groq) │ │ 9 proactive scans · Redis · Postgres · /proc · OPA │ └──────────────────────────┬──────────────────────────────┘ │ HTTP POST /api/v1/threat-findings ┌──────────────────────────▼──────────────────────────────┐ │ Agent Orchestrator (FastAPI / Python) │ │ Session lifecycle · Risk scoring · Findings · Cases │ └─────────────────────────────────────────────────────────┘ ```标签:AI-SPM, AI代理安全, AI安全, AI模型安全, AMSI绕过, Chat Copilot, GitHub开源, Python, 人工智能安全, 企业级安全, 偏差检测, 关键词SEO, 合规性, 合规治理, 响应处置, 威胁检测, 安全态势管理, 安全治理, 审计监控, 搜索引擎查询, 数据中毒, 数据泄露防护, 无后门, 测试用例, 网络探测, 自定义请求头, 请求拦截, 逆向工具, 零日漏洞检测, 风险控制