wrapsec/wrapsec

GitHub: wrapsec/wrapsec

一个生产级 AI 安全网关,通过多层检测管道在请求到达 LLM 前强制执行安全决策,防止提示注入、数据泄露等 AI 特有威胁。

Stars: 0 | Forks: 0

# WrapSec WrapSec 是一个生产级 AI 安全网关和执行层,用于保护与 LLM 交互的应用程序。 它通过多层检测管道检查每个提示和响应,并在任何内容到达模型之前强制执行决策——ALLOW、BLOCK 或 SANITIZE。 ## 为什么选择 WrapSec 传统输入验证无法防范 AI 特定的威胁,如提示注入、越狱尝试、数据泄露和 PII 泄露。WrapSec 在 LLM 执行前提供实时强制执行,而不是事后处理。 WrapSec 在任何请求到达 LLM 之前强制执行安全决策。被阻止的请求永远不会离开您的系统。 WrapSec 支持两种执行模式: **仅扫描** - 应用程序向 WrapSec 发送提示,接收安全决策(ALLOW / BLOCK / SANITIZE),并自行处理 LLM 转发。 **代理** - WrapSec 位于完整请求路径中,检查输入,使用加密的 API 密钥转发给 LLM 提供商,检查响应,并向应用程序返回 OpenAI 兼容的响应。输入和输出决策都会被强制执行。 ## 检测管道 该管道结合了基于规则、机器学习和可选的基于 LLM 的分析,以产生最终的安全决策。每个请求都会经过四个独立的层: ``` Input ├── InputGuard PII detection, 22+ entity types, regex-based redaction ├── RuleDetector Regex and heuristic patterns, ~1ms ├── MLDetector TF-IDF + logistic regression, 7 labels, ~5ms ├── ToxicityGuard Reads ML toxicity label directly, independent threshold ├── LLMDetector Semantic analysis, full mode only, ~100–500ms additional └── PolicyEngine BLOCK / SANITIZE / ALLOW ``` 检测风险评分:`rule×0.40 + ml×0.30 + llm×0.30` Guardrails(PII、毒性)在架构上与检测分离,独立运行。无论风险评分如何,它们都可以覆盖检测决策。Guardrail 阈值与检测阈值相互独立。 ## 安全决策 | 决策 | 含义 | |---|---| | `ALLOW` | 未检测到威胁。可以安全转发到 LLM。 | | `BLOCK` | 检测到威胁。不得转发到 LLM。 | | `SANITIZE` | 敏感内容已删除。将 `sanitized_input` 转发到 LLM,而非原始内容。 | `risk_score = 0.0` 并不意味着安全。应始终以 `decision` 作为权威判断。Guardrails 可以产生 `risk_score = 0.0` 的 `BLOCK`。 `primary_reason = SYSTEM_ERROR` 表示检测管道失败。返回的 `ALLOW` 决策不可信,不应使用。应用程序必须将此视为失败,不得将输入转发到 LLM。 ## 技术栈 | 组件 | 技术 | |---|---| | API | FastAPI, Python 3.10 | | 数据库 | PostgreSQL(SQLAlchemy async)| | 缓存 | Redis | | 控制面板 | Next.js 16, React 19 | | ML 模型 | TF-IDF + logistic regression, 基于 7 个威胁类别训练 | | 可观测性 | Prometheus, Grafana | ## 实体模型 ``` tenant └── departments ├── policy_override (independent thresholds per dept) └── applications ├── policy_override └── api_keys (sk_live_ | sk_trial_) ``` 策略解析:系统默认值 → 数据库设置 → 部门覆盖 → 应用程序覆盖。每一层深度合并——空字段从上一层继承。 ## API **仅扫描:** ``` POST /v1/ai/request ``` **代理(OpenAI 兼容):** ``` POST /v1/chat/completions ``` 使用 `/v1/ai/request` 进行仅扫描集成。使用 `/v1/chat/completions` 进行完整代理模式——即插即用的 OpenAI 兼容替代方案。 身份验证:`x-api-key` 头用于 API 密钥,`Authorization: Bearer` 用于 JWT。如果两者都存在,API 密钥无条件优先。 完整 API 参考:`docs/api.md` ## Python SDK 和 CLI ``` pip install -e sdk/python/ wrapsec config set api_key sk_live_... wrapsec config set base_url http://your-wrapsec-host:8000 wrapsec scan "user input" wrapsec batch prompts.txt --summary wrapsec audit list --decision BLOCK ``` ``` import wrapsec client = wrapsec.Client( api_key = os.environ["WRAPSEC_API_KEY"], base_url = os.environ["WRAPSEC_BASE_URL"], ) result = client.scan("user input") if result.is_system_error: raise RuntimeError("Security check failed") if result.is_blocked: # Do not forward to LLM return input_to_forward = result.sanitized_input if result.is_sanitized else user_input ``` SDK 文档:`sdk/python/README.md` ## Node.js SDK ``` npm install wrapsec-node ``` ``` import WrapSec from 'wrapsec-node' const client = new WrapSec({ apiKey: process.env.WRAPSEC_API_KEY, baseUrl: process.env.WRAPSEC_BASE_URL, }) const result = await client.scan(userInput) if (result.isBlocked) { // Do not forward to LLM } ``` 包含 Express 和 Fastify 中间件。SDK 文档:`sdk/node/README.md` ## 代理模式 WrapSec 是代理模式的 OpenAI 兼容即插即用替代品: ``` from openai import OpenAI client = OpenAI( api_key = "sk_live_your_wrapsec_key", base_url = "http://your-wrapsec-host:8000/v1", ) response = client.chat.completions.create( model = "openai/gpt-4o", # format: provider/model messages = [{"role": "user", "content": user_prompt}], ) ``` 代理模式强制执行输入和输出安全,无需应用程序级集成。提供商 API 密钥以加密方式存储(AES-256-GCM),创建后永远不会完整返回。 ## 身份验证和访问控制 控制面板用户使用电子邮件和密码进行身份验证。JWT 访问令牌在 30 分钟后过期。刷新令牌以 SHA-256 哈希形式存储在数据库中——服务器端从不持久化原始令牌。 | 角色 | 范围 | 权限 | |---|---|---| | ADMIN | 租户范围 | 完整访问 - 用户、设置、密钥、所有部门 | | DEVELOPER | 部门范围 | 扫描、审计、API 密钥、读取设置 | | VIEWER | 部门范围 | 只读审计访问 | API 密钥严格用于运行时机器对机器访问。所有管理操作——用户管理、密钥创建、设置更改——都需要通过控制面板进行基于 JWT 的身份验证。 账户锁定:5 次失败的登录尝试会触发基于 Redis 的 15 分钟锁定。 ## 数据存储 三种模式,通过 `DATA_STORAGE_MODE` 环境变量设置: | 模式 | 行为 | |---|---| | `masked` | PII 在存储前被隐藏(默认)| | `full` | 文本原样存储 | | `none` | 文本永不持久化——仅存储安全元数据 | 这允许在存储原始用户输入受限的受监管环境中部署。审计日志根据配置的保留期保留(默认 30 天)。后台工作进程每天在 UTC 时间 02:00 运行。 ## 可观测性 Prometheus 抓取 `GET /metrics`。包含三个 Grafana 仪表板:安全概览、延迟和性能、威胁情报。 这些指标支持对威胁活动、延迟和系统健康状况的实时监控。关键指标:`wrapsec_requests_total`、`wrapsec_blocked_total`、`wrapsec_request_latency_ms`、`wrapsec_system_errors_total`、`wrapsec_proxy_latency_ms`。 ## 本地运行 此设置在本地运行完整的 WrapSec 栈,用于开发和测试。 ``` # 基础设施 docker compose -f infrastructure/docker/docker-compose.yml up -d postgres redis # API export PYTHONPATH=$(pwd) uvicorn api.main:app --reload --host 0.0.0.0 --port 8000 # Dashboard cd dashboard && npm run dev ``` 测试: ``` export TESTING=true export PYTHONPATH=$(pwd) pytest tests/unit tests/integration -v ``` ## 文档 | 文档 | 位置 | |---|---| | 核心概念和决策模型 | `docs/core_concepts.md` | | API 参考(47 个端点)| `docs/api.md` | | 架构和数据库模式 | `docs/architecture.md` | | 风险评分和置信度模型 | `docs/scoring_model.md` | | 开发者指南 | `docs/developer_guide.md` | | 用户指南(控制面板)| `docs/user_guide.md` | | CLI 参考 | `docs/cli_reference.md` | | Python SDK | `sdk/python/README.md` | | Node.js SDK | `sdk/node/README.md` | ## 生产环境注意事项 - 明确设置 `WRAPSEC_BASE_URL`。默认的 `http://localhost:8000` 不得用于生产环境。 - 在受监管环境中将 `DATA_STORAGE_MODE` 设置为 `masked` 或 `none`。 - 在首次部署前更改 `SECRET_KEY` 和 Grafana 默认密码。 - 设置 `TRUSTED_PROXY_IPS` 为您的反向代理 IP,以便 `X-Forwarded-For` 仅从已知来源受信任。 - 设置 `METRICS_TOKEN` 以要求在 `GET /metrics` 上进行 bearer 令牌身份验证——不要未经验证暴露指标。 - 将 Grafana 固定到 10.4.0 - Grafana 12 存在仪表板配置问题。 - Prometheus 目标在 Docker 部署中从 `host.docker.internal:8000` 变为 `api:8000`。 - JWT 部门不匹配警告(`auth_event=JWT_DEPT_MISMATCH`)必须路由到安全监控管道。 WrapSec 确保系统中的每个 AI 交互都经过检查、控制和可审计。 ## 许可证 MIT - 版权所有 © 2026 WrapSec
标签:AI安全, API安全, API密钥检测, Chat Copilot, JSON输出, PII脱敏, Prompt注入检测, TF-IDF, 云计算, 内容审核, 加密通信, 多层检测, 安全策略, 安全网关, 实时检测, 密钥泄露防护, 提示词设计, 搜索引擎查询, 数据泄露防护, 文本分类, 机器学习安全, 测试用例, 网络探测, 自定义请求头, 规则引擎, 越狱检测, 输入验证, 防护系统, 零日漏洞检测