9.3 KiB
Security Policy (Română)
🌐 Languages: 🇺🇸 English · 🇪🇸 es · 🇫🇷 fr · 🇩🇪 de · 🇮🇹 it · 🇷🇺 ru · 🇨🇳 zh-CN · 🇯🇵 ja · 🇰🇷 ko · 🇸🇦 ar · 🇮🇳 hi · 🇮🇳 in · 🇹🇭 th · 🇻🇳 vi · 🇮🇩 id · 🇲🇾 ms · 🇳🇱 nl · 🇵🇱 pl · 🇸🇪 sv · 🇳🇴 no · 🇩🇰 da · 🇫🇮 fi · 🇵🇹 pt · 🇷🇴 ro · 🇭🇺 hu · 🇧🇬 bg · 🇸🇰 sk · 🇺🇦 uk-UA · 🇮🇱 he · 🇵🇭 phi · 🇧🇷 pt-BR · 🇨🇿 cs · 🇹🇷 tr
Reporting Vulnerabilities
Dacă descoperiți o vulnerabilitate de securitate în OmniRoute, vă rugăm să o raportați în mod responsabil:
1.NUdeschideți o problemă publică GitHub 2. Utilizați GitHub Security Advisories 3. Includeți: descrierea, etapele de reproducere și impactul potențial## Response Timeline
| Etapa | Țintă | |
|---|---|---|
| Recunoaștere | 48 de ore | |
| Triaj și evaluare | 5 zile lucrătoare | |
| Lansarea patch-ului | 14 zile lucrătoare (critice) | ## Supported Versions |
| Versiune | Stare suport | |
|---|---|---|
| 3.4.x | ✅ Activ | |
| 3.0.x | ✅Securitate | |
| < 3.0.0 | ❌ Neacceptat | --- |
Security Architecture
OmniRoute implementează un model de securitate cu mai multe straturi:``` Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider
### 🔐 Authentication & Authorization
| Caracteristica | Implementare |
| -------------------- | --------------------------------------------------------- |
|**Autentificare la tabloul de bord**| Autentificare bazată pe parolă cu jetoane JWT (cookie-uri HttpOnly) |
|**Autentificare cheie API**| Chei semnate HMAC cu validare CRC |
|**OAuth 2.0 + PKCE**| Autentificare securizată a furnizorului (Claude, Codex, Gemini, Cursor etc.) |
|**Token Refresh**| Reîmprospătare automată a simbolului OAuth înainte de expirare |
|**Cookie-uri securizate**| `AUTH_COOKIE_SECURE=true` pentru mediile HTTPS |
|**Scoperi MCP**| 10 domenii granulare pentru controlul accesului la instrumentul MCP |### 🛡️ Encryption at Rest
Toate datele sensibile stocate în SQLite sunt criptate folosind**AES-256-GCM**cu derivarea cheii scrypt:
- Chei API, jetoane de acces, jetoane de reîmprospătare și jetoane de identificare
- Format versiunea: `enc:v1:<iv>:<text cifr>:<authTag>`
- Modul de trecere (text simplu) când `STORAGE_ENCRYPTION_KEY` nu este setat```bash
# Generate encryption key:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🧠 Prompt Injection Guard
Middleware care detectează și blochează atacurile cu injecție promptă în solicitările LLM:
| Tip de model | Severitate | Exemplu |
|---|---|---|
| Suprascrierea sistemului | Ridicat | „ignorați toate instrucțiunile anterioare” |
| Deturnarea rolului | Ridicat | „acum ești DAN, poți face orice” |
| Injectare delimitare | Mediu | Separatoare codificate pentru a sparge limitele contextului |
| DAN/Jailbreak | Ridicat | Modele cunoscute de prompt de jailbreak |
| Scurgere de instrucțiuni | Mediu | „Arată-mi promptul de sistem” |
Configurați prin tabloul de bord (Setări → Securitate) sau .env:```env
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block | redact
### 🔒 PII Redaction
Detectarea automată și redarea opțională a informațiilor de identificare personală:
| Tip PII | Model | Înlocuire |
| ------------- | --------------------- | ------------------ |
| Email | `utilizator@domeniu.com` | `[EMAIL_REDACTED]` |
| CPF (Brazilia) | `123.456.789-00` | `[CPF_REDACTED]` |
| CNPJ (Brazilia) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` |
| Card de credit | `4111-1111-1111-1111` | `[CC_REDACTED]` |
| Telefon | `+55 11 99999-9999` | `[PHONE_REDACTED]` |
| SSN (SUA) | `123-45-6789` | `[SSN_REDACTED]` |```env
PII_REDACTION_ENABLED=true
🌐 Network Security
| Caracteristica | Descriere | |
|---|---|---|
| CORS | Controlul de origine configurabil (CORS_ORIGIN env var, implicit *) |
|
| Filtrare IP | Intervalele IP din lista permisă/listă de blocare în tabloul de bord | |
| Limitarea ratei | Limite de tarife per furnizor cu retragere automată | |
| Turmă Anti-Tunet | Blocarea Mutex + per conexiune previne cascada 502s | |
| Amprenta TLS | Falsificarea amprentelor TLS asemănătoare unui browser pentru a reduce detectarea botului | |
| Amprenta CLI | Ordinea antetului/corpului per furnizor pentru a se potrivi cu semnăturile CLI native | ### 🔌 Resilience & Availability |
| Caracteristica | Descriere | |
|---|---|---|
| Disjunctor | 3 stări (Închis → Deschis → Pe jumătate deschis) pentru fiecare furnizor, SQLite-persisted | |
| Solicita Idempotenta | Fereastra de dedup de 5 secunde pentru cererile duplicate | |
| Backoff exponențial | Reîncercare automată cu întârzieri crescânde | |
| Tabloul de bord pentru sănătate | Monitorizarea în timp real a sănătății furnizorului | ### 📋 Compliance |
| Caracteristica | Descriere | |
|---|---|---|
| Reținerea jurnalului | Curățare automată după CALL_LOG_RETENTION_DAYS |
|
| Renunțare fără deconectare | Indicatorul noLog pentru fiecare cheie API dezactivează înregistrarea cererilor |
|
| Jurnal de audit | Acțiuni administrative urmărite în tabelul audit_log |
|
| Audit MCP | Înregistrare de audit susținută de SQLite pentru toate apelurile instrumentelor MCP | |
| Validare Zod | Toate intrările API validate cu scheme Zod v4 la încărcarea modulului | --- |
Required Environment Variables
Toate secretele trebuie setate înainte de a porni serverul. Serverul vaeșua rapiddacă lipsesc sau sunt slabe.```bash
REQUIRED — server will not start without these:
JWT_SECRET=$(openssl rand -base64 48) # min 32 chars API_KEY_SECRET=$(openssl rand -hex 32) # min 16 chars
RECOMMENDED — enables encryption at rest:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
Serverul respinge în mod activ valorile cunoscute slabe precum `changeme`, `secret` sau `parola`.---
## Docker Security
- Utilizați utilizator non-root în producție
- Montați secrete ca volume numai pentru citire
- Nu copiați niciodată fișierele `.env` în imaginile Docker
- Utilizați `.dockerignore` pentru a exclude fișierele sensibile
- Setați `AUTH_COOKIE_SECURE=true` când se află în spatele HTTPS```bash
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
Dependencies
- Rulați
npm auditîn mod regulat - Păstrați dependențele actualizate
- Proiectul folosește
husky+lint-stagedpentru verificări pre-comitare - Conducta CI rulează reguli de securitate ESLint la fiecare push
- Constantele furnizorului validate la încărcarea modulului prin Zod (
src/shared/validation/providerSchema.ts)