Copias de seguridad cifradas

El SDK puede guardar su base de datos o cualquier archivo/carpeta en la bóveda zero-knowledge de Quiet Guard. Todo se cifra en su servidor antes del envío, con una clave que solo su equipo puede desbloquear. El servidor no almacena más que un blob opaco y nunca ve ni sus datos ni su clave.

Requisitos

  • El cifrado debe estar activado para su equipo en el dashboard de Quiet Guard (esto genera el par de claves del equipo y está protegido por una passphrase de equipo). La bóveda de copias de seguridad es una funcionalidad de pago sujeta a una cuota de almacenamiento. Consulte la documentación del servidor.
  • PHP compilado con libsodium (ext-sodium, incluida por defecto desde PHP 7.2).
  • Para las bases de datos que no sean SQLite, el binario de volcado correspondiente en el host: mysqldump (MySQL / MariaDB) o pg_dump (PostgreSQL). Las bases SQLite se copian directamente.

Crear una copia de seguridad

bash
# Guardar la conexión de base de datos por defecto
php artisan monitor:backup --database

# Guardar un archivo o una carpeta
php artisan monitor:backup --path=/var/www/storage/app

# Añadir una etiqueta legible
php artisan monitor:backup --database --name="nightly"

Opciones

OpciónDescripción
--databaseGuarda la conexión de base de datos por defecto (config('database.default')).
--path=Guarda un archivo único o una carpeta entera.
--name=Etiqueta opcional almacenada con la copia de seguridad. ASCII imprimible, sin barras, 255 caracteres como máximo: la etiqueta se convierte en el nombre de archivo con el que se ofrece la descarga, y un separador de ruta no es algo que una cabecera HTTP pueda transportar. El servidor responde 422 y nombra el campo cuando rechaza una.

Debe pasar --database o bien --path. Cuando MONITOR_ENABLED=false, el comando no hace nada.

Cómo se construye el archivo de copia

  • --database: las conexiones SQLite se copian tal cual; MySQL/MariaDB se exportan con mysqldump, PostgreSQL con pg_dump. La contraseña se pasa por el entorno (MYSQL_PWD / PGPASSWORD), nunca en la línea de comandos. El volcado se ejecuta con un timeout de 600 segundos. La copia se registra con el tipo database.
  • --path: una carpeta se empaqueta en un archivo tar (un archivo único se añade a un tar), registrado con el tipo files.

Restaurar una copia de seguridad

bash
php artisan monitor:restore <id>

# Elegir dónde escribir la salida descifrada
php artisan monitor:restore <id> --output=/tmp/restore.sql

# Proporcionar la passphrase de forma no interactiva (si no, se solicita)
php artisan monitor:restore <id> --passphrase="…"

Opciones

Argumento / opciónDescripción
id (argumento)El identificador de la copia de seguridad devuelto durante el envío.
--output=Dónde escribir el resultado descifrado. Por defecto restored-<id>.out en la ruta base de la aplicación.
--passphrase=La passphrase del equipo. Se solicita de forma segura (entrada oculta) si se omite.

La salida descifrada es el archivo en bruto: un volcado SQL (o un archivo SQLite) para las copias --database, o un archivo tar para las copias --path. Como la salida por defecto es restored-<id>.out, pase --output con una extensión apropiada para usarla directamente, por ejemplo --output=restore.sql o --output=files.tar.

Cómo funciona el cifrado

Las copias de seguridad usan un cifrado híbrido en flujo, compartido con todos los demás clientes Quiet Guard a través del núcleo quiet-guard/monitor-php:

  1. Una clave simétrica aleatoria cifra el archivo con el secretstream de libsodium (AEAD XChaCha20-Poly1305 en bloques de 64 KiB); los volcados grandes se procesan así en flujo, sin cargarse nunca enteros en memoria.
  2. Esa clave simétrica se sella hacia la clave pública X25519 de su equipo (crypto_box_seal). La clave sellada se antepone al blob.
  3. El blob cifrado se envía a /api/v1/backups. El servidor lo almacena de forma opaca, con sus metadatos (tipo, nombre, tamaño), y aplica su cuota de almacenamiento.

Para restaurar, el SDK recupera su material de clave desde /api/v1/encryption-key (clave pública, clave privada envuelta por la passphrase y sal KDF), y luego desbloquea la clave privada localmente a partir de su passphrase: una derivación Argon2id (límites MODERATE) reproduce la clave de cifrado de claves y abre una secretbox de libsodium, exactamente igual que hace la envoltura en el lado del servidor. La clave desbloqueada abre la clave simétrica sellada, que descifra el flujo.

Es zero-knowledge: la passphrase y la clave privada desbloqueada nunca salen de su servidor, y el operador no puede leer jamás sus copias de seguridad. La contrapartida: una passphrase perdida significa una copia de seguridad irrecuperable, no existe ningún restablecimiento.

Planificación

Planifique copias de seguridad nocturnas de la base de datos desde el planificador de su aplicación:

php
use Illuminate\Support\Facades\Schedule;

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

Relación con la bóveda

La bóveda, la cuota en GB y la interfaz del blob cifrado viven en el lado del servidor. Consulte la documentación del servidor para explorar las copias de seguridad, descargar el blob cifrado en bruto y gestionar el almacenamiento.

Está leyendo la documentación Laravel SDK v1.0.