ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OmniRoute 安全架构指南:从漏洞报告到 AES-256-GCM 加密、Prompt 注入防护与 Docker 加固

OmniRoute 安全架构指南:从漏洞报告到 AES-256-GCM 加密、Prompt 注入防护与 Docker 加固 OmniRoute 安全架构指南从漏洞报告到 AES-256-GCM 加密、Prompt 注入防护与 Docker 加固【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRouteOmniRoute 是一个免费开源的 MIT AI 网关单端点聚合 352 提供商、1200 模型并天然兼容 Claude Code、Codex、Cursor、OpenCode、Cline 与 Copilot 等主流客户端。由于网关位于你的 API 密钥、OAuth 令牌与上游提供商之间它的安全性直接决定了你的凭证与流量安全。本文以 docs/i18n/gu/SECURITY.md 为核心骨架结合仓库源码与官方英文安全策略SECURITY.md系统讲解 OmniRoute 的多层安全模型、加密实现、注入防护、合规能力以及生产环境的 Docker 加固实践。读完本文你将掌握如何正确配置密钥、如何理解并调优注入防护与 PII 脱敏、如何按官方流程上报漏洞并能在生产环境以安全默认值完成部署。1. 漏洞报告与响应时间线1.1 负责任披露流程OmniRoute 的安全团队要求所有漏洞通过私有渠道上报禁止在公开的 GitHub Issue 中披露细节防止 0-day 被滥用不要在 GitHub 上公开创建 Issue使用 GitHub Security Advisories 的 New Advisory 表单提交提交内容需包含漏洞描述description、复现步骤reproduction steps、潜在影响potential impact。1.2 响应时间线SLA官方安全策略中给出了三个阶段的响应目标阶段目标时间确认收到Acknowledgment48 小时分类与评估Triage Assessment5 个工作日补丁发布Patch Releasecritical 级别14 个工作日1.3 受支持版本版本支持状态3.8.x✅ 积极支持Active3.7.x✅ 安全支持Security 3.7.0❌ 不支持说明i18n 翻译版docs/i18n/gu/SECURITY.md中的版本表格可能滞后于根目录英文版SECURITY.md部署前请以仓库根目录的最新策略为准。2. 多层安全架构总览OmniRoute 采用**纵深防御Defense in Depth**策略请求在到达上游 Provider 之前会依次经过多道防线。根目录英文版的安全策略给出了更贴近当前代码库的完整管线Request → CORS → Authz pipeline (classify → policies → enforce) → Guardrails (PII masker, prompt injection, vision bridge) → Rate Limiter → Circuit Breaker → Cooldown → Model Lockout → Provider从源码结构看这条管线对应仓库中的几大实现区域CORS由src/server/cors/origins.ts维护跨域来源白名单授权管线Authz Pipeline路由被分类为 PUBLIC / CLIENT_API / MANAGEMENT 三类管理路由再按 LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT 三档守卫详见 docs/architecture/AUTHZ_GUIDE.md 与 docs/security/ROUTE_GUARD_TIERS.mdGuardrails 框架注册表位于src/lib/guardrails/可热加载详见 docs/security/GUARDRAILS.md弹性层Circuit Breaker、Cooldown、Model Lockout 的细节在 docs/architecture/RESILIENCE_GUIDE.md。i18n 版文档中的简化示意同样成立可作为理解入口Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider3. 认证与授权特性实现方式Dashboard 登录基于密码认证 JWT 令牌HttpOnly CookieAPI Key 认证HMAC 签名密钥 CRC 校验OAuth 2.0 PKCE面向 Provider 的安全认证Claude、Codex、Gemini、Cursor 等Token 刷新OAuth 令牌过期前自动刷新安全 CookieHTTPS 环境设置AUTH_COOKIE_SECUREtrueMCP Scopes32 个细粒度作用域控制 MCP 工具访问与授权相关的关键实现与文档还包括Authz Pipeline路由分类PUBLIC / CLIENT_API / MANAGEMENT见 docs/architecture/AUTHZ_GUIDE.md路由守卫分级管理路由的 3 档模型LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT见 docs/security/ROUTE_GUARD_TIERS.md管理作用域 MCP远程/api/mcp/*访问需具备manage作用域的 API Key/api/cli-tools/runtime/*保持严格回环访问MCP Scopes32 个细粒度作用域如read:health、write:combos、execute:completions完整列表见 docs/frameworks/MCP-SERVER.md。4. 静态加密AES-256-GCM 与 scrypt 密钥派生4.1 加密范围与密文格式OmniRoute 使用AES-256-GCM对 SQLite 中存储的敏感数据进行加密密钥通过scrypt派生加密对象API 密钥、访问令牌、刷新令牌、ID 令牌版本化密文格式enc:v1:iv:ciphertext:authTagPassthrough 模式当未设置STORAGE_ENCRYPTION_KEY时明文存储仅建议本地开发使用。4.2 生成加密密钥STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32)4.3 源码级实现剖析字段级加密的实现位于 src/lib/db/encryption.ts关键细节如下算法常量aes-256-gcmIV 长度 16 字节密钥长度 32 字节GCM 认证标签固定为完整的 16 字节AUTH_TAG_LENGTH 16。源码注释明确指出向createDecipheriv传入authTagLength会提前拒绝截断的认证标签从而封堵 GCM 标签截断伪造向量静态盐派生主密钥使用固定盐omniroute-field-encryption-v1经scryptSync派生。v3.7.9 起弃用了旧的动态盐对密钥取 sha256 前 16 字节因为两条路径派生出的密钥不一致会导致“一条路径加密、另一条路径解不开”的循环解密失败与 CPU 飙升问题兼容迁移decrypt()先尝试静态盐主密钥失败后再回退旧动态盐密钥一旦用旧密钥解出encryptConnectionFields()会把它自动重新加密为静态盐密文migrateLegacyEncryptedString供启动迁移脚本使用实现数据库的渐进式迁移密钥加载顺序ensureSecretLoaded()依次尝试环境变量STORAGE_ENCRYPTION_KEY、DATA_DIR/.env、cwd/.env、~/.hermes/.env解密失败告警当存储的凭据带enc:v1:前缀但解密结果为 null说明STORAGE_ENCRYPTION_KEY被更改或未设置代码会打上credentialDecryptFailed标记并输出恢复提示避免以空 Bearer 向供应商发出必然 401 的请求。4.4 密钥版本与轮换.env.example 中补充了两个相关变量STORAGE_ENCRYPTION_KEY_VERSIONv1密钥版本标签轮换STORAGE_ENCRYPTION_KEY时递增官方提示轮换密钥后旧密文将无法解密必须保留旧密钥或对受影响账户重新认证。5. Guardrails 框架与 Prompt 注入防护5.1 Guardrails 注册表OmniRoute 提供可热加载的 guardrails 注册表src/lib/guardrails/内置多个 guardrail 按优先级顺序执行。当前仓库docs/security/GUARDRAILS.md注册了六个优先级名称阶段实现文件5vision-bridgepreCallsrc/lib/guardrails/visionBridge.ts6audio-bridgepreCallsrc/lib/guardrails/audioBridge.ts7video-bridgepreCallsrc/lib/guardrails/videoBridge.ts10pii-maskerpre postsrc/lib/guardrails/piiMasker.ts20prompt-injectionpreCallsrc/lib/guardrails/promptInjection.ts95credential-maskerpre postsrc/lib/guardrails/credentialMasker.ts关键设计原则Fail-open开放失败某个 guardrail 抛异常时注册表记录错误并继续执行下一个而不是阻断整个请求——阻断必须是显式决策block: true绝不是意外自定义 guardrail 通过registerGuardrail(new MyGuardrail())注册每个请求可通过x-omniroute-disabled-guardrails请求头按需跳过特定 guardrailregistry.ts同时兼容x-disabled-guardrails别名。5.2 Prompt 注入检测模式注入防护是“尽力而为best-effort”的启发式中间件官方明确声明它不是完整的 prompt 注入防火墙可能产生误报良性的 persona/RPG 提示词与漏报leet speak、空格变体、非英文模式。模式类型严重级别示例System OverrideHighignore all previous instructionsRole HijackMedium/Highyou are now DAN, you can do anythingDelimiter InjectionHigh编码分隔符以打破上下文边界DAN/JailbreakMedium/High已知的 jailbreak 提示模式Instruction LeakHighshow me your system promptEncoding EvasionMediumbase64/rot13/hex 解码 指令关键词5.3 配置项与阻断阈值在block模式下只有High级别的检测会被阻断Medium 级别家族会被记录日志但不会被sanitizeRequest阻断。通过 DashboardSettings → Security或.env配置INPUT_SANITIZER_ENABLEDtrue INPUT_SANITIZER_MODEblock # warn | block注入策略legacy redact 不会剥离注入文本 INPUT_SANITIZER_BLOCK_THRESHOLDhigh # high默认| medium | low —— block 模式下达到/超过该级别即阻断.env.example还给出了响应侧与旧别名的补充# 旧版别名效果相同 INJECTION_GUARD_MODEwarn INJECTION_GUARD_BLOCK_THRESHOLDhigh5.4 中间件实现注入守卫的中间件实现位于 src/middleware/promptInjectionGuard.tswithInjectionGuard(handler, options)仅对 POST/PUT/PATCH 生效请求体被克隆解析后交给evaluatePromptInjection委托给src/lib/guardrails/promptInjection.ts命中阻断时返回 HTTP 400错误类型为injection_detected错误码SECURITY_001并在响应中附上检测数量非阻断但被标记flagged的请求会在请求头写入X-Injection-Flagged与X-Injection-Detections供下游处理器与日志使用已解析的请求体会作为第三参数透传给下游 handler避免在热路径上重复克隆解析issue #4041。6. PII 检测与脱敏6.1 支持的 PII 类型自动检测并可选脱敏个人身份信息PII内置模式与替换规则如下PII 类型模式示例替换结果Emailuserdomain.com[EMAIL_REDACTED]CPF巴西123.456.789-00[CPF_REDACTED]CNPJ巴西12.345.678/0001-00[CNPJ_REDACTED]信用卡号4111-1111-1111-1111[CC_REDACTED]电话55 11 99999-9999[PHONE_REDACTED]SSN美国123-45-6789[SSN_REDACTED]6.2 配置方式PII_REDACTION_ENABLEDtrue # 请求侧 PII 重写与 INPUT_SANITIZER_MODE 相互独立 PII_RESPONSE_SANITIZATIONtrue # 可选对返回给客户端的 Provider 响应也做 PII 脱敏.env.example补充了更多细节PII_RESPONSE_SANITIZATION_MODEredactredact掩盖 PII|warn仅记录|block丢弃响应PII_WINDOW_SIZE200流式 PII 检测的最小窗口大小字节默认 200CREDENTIAL_REDACTION_ENABLEDfalse可选的已知 API 密钥/令牌模式脱敏OpenAI、Anthropic、GitHub、Slack 等由src/lib/guardrails/credentialMasker.ts实现响应侧清理器位于src/lib/piiSanitizer.ts请求侧与注入守卫共用src/middleware/promptInjectionGuard.ts。7. 网络安全特性描述CORS显式跨域来源白名单CORS_ALLOWED_ORIGINS旧版CORS_ORIGIN为单来源别名IP 过滤Dashboard 中配置 IP 范围白名单/黑名单限流按 Provider 限流 自动退避防惊群Anti-Thundering HerdMutex 每连接锁定防止级联 502TLS 指纹浏览器级 TLS 指纹伪装降低被机器人检测的风险CLI 指纹按 Provider 调整 header/body 顺序匹配原生 CLI 签名7.1 CORS 配置.env.example中的 CORS 段# Used by: src/server/cors/origins.ts — 设置 Access-Control-Allow-Origin # 反代后的同源 Dashboard 请求不需要 CORS使用会话绑定的 CSRF 防护。 # 除非设置 CORS_ALLOW_ALLtrue否则不会发送通配符。 CORS_ALLOWED_ORIGINShttps://your-frontend.example.com CORS_ORIGINhttps://your-frontend.example.com # legacy 单来源别名 CORS_ALLOW_ALLfalse7.2 SSRF 防护.env.example中与出站 URL 安全相关的变量OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLSfalse默认——阻止 Provider URL 指向私有/内网localhost、192.168.x.x 等这是 LM Studio、Ollama、vLLM 等自托管 Provider 所需的开关OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLStrue默认本地优先——允许本机/局域网地址但仍阻止云元数据地址169.254.169.254、metadata.google.internal实现位于src/shared/network/outboundUrlGuard.ts。8. 弹性与可用性特性描述熔断器Circuit Breaker三态Closed → Open → Half-Open按 Provider 独立状态持久化到 SQLite请求幂等5 秒去重窗口防止重复请求指数退避自动重试并逐步增加延迟健康看板实时 Provider 健康监控熔断、冷却Cooldown与模型锁定的完整设计见 docs/architecture/RESILIENCE_GUIDE.md。9. 合规能力特性描述日志保留按CALL_LOG_RETENTION_DAYS自动清理免日志退出No-Log Opt-out每个 API Key 的noLog标志可关闭请求日志审计日志管理操作记录在audit_log表MCP 审计所有 MCP 工具调用由 SQLite 支撑的审计日志记录Zod 校验所有 API 输入在模块加载时用 Zod v4 schema 校验合规细节可进一步查阅 docs/security/COMPLIANCE.md审计日志与保留策略。10. 必填环境变量与快速失败10.1 必填与推荐密钥所有机密必须在启动服务器前设置完毕。若缺失或过弱服务器将**快速失败fail fast**拒绝启动# REQUIRED —— 缺少则服务器不会启动 JWT_SECRET$(openssl rand -base64 48) # 最少 32 字符 API_KEY_SECRET$(openssl rand -hex 32) # 最少 16 字符 # RECOMMENDED —— 启用静态加密 STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32)服务器会主动拒绝已知的弱值如changeme、secret、password。10.2 .env 契约中的其他安全变量.env.example 的安全段还包含INITIAL_PASSWORDCHANGEME首次启动时设置初始 Dashboard 管理员密码必须在首次使用前修改之后可在 Dashboard → Settings → Security 更改AUTH_COOKIE_SECUREfalse任何非 localhost 部署必须设为trueREQUIRE_API_KEYfalse多用户/公网部署建议设为true要求所有/v1/*代理端点携带 API KeyALLOW_API_KEY_REVEALfalse共享实例上开启会在 Dashboard 展示明文 API Key存在安全风险MAX_BODY_SIZE_BYTES10485760最大请求体 10 MB由src/shared/middleware/bodySizeGuard.ts实现NO_LOG_API_KEY_IDSkey_abc123,key_def456跳过请求日志的 API Key ID 列表GDPR/合规OMNIROUTE_WS_BRIDGE_SECRET内部 Codex Responses WebSocket 桥接共享密钥生产环境必填未设置则所有 WS 桥接请求被拒绝。11. Docker 安全加固11.1 生产实践清单官方建议的生产环境 Docker 安全基线生产环境使用非 root 用户运行将机密挂载为只读卷绝不把.env文件复制进 Docker 镜像使用.dockerignore排除敏感文件HTTPS 反向代理之后必须设置AUTH_COOKIE_SECUREtrue。11.2 推荐的 docker run 命令docker run -d \ --name omniroute \ --restart unless-stopped \ --read-only \ -p 20128:20128 \ -v omniroute-data:/app/data \ -e JWT_SECRET$(openssl rand -base64 48) \ -e API_KEY_SECRET$(openssl rand -hex 32) \ -e STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32) \ diegosouzapw/omniroute:latest要点解读--read-only容器根文件系统只读配合只读挂载的机密降低被写入恶意文件的攻击面-v omniroute-data:/app/dataSQLite 数据库与日志持久化到命名卷容器重建不丢数据三个密钥用$(openssl rand ...)在启动时即时生成避免复用弱值。更多容器化部署方式可参考 docs/guides/DOCKER_GUIDE.md 与 docker-compose.yml。12. 依赖安全与硬性安全规则12.1 依赖管理定期运行npm audit官方脚本npm run audit:deps同时覆盖主包与 Electron保持依赖更新项目使用huskylint-staged做提交前检查lint-staged check-docs-sync check:any-budget:t11CI 流水线在每次 push 时运行 ESLint 安全规则no-eval、no-implied-eval、no-new-func为 error 级Provider 常量在模块加载时用 Zod 校验src/shared/validation/schemas.ts。安全优先的默认库avoid rolling your owndompurify/isomorphic-dompurifyXSS 防护joseJWT 处理better-sqlite3参数化查询规避 SQL 注入bcryptjs密码哈希。12.2 硬性安全规则工具与评审强制官方在根目录 SECURITY.md 中明确了 11 条硬性规则核心几条如下绝不提交机密.env被 gitignore.env.example是模板只允许注释不出现字面值绝不使用eval()/new Function()/ 隐式 evalESLint 强制未经运维明确批准不得绕过 Husky 钩子--no-verify、--no-gpg-sign路由中绝不写裸 SQL一律走src/lib/db/的参数化查询所有输入用 Zod 校验src/shared/validation/schemas.ts上游 header 必须清洗黑名单在src/shared/constants/upstreamHeaders.ts静态加密凭据AES-256-GCM见 src/lib/db/encryption.ts公开上游 OAuth 标识符走resolvePublicCred()禁止在源码里内嵌AIza…/GOCSPX-…/…apps.googleusercontent.com字面值详见 docs/security/PUBLIC_CREDS.md错误响应走buildErrorBody()/sanitizeErrorMessage()绝不在 HTTP / SSE / executor / MCP 响应体中输出原始err.stack/err.message详见 docs/security/ERROR_SANITIZATION.mdexec()/spawn()的运行时值通过env选项传入绝不把外部路径或不可信值字符串插值进 shell 脚本参考src/mitm/cert/install.ts::updateNssDatabases。13. 供应链扫描与最小化构建根目录英文版 SECURITY.md 还记录了一个重要的供应链事实发布的omniroutenpm 制品打包了 Next.jsoutput: standalone构建因此包括 MITM、Zed 导入、Cloud Sync、嵌入式服务监督等特权功能在内的所有路由处理器都会进入.next/server/*.js压缩 chunk。启发式供应链扫描器Socket.dev / Snyk 等经常把这些 chunk 与恶意软件签名误匹配。仓库的应对措施扫描器配置位于根目录 socket.ymlSocket.dev GitHub App 格式 v2显式排除tests/、_tasks/、_references/、docs/等不随制品发布的目录只报告实际到达用户的代码路径针对每类发现维护“维护者证明”maintainer attestation见 docs/security/SOCKET_DEV_FINDINGS.md并在每个被标记函数点内联SECURITY-AUDITOR-NOTE:注释对无法放宽告警的流水线提供最小化构建OMNIROUTE_BUILD_PROFILEminimal npm run build该构建将四个敏感模块替换为运行时返回 HTTP 503feature-disabled的桩实现使特权代码路径从产物中物理消失。完整发布配方见 docs/security/SOCKET_DEV_FINDINGS.md。14. 延伸阅读docs/architecture/AUTHZ_GUIDE.md — 授权管线docs/security/GUARDRAILS.md — Guardrails 框架docs/security/COMPLIANCE.md — 审计日志与保留策略docs/security/PUBLIC_CREDS.md — 公开上游凭据的强制性模式docs/security/ERROR_SANITIZATION.md — 错误响应清洗的强制性模式docs/security/SOCKET_DEV_FINDINGS.md — 供应链扫描器发现的维护者证明docs/architecture/RESILIENCE_GUIDE.md — 熔断 冷却 锁定docs/security/STEALTH_GUIDE.md — TLS 指纹附法律/伦理说明.env.example — 全部运行时环境变量契约src/lib/db/encryption.ts — 字段级 AES-256-GCM 加密实现src/middleware/promptInjectionGuard.ts — 注入守卫中间件【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表