Sauvegardes de la base : chiffrées, vérifiables et restaurables #14

Open
opened 2026-10-11 23:26:01 +00:00 by Citizenfivefr · 0 comments
Citizenfivefr commented 2026-10-11 23:26:01 +00:00 (Migrated from github.com)

Objectif

Permettre de sauvegarder la base de Cléa de façon simple, avec des fichiers :

  • chiffrés : un fichier volé ou égaré reste illisible
  • vérifiables : on peut prouver qu'ils sont complets et non modifiés
  • restaurables : la restauration est documentée et testée

Cette issue couvre la protection du fichier entier.

Valeurs à respecter

Le stockage des sauvegardes reste au choix de l'hébergeur.

À décider

  • Qui lance la sauvegarde ? (à choisir)
    • Une commande et une interface
    • Isolation des backups
  • Chiffrement : avec une clé publique. La clé privée est gardée hors ligne. Utiliser une clé dédiée aux sauvegardes (variable BACKUP_AGE_RECIPIENT), différente de la clé maîtresse et de la clé de secours
  • Rétention : combien de sauvegardes garder (par exemple 7 quotidiennes, 4 hebdomadaires, 12 mensuelles) et comment supprimer les anciennes
  • Où stocker : au choix

Fonctionnement prévu

  1. le dump n'est jamais écrit en clair sur le disque.
  2. Un fichier manifeste à côté, avec : date, version de Cléa, dernière migration appliquée, taille, empreinte SHA-256 du fichier chiffré.
  3. Vérification de l'intégrité : recalculer l'empreinte et la comparer au manifeste +détection de toutes les modification au déchiffrement.
  4. Test de restauration : déchiffrer avec la clé privée, restaurer dans une base jetable, lancer les migrations et vérifier que Cléa démarre.

À faire

Backend

  • Sauvegarde chiffrée (pg_dump vers age) avec manifeste
  • Commande ou script de vérification d'intégrité (empreinte, taille, lisibilité du manifeste)
  • Rotation des anciennes sauvegardes selon la rétention choisie
  • Échec visible : code de sortie non nul et message dans les journaux
  • Tests : sauvegarde puis restauration sur une base jetable, fichier modifié détecté, mauvaise clé refusée
  • API : lister, lancer et vérifier une sauvegarde (propriétaire et admins) ; télécharger, restaurer et supprimer (propriétaire seulement)
  • Journal d'audit : lancer, vérifier, télécharger, restaurer et supprimer une sauvegarde sont tous enregistrés

Frontend

  • Page « Sauvegardes » réservée au propriétaire/admin
  • Liste des sauvegardes : date, taille, version de Cléa, état de la vérification d'intégrité
  • Bouton « Lancer une sauvegarde » et bouton « Vérifier » (avec un retour clair : en cours, réussi, échec et raison)
  • Affichage de la date de la dernière sauvegarde, avec un avertissement si elle est trop ancienne
  • Boutons « Télécharger », « Restaurer » et « Supprimer » visibles uniquement pour le propriétaire, avec une confirmation avant une restauration ou une suppression (actions destructrices) et un retour d'état clair
  • Pas de fausses valeurs : afficher un état vide clair (« Aucune sauvegarde pour l'instant ») tant qu'il n'y en a pas

Documentation

  • Procédure de restauration pas à pas dans README/WIKI
  • Où garder la clé privée des sauvegardes (hors ligne, séparée de la clé maîtresse et de la base)
  • Exemple de planification et de configuration Docker
  • Conseil : tester la restauration régulièrement, pas seulement la sauvegarde
## Objectif Permettre de sauvegarder la base de Cléa de façon simple, avec des fichiers : - **chiffrés** : un fichier volé ou égaré reste illisible - **vérifiables** : on peut prouver qu'ils sont complets et non modifiés - **restaurables** : la restauration est documentée et testée Cette issue couvre la protection du fichier entier. ## Valeurs à respecter Le stockage des sauvegardes reste au choix de l'hébergeur. ## À décider - [ ] **Qui lance la sauvegarde ?** (à choisir) - Une commande et une interface - Isolation des backups - [ ] **Chiffrement** : avec une clé publique. La clé privée est gardée hors ligne. Utiliser une clé dédiée aux sauvegardes (variable `BACKUP_AGE_RECIPIENT`), différente de la clé maîtresse et de la clé de secours - [ ] **Rétention** : combien de sauvegardes garder (par exemple 7 quotidiennes, 4 hebdomadaires, 12 mensuelles) et comment supprimer les anciennes - [ ] **Où stocker** : au choix ## Fonctionnement prévu 1. le dump n'est jamais écrit en clair sur le disque. 2. Un fichier manifeste à côté, avec : date, version de Cléa, dernière migration appliquée, taille, empreinte SHA-256 du fichier chiffré. 3. Vérification de l'intégrité : recalculer l'empreinte et la comparer au manifeste +détection de toutes les modification au déchiffrement. 4. Test de restauration : déchiffrer avec la clé privée, restaurer dans une base jetable, lancer les migrations et vérifier que Cléa démarre. ## À faire ### Backend - [ ] Sauvegarde chiffrée (`pg_dump` vers `age`) avec manifeste - [ ] Commande ou script de vérification d'intégrité (empreinte, taille, lisibilité du manifeste) - [ ] Rotation des anciennes sauvegardes selon la rétention choisie - [ ] Échec visible : code de sortie non nul et message dans les journaux - [ ] Tests : sauvegarde puis restauration sur une base jetable, fichier modifié détecté, mauvaise clé refusée - [ ] API : lister, lancer et vérifier une sauvegarde (propriétaire et admins) ; télécharger, restaurer et supprimer (propriétaire seulement) - [ ] Journal d'audit : lancer, vérifier, télécharger, restaurer et supprimer une sauvegarde sont tous enregistrés ### Frontend - [ ] Page « Sauvegardes » réservée au propriétaire/admin - [ ] Liste des sauvegardes : date, taille, version de Cléa, état de la vérification d'intégrité - [ ] Bouton « Lancer une sauvegarde » et bouton « Vérifier » (avec un retour clair : en cours, réussi, échec et raison) - [ ] Affichage de la date de la dernière sauvegarde, avec un avertissement si elle est trop ancienne - [ ] Boutons « Télécharger », « Restaurer » et « Supprimer » visibles uniquement pour le propriétaire, avec une confirmation avant une restauration ou une suppression (actions destructrices) et un retour d'état clair - [ ] Pas de fausses valeurs : afficher un état vide clair (« Aucune sauvegarde pour l'instant ») tant qu'il n'y en a pas ### Documentation - [ ] Procédure de restauration pas à pas dans README/WIKI - [ ] Où garder la clé privée des sauvegardes (hors ligne, séparée de la clé maîtresse et de la base) - [ ] Exemple de planification et de configuration Docker - [ ] Conseil : tester la restauration régulièrement, pas seulement la sauvegarde
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Citizenfive-fr/Clea#14
No description provided.