Statut (2026-11-10) : en grande partie implémenté. Faits : le chiffrement des secrets saisis (AES-256-GCM, clé
DATA_DIR/protoflix.key), la confidentialité entre comptes et la bibliothèque privée, l'absence de télémétrie, les services extérieurs désactivés par défaut, la configuration affichée masquée. Planifiés et marqués comme tels plus bas : les variables*_FILEpour chaque secret,protoflix secrets rotate, l'export des données d'un compte.
1. Configuration et secrets séparés
| Catégorie | Exemples | Où |
|---|---|---|
| Configuration non sensible | adresse d'écoute, niveau de log, rôles actifs, répertoires, quotas, TRUSTED_PROXIES | variables PROTOFLIX_* ou fichier de configuration lisible |
| Secrets | clés API de fournisseurs, clé de chiffrement des secrets stockés, jetons des workers distants (ADR 0020). Il n'existe pas de mot de passe de base : SQLite est un fichier local protégé par ses permissions (0600, propriétaire protoflix) | fichier de secrets séparé ou variables *_FILE pointant vers un fichier |
Règles :
- (Planifié) Chaque secret pourra être fourni par
PROTOFLIX_<NOM>_FILE(compatible Docker secrets etLoadCredential=de systemd). La variable directe reste acceptée pour le développement. - Les fichiers de secrets doivent être en
0600(ou0640avec groupe dédié), propriétairerootouprotoflix. Au démarrage, le serveur avertit (ne refuse pas, pour ne pas casser Docker) si le fichier est lisible par tous. - Le diagnostic de configuration (
/api/v1/admin/configet commande CLI) affiche les clés présentes, jamais les valeurs (****). - Les secrets saisis dans l'interface admin (ex. clé API d'un fournisseur) sont stockés en base chiffrés (AES-256-GCM) avec une clé hors base (
DATA_DIR/protoflix.key, 32 octets aléatoires, créée au premier démarrage en0600si absente). Une sauvegarde de la base sans cette clé ne donne pas accès à ces secrets — la procédure de sauvegarde le documente.
2. Rotation
| Secret | Rotation |
|---|---|
| Jeton de worker distant | Révocation dans l'administration, puis protoflix worker enroll pour un nouveau jeton, déposé dans le fichier PROTOFLIX_WORKER_TOKEN_FILE du worker ; aucun redémarrage du coordinateur |
| Clés API fournisseurs | Remplaçables à chaud depuis l'admin |
| Clé de chiffrement des secrets | Rotation par commande protoflix secrets rotate (planifiée) : rechiffrement en transaction, ancienne clé conservée jusqu'à la fin |
| Jetons de session | Pas de clé de signature (sessions opaques) ; révocation globale possible par admin |
3. Redaction des journaux
Jamais journalisés : mots de passe, codes rapides, codes d'invitation, jetons de session/renouvellement/lecture, en-têtes Authorization et Cookie, clés API, jetons de worker, corps de requêtes d'authentification.
Mesures :
- Types dédiés pour les secrets (méthode
LogValuedeslog.LogValuerrenvoyant****) pour qu'une inclusion accidentelle soit masquée. - Middleware d'accès HTTP qui journalise méthode, route modèle (
/api/v1/media/s/{token}/...), statut, durée — pas l'URL brute. - Chemins système : uniquement dans des journaux de niveau admin, jamais dans les réponses à un non-admin.
- Sortie stderr de FFmpeg : conservée pour le diagnostic admin, tronquée, avec chemins de bibliothèque remplacés par des identifiants dans les vues non admin.
- Traces OpenTelemetry : aucun attribut contenant jeton, cookie, corps ou chemin complet.
4. Données personnelles collectées
| Donnée | Finalité | Rétention par défaut |
|---|---|---|
| E-mail, nom affiché, couleur, rôle, droits | Compte | Durée de vie du compte |
| Hash du mot de passe, hash des codes rapides | Authentification | Durée de vie du compte / de l'appareil |
| Préférences de lecture (langues audio et sous-titres, qualité) | Expérience de lecture | Durée de vie du compte |
| Progression de lecture | Reprise | Durée de vie du compte |
| « Ma liste » | Choix du spectateur | Durée de vie du compte |
| Historique de lecture | « Déjà vu », reprise | Illimitée par défaut, effaçable par le compte ; durée maximale configurable par l'admin |
| Bibliothèque privée (fichiers et métadonnées dérivées) | Stockage personnel | Jusqu'à suppression par le compte ou suppression du compte |
| Appareils (nom, type, agent utilisateur, dernière IP) et sessions | Sécurité, révocation, comptes mémorisés | 90 jours après expiration ou révocation |
| Téléchargements (source, destination, compte) | Audit, responsabilité | 1 an (avec l'audit) |
Événements de lecture détaillés (playback_events) | Diagnostic | 30 jours |
| Journal d'audit (IP, action) | Sécurité | 1 an, configurable |
| Journaux applicatifs | Exploitation | Rotation par taille et ancienneté (14 jours par défaut) |
Principe : collecte minimale. Pas de géolocalisation, pas d'empreinte d'appareil, pas d'analyse comportementale.
5. Export et suppression
- Export (planifié) : un compte peut exporter ses données (préférences, progression, « Ma liste », historique, appareils) au format JSON, et récupérer les fichiers de sa bibliothèque privée.
- Suppression du compte par l'admin : supprime préférences, progression, « Ma liste », historique, sessions, appareils, codes rapides et la bibliothèque privée (fichiers compris, après confirmation indiquant le volume concerné, sans en montrer le contenu) ; les entrées d'audit sont conservées avec le compte pseudonymisé jusqu'à la fin de leur rétention.
- Effacement de l'historique par le compte : immédiat, lectures vues par l'administrateur comprises, sans affecter les corrections de catalogue (qui ne sont pas des données personnelles du spectateur).
6. Confidentialité entre comptes
- Historique, « Ma liste », progression, préférences de lecture et bibliothèque privée sont privés au compte. L'admin applicatif gère les droits mais ne voit pas ces données : le refus est appliqué par les services serveur, pas seulement masqué dans l'interface (détail et exceptions minimales :
authn-authz.md§7). - Limite à dire honnêtement : ces données ne sont pas chiffrées de bout en bout. La personne qui administre la machine (root, accès au fichier
protoflix.db, au stockage ou aux sauvegardes) peut techniquement les lire. Le texte d'information du compte l'indique. - Les sauvegardes contiennent ces données et doivent être protégées comme telles (
docs/operations/backup-restore-upgrade.md).
7. Aucune télémétrie externe
- Le serveur n'envoie aucune donnée à ses auteurs ni à un tiers par défaut : pas de statistiques d'usage, pas de rapport de plantage, pas de vérification de mise à jour silencieuse.
- Seules connexions sortantes par défaut : les fournisseurs de métadonnées configurés par l'admin (ADR 0016). Le module Téléchargements (désactivé par défaut) ajoute, une fois activé, les connexions vers les sources demandées et, pour BitTorrent, vers les pairs, qui voient alors l'adresse IP publique de l'hôte.
- Les modules externes (ADR 0024) : aucun dépôt n'est contacté tant que l'administrateur ne lance pas une recherche ou une installation. La requête ne porte aucun identifiant ni statistique, et le dépôt voit l'adresse IP du serveur. Une fois activé, un module contacte les hôtes qu'il a déclarés.
- Les mises à jour (ADR 0027) sont désactivées par défaut. Activées, elles cherchent une version une fois par jour : la source voit la version installée et l'adresse IP de la machine.
- Le relais de notifications (ADR 0034) est désactivé par défaut (
PROTOFLIX_PUSH_RELAYvide). Activé, il ne reçoit que des messages chiffrés de bout en bout : il ne voit qu'une poignée, une clé publique, une taille et une heure. - Toute autre fonction future qui contacterait un service externe (un rapport de plantage, par exemple) sera, elle aussi, désactivée par défaut, décrite précisément et activable par l'admin.
- L'export OTLP (ADR 0012) est désactivé par défaut et ne pointe que vers une destination choisie par l'admin.
8. Fournisseurs de métadonnées
Les requêtes envoyées aux fournisseurs ne contiennent que des informations sur les œuvres (titre, année, identifiants), jamais d'information sur les comptes ou ce qu'ils regardent. Le contenu des bibliothèques privées n'est jamais envoyé à un fournisseur externe sans action explicite du compte propriétaire.
Source : docs/security/secrets-and-privacy.md, dans le dépôt de ProtoFlix.