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.
Les nouveaux tokens sont obligatoirement chiffrés avec CONFIG_SECRET_KEY (Fernet). Si le chiffrement est indisponible, la création échoue : aucun nouveau token Base64 n’est généré. Le décodage Base64 reste temporairement disponible uniquement pour la compatibilité avec les anciennes configurations.
Rotation de CONFIG_SECRET_KEY
Ne remplacez pas cette clé directement. Pendant une rotation contrôlée, placez temporairement l’ancienne valeur dans CONFIG_SECRET_KEY_PREVIOUS. Elle est utilisée uniquement pour déchiffrer les anciens tokens Fernet ; tous les nouveaux tokens restent chiffrés avec CONFIG_SECRET_KEY. Les identités R2 chiffrées doivent également être migrées avant la bascule.
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.
X-Peer-Key-Id, X-Peer-Timestamp,
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
SESSION_KEY est obligatoire lors d’un lancement direct. L’entrypoint Docker génère une clé aléatoire forte au démarrage si elle n’est pas fournie. En production, définissez une valeur unique et persistante afin de conserver les sessions lors des recréations du conteneur.
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¶
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 :