Sécurité¶
Stream Fusion implémente plusieurs couches de sécurité pour protéger l'application, les données utilisateur et les communications inter-instances.
Vue d'ensemble¶
-
API Stremio
Token Fernet encodé dans l'URL addon
Routes :
/{config}/stream/*,/{config}/catalog/* -
API JSON
Header
secret-keyavecSECRET_API_KEYRoutes :
/api/auth/*,/api/config/* -
API Peer
HMAC-SHA256 + Fernet chiffré
Routes :
/api/peer/* -
Admin
Session cookie + CSRF
Routes :
/admin/* -
Enregistrement
Rate limiting IP (5/heure)
Routes :
/register -
Playback
Rate limiting par utilisateur
Routes :
/playback/*
Authentification Stremio¶
Les URLs Stremio contiennent un token Fernet encodé :
Le {config} contient : clé API, préférences debrid, indexeurs activés, qualité, langue.
Ce token est chiffré avec CONFIG_SECRET_KEY (Fernet). Si cette clé n'est pas définie, un encodage Base64 non chiffré est utilisé.
Rotation de CONFIG_SECRET_KEY
Changer cette clé invalide toutes les URLs de configuration existantes. Les utilisateurs devront reconfigurer leur addon.
Authentification API JSON¶
La comparaison utilise secrets.compare_digest() pour prévenir les attaques par timing.
Authentification HMAC (Peer)¶
Voir Peering - Sécurité pour les détails complets.
sequenceDiagram
participant Client as Instance B
participant Server as Instance A
Note over Client: 1. body_hash = SHA-256(body)
Note over Client: 2. message = timestamp.body_hash
Note over Client: 3. signature = HMAC-SHA256(secret, message)
Client->>Server: POST /api/peer/*<br/>X-Peer-Key-Id, X-Peer-Timestamp,<br/>X-Peer-Signature
Note over Server: 4. Vérifier timestamp ±60s
Note over Server: 5. Lookup clé + vérifier is_active
Note over Server: 6. Recalculer HMAC et comparer
Note over Server: 7. Vérifier rate limit
Server-->>Client: {"payload": "Fernet_encrypted"}
Note over Client: 8. Déchiffrer avec Fernet
Authentification Admin¶
Sessions Starlette stockées dans Redis + protection CSRF sur tous les formulaires POST.
Session key
La valeur par défaut de SESSION_KEY est insécurisée. Définissez une clé unique en production.
Rate limiting¶
| Service | Limite | Stockage |
|---|---|---|
Enregistrement (/register) |
5/heure/IP | Redis |
Playback (/playback) |
60/60s/utilisateur | Redis |
Peer API (/api/peer) |
60/60s/clé (configurable) | Redis |
Chiffrement au repos¶
graph TD
A["Clé maîtresse"] --> B["sf-peer-cache-v1: + secret"]
A --> C["sf-peer-storage-v1: + PEER_MASTER_KEY"]
A --> D["Fernet standard + CONFIG_SECRET_KEY"]
B --> E["Chiffrement réponses API peer"]
C --> F["Chiffrement secrets peer en DB"]
D --> G["Chiffrement tokens config addon"]
style A fill:#311b92,color:#fff
style E fill:#1b5e20,color:#fff
style F fill:#1b5e20,color:#fff
style G fill:#1b5e20,color:#fff
La séparation des domaines garantit qu'aucune clé dérivée ne peut être utilisée dans un autre contexte.
Sécurité Docker (production)¶
security_opt:
- no-new-privileges:true # Pas d'escalade de privilèges
cap_drop:
- ALL # Aucun capability Linux
read_only: true # Système de fichiers en lecture seule
tmpfs:
- /tmp:mode=1777 # Tmpfs pour les écritures temporaires
- /home/appuser:uid=1000,gid=1000,mode=0700
Proxy SOCKS5 (WARP)¶
En production, un conteneur Cloudflare WARP fournit un proxy SOCKS5 :
Utilisé pour les requêtes vers les indexeurs et services debrid. Optionnel — retirez PROXY_URL pour désactiver.
Masquage des logs¶
Par défaut, LOG_REDACTED=True censure les secrets dans les logs : tokens debrid, clés API, mots de passe PostgreSQL.
Documentation API¶
Swagger UI et ReDoc sont masqués par défaut (SECURITY_HIDE_DOCS=True). Pour les réactiver :