mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-03 05:45:04 +03:00
170 lines
5.7 KiB
Markdown
170 lines
5.7 KiB
Markdown
# Bezpečnostní zásady
|
|
|
|
## Hlášení zranitelností
|
|
|
|
Pokud v OmniRoute objevíte bezpečnostní zranitelnost, nahlaste ji prosím zodpovědně:
|
|
|
|
1. **NEOTVÍREJTE** veřejný problém na GitHubu
|
|
2. Používejte [bezpečnostní doporučení GitHubu](https://github.com/diegosouzapw/OmniRoute/security/advisories/new)
|
|
3. Zahrňte: popis, kroky reprodukce a potenciální dopad
|
|
|
|
## Časová osa odezvy
|
|
|
|
Fáze | Cíl
|
|
--- | ---
|
|
Potvrzení | 48 hodin
|
|
Triáž a posouzení | 5 pracovních dnů
|
|
Vydání záplaty | 14 pracovních dnů (kritické)
|
|
|
|
## Podporované verze
|
|
|
|
Verze | Stav podpory
|
|
--- | ---
|
|
1.0.x | ✅ Aktivní
|
|
0.8.x | ✅ Bezpečnost
|
|
< 0,8,0 | ❌ Nepodporováno
|
|
|
|
---
|
|
|
|
## Bezpečnostní architektura
|
|
|
|
OmniRoute implementuje vícevrstvý bezpečnostní model:
|
|
|
|
```
|
|
Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider
|
|
```
|
|
|
|
### 🔐 Ověřování a autorizace
|
|
|
|
Funkce | Implementace
|
|
--- | ---
|
|
**Přihlášení do ovládacího panelu** | Ověřování na základě hesla s tokeny JWT (soubory cookie HttpOnly)
|
|
**Autorizace klíče API** | Klíče podepsané HMAC s ověřením CRC
|
|
**OAuth 2.0 + PKCE** | Bezpečné ověřování poskytovatelů (Claude, Codex, Gemini, Cursor atd.)
|
|
**Obnovení tokenu** | Automatická aktualizace tokenu OAuth před vypršením platnosti
|
|
**Bezpečné soubory cookie** | `AUTH_COOKIE_SECURE=true` pro prostředí HTTPS
|
|
|
|
### 🛡️ Šifrování v klidovém stavu
|
|
|
|
Všechna citlivá data uložená v SQLite jsou šifrována pomocí **AES-256-GCM** s odvozením klíče scrypt:
|
|
|
|
- Klíče API, přístupové tokeny, obnovovací tokeny a ID tokeny
|
|
- Verzovaný formát: `enc:v1:<iv>:<ciphertext>:<authTag>`
|
|
- Režim průchodu (prostý text), pokud není nastaven `STORAGE_ENCRYPTION_KEY`
|
|
|
|
```bash
|
|
# Generate encryption key:
|
|
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
|
|
```
|
|
|
|
### 🧠 Ochrana před okamžitou injekcí
|
|
|
|
Middleware, který detekuje a blokuje útoky prompt injection v požadavcích LLM:
|
|
|
|
Typ vzoru | Závažnost | Příklad
|
|
--- | --- | ---
|
|
Přepsání systému | Vysoký | "ignorovat všechny předchozí pokyny"
|
|
Únos role | Vysoký | "Teď jsi DAN, dokážeš cokoli."
|
|
Vložení oddělovače | Střední | Kódované oddělovače pro přerušení hranic kontextu
|
|
DAN/Útěk z vězení | Vysoký | Známé vzory výzev k jailbreaku
|
|
Únik instrukcí | Střední | „Ukaž mi systémový výzvu“
|
|
|
|
Konfigurace přes ovládací panel (Nastavení → Zabezpečení) nebo `.env` :
|
|
|
|
```env
|
|
INPUT_SANITIZER_ENABLED=true
|
|
INPUT_SANITIZER_MODE=block # warn | block | redact
|
|
```
|
|
|
|
### 🔒 Redakční úprava osobních údajů
|
|
|
|
Automatická detekce a volitelná redakce osobních údajů:
|
|
|
|
Typ osobních údajů | Vzor | Nahrazení
|
|
--- | --- | ---
|
|
E-mail | `user@domain.com` | `[EMAIL_REDACTED]`
|
|
CPF (Brazílie) | `123.456.789-00` | `[CPF_REDACTED]`
|
|
CNPJ (Brazílie) | `12.345.678/0001-00` | `[CNPJ_REDACTED]`
|
|
Kreditní karta | `4111-1111-1111-1111` | `[CC_REDACTED]`
|
|
Telefon | `+55 11 99999-9999` | `[PHONE_REDACTED]`
|
|
Číslo sociálního zabezpečení (USA) | `123-45-6789` | `[SSN_REDACTED]`
|
|
|
|
```env
|
|
PII_REDACTION_ENABLED=true
|
|
```
|
|
|
|
### 🌐 Zabezpečení sítě
|
|
|
|
Funkce | Popis
|
|
--- | ---
|
|
**CORS** | Konfigurovatelná kontrola původu (proměnná prostředí `CORS_ORIGIN` , výchozí nastavení `*` )
|
|
**Filtrování IP adres** | Rozsahy IP adres na bílou/černou listinu v dashboardu
|
|
**Omezení rychlosti** | Limity sazeb na poskytovatele s automatickým ukončením
|
|
**Protihromové stádo** | Mutex + uzamčení pro každé připojení zabraňuje kaskádování 502.
|
|
|
|
### 🔌 Odolnost a dostupnost
|
|
|
|
Funkce | Popis
|
|
--- | ---
|
|
**Jistič** | 3 stavy (Zavřeno → Otevřeno → Polootevřeno) na poskytovatele, trvalé uložení v SQLite
|
|
**Žádost o idempotenci** | 5sekundové okno pro odstranění duplicitních požadavků
|
|
**Exponenciální odklon** | Automatické opakování s rostoucím zpožděním
|
|
**Dashboard zdraví** | Monitorování stavu poskytovatele v reálném čase
|
|
|
|
### 📋 Dodržování předpisů
|
|
|
|
Funkce | Popis
|
|
--- | ---
|
|
**Uchovávání protokolů** | Automatické čištění po `LOG_RETENTION_DAYS`
|
|
**Odhlášení bez ukládání protokolů** | Příznak `noLog` pro každý klíč API zakazuje protokolování požadavků.
|
|
**Protokol auditu** | Administrativní akce sledované v tabulce `audit_log`
|
|
|
|
---
|
|
|
|
## Požadované proměnné prostředí
|
|
|
|
Všechny tajné kódy musí být nastaveny před spuštěním serveru. Server **rychle selže** , pokud chybí nebo jsou slabé.
|
|
|
|
```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)
|
|
```
|
|
|
|
Server aktivně odmítá známé slabé hodnoty, jako například `changeme` , `secret` nebo `password` .
|
|
|
|
---
|
|
|
|
## Zabezpečení Dockeru
|
|
|
|
- Použití uživatele bez oprávnění root v produkčním prostředí
|
|
- Připojte tajné kódy jako svazky jen pro čtení
|
|
- Nikdy nekopírujte soubory `.env` do imagí Dockeru
|
|
- Použití `.dockerignore` k vyloučení citlivých souborů
|
|
- Nastavit `AUTH_COOKIE_SECURE=true` při připojení za 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
|
|
```
|
|
|
|
---
|
|
|
|
## Závislosti
|
|
|
|
- Pravidelně spouštějte `npm audit`
|
|
- Udržujte závislosti aktualizované
|
|
- Projekt používá pro kontroly před commitem `husky` + `lint-staged`
|
|
- CI pipeline spouští bezpečnostní pravidla ESLint při každém odeslání.
|