Sauvegardes chiffrées

Le SDK peut sauvegarder votre base de données ou n'importe quel fichier/dossier dans le coffre zéro-knowledge de Quiet Guard. Tout est chiffré sur votre serveur avant l'envoi, avec une clé que seule votre équipe peut déverrouiller. Le serveur ne stocke qu'un blob opaque et ne voit jamais ni vos données ni votre clé.

Prérequis

  • Le chiffrement doit être activé pour votre équipe dans le dashboard Quiet Guard (cela génère la paire de clés de l'équipe et est protégé par une passphrase d'équipe). Le coffre de sauvegarde est une fonctionnalité payante soumise à un quota de stockage. Voir la documentation du serveur.
  • PHP compilé avec libsodium (ext-sodium, fourni par défaut depuis PHP 7.2).
  • Pour les bases non-SQLite, le binaire de dump correspondant sur l'hôte : mysqldump (MySQL / MariaDB) ou pg_dump (PostgreSQL). Les bases SQLite sont copiées directement.

Créer une sauvegarde

bash
# Sauvegarder la connexion de base de données par défaut
php artisan monitor:backup --database

# Sauvegarder un fichier ou un dossier
php artisan monitor:backup --path=/var/www/storage/app

# Ajouter un libellé lisible
php artisan monitor:backup --database --name="nightly"

Options

OptionDescription
--databaseSauvegarde la connexion de base de données par défaut (config('database.default')).
--path=Sauvegarde un fichier unique ou un dossier entier.
--name=Libellé optionnel stocké avec la sauvegarde. ASCII imprimable, sans barre oblique, 255 caractères au plus : ce libellé devient le nom de fichier sous lequel le téléchargement est proposé, et un séparateur de chemin n'est pas quelque chose qu'un en-tête HTTP sait porter. Le serveur répond 422 et nomme le champ lorsqu'il en refuse un.

Vous devez passer soit --database, soit --path. Lorsque MONITOR_ENABLED=false, la commande ne fait rien.

Comment l'archive est construite

  • --database: les connexions SQLite sont copiées telles quelles ; MySQL/MariaDB sont exportées avec mysqldump, PostgreSQL avec pg_dump. Le mot de passe est passé via l'environnement (MYSQL_PWD / PGPASSWORD), jamais sur la ligne de commande. Le dump s'exécute avec un timeout de 600 secondes. La sauvegarde est enregistrée avec le type database.
  • --path: un dossier est empaqueté dans une archive tar (un fichier unique est ajouté à un tar), enregistrée avec le type files.

Restaurer une sauvegarde

bash
php artisan monitor:restore <id>

# Choisir où écrire la sortie déchiffrée
php artisan monitor:restore <id> --output=/tmp/restore.sql

# Fournir la passphrase de façon non interactive (sinon elle est demandée)
php artisan monitor:restore <id> --passphrase="…"

Options

Argument / optionDescription
id (argument)L'identifiant de la sauvegarde renvoyé lors de l'envoi.
--output=Où écrire le résultat déchiffré. Par défaut restored-<id>.out dans le chemin de base de l'application.
--passphrase=La passphrase d'équipe. Demandée de façon sécurisée (saisie masquée) si omise.

La sortie déchiffrée est l'archive brute : un dump SQL (ou un fichier SQLite) pour les sauvegardes --database, ou une archive tar pour les sauvegardes --path. Comme la sortie par défaut est restored-<id>.out, passez --output avec une extension appropriée pour l'utiliser directement, par exemple --output=restore.sql ou --output=files.tar.

Comment le chiffrement fonctionne

Les sauvegardes utilisent un chiffrement hybride en flux, partagé avec tous les autres clients Quiet Guard via le cœur quiet-guard/monitor-php :

  1. Une clé symétrique aléatoire chiffre l'archive avec le secretstream de libsodium (AEAD XChaCha20-Poly1305 par blocs de 64 Kio), les gros dumps sont ainsi traités en flux, jamais chargés en entier en mémoire.
  2. Cette clé symétrique est scellée vers la clé publique X25519 de votre équipe (crypto_box_seal). La clé scellée est préfixée au blob.
  3. Le blob chiffré est envoyé sur /api/v1/backups. Le serveur le stocke de façon opaque, avec ses métadonnées (type, nom, taille), et applique votre quota de stockage.

Pour restaurer, le SDK récupère votre matériel de clé depuis /api/v1/encryption-key (clé publique, clé privée enveloppée par la passphrase, et sel KDF), puis déverrouille la clé privée localement à partir de votre passphrase : une dérivation Argon2id (limites MODERATE) reproduit la clé de chiffrement de clé et ouvre une secretbox libsodium, exactement comme le fait l'enveloppe côté serveur. La clé déverrouillée ouvre la clé symétrique scellée, qui déchiffre le flux.

C'est zéro-knowledge : la passphrase et la clé privée déverrouillée ne quittent jamais votre serveur, et l'opérateur ne peut jamais lire vos sauvegardes. La contrepartie : une passphrase perdue signifie une sauvegarde irrécupérable, il n'y a pas de réinitialisation.

Planification

Planifiez des sauvegardes de base de données nocturnes depuis le planificateur de votre application :

php
use Illuminate\Support\Facades\Schedule;

Schedule::command('monitor:backup --database --name=nightly')->dailyAt('02:00');

Lien avec le coffre

Le coffre, le quota en Go et l'interface du blob chiffré vivent côté serveur. Consultez la documentation du serveur pour parcourir les sauvegardes, télécharger le blob chiffré brut et gérer le stockage.

Vous lisez la documentation Laravel SDK v1.0.