Cómo implementar backups diferenciales

En el mundo real —no en el de los apuntes bonitos— los backups fallan cuando no se prueban y se olvidan cuando no se automatizan.

Hoy vamos a montar un sistema completo de copias de seguridad en Linux, usando herramientas estándar, sin software propietario y con enfoque profesional: cifrado, rotación, verificación de integridad y automatización.

Prerequisitos

Para el despliegue de este escenario usaremos :

  • Dos servidores Ubuntu 24.04
    • Servidor backup con la IP 192.168.100.10
    • Servidor remoto para guardar los backups con la IP 192.168.100.20

El software que necesitaremos usar será :

  • tar
  • gzip
  • gpg
  • find
  • cron
  • rsync

Las carpetas con las que trabajaremos en los servidores serán :

  • Servidor backup
    • /datos para alojar los datos «reales»
    • /backup para guardar las copias.
  • Servidor remoto
    • /backup para guardar los archivos de backup que llegarán desde el servidor que ejecuta las copias.

El servidor de backup ha de poder hacer ssh sin contraseña, usando un certificado, en el servidor remoto. Si no sabes cómo hacerlo, te lo explico en el post Cómo configurar SSH para autenticar con clave pública y privada

El usuario que crearemos en el servidor remoto se llamará backupuser.

Configuración del backup diferencial

Haremos una instalación básica de Ubuntu. Una vez instalado y actualizado podremos empezar a realizar la configuración del mecanismo de backup.

Full backup

Como sabemos, todos los backups empiezan con un full backup. Ejecutaremos un tar para empaquetar los archivos de la carpeta de la que queremos hacer backup.

tar -cvpfz /backup/full-$(date +%F).tar.gz /datos

En la carpeta de backups debermos ver que se ha generado el archivo .tar.gz.

Continuaremos cifrando el archivo con :

gpg --symmetric --cipher-algo AES256 /backup/full-2026-02-01.tar.gz

Obtendremos un archivo cifrado al que le calcularemos su huella SHA y lo guardaremos en un archivo. Ésto nos permitirá conocer si el backup es fiable porque antes de recuperarlo podremos validar si los archivos han sido modificados.

Finalment, vamos a subir este archivo al servidor remoto con :

rsync -av full-2026-02-05.tar.gpg* backupuser@backup-server:/backup/full/

Backup diferencial

Aquí es donde se hace la magia. Usaremos –link-dest para crear copias diferenciales basadas en hard links. Así sólo se almacenarán los cambios reales.

La estructura que usaremos en el servidor de destino será :

/backup/
 ├── full/
 ├── diff/
 └── last -> enlace simbólico

Lo primero que haremos es ejecutar rsync para que genere el paquete diferencial y aprovecharemos la capacidad que tiene de indicar un destino remoto para que guarde los datos directamente allí. Ejecutaremos :

rsync -av --delete --link-dest=/backup/last /datos/ backupuser@backup-server:/backup/diff/diff-$(date +%F)

Una vez se acabe este proceso, haremos que el enlace simbólico last apunte al nuevo archivo que se ha creado. Lo haremos desde la máquina de backup por medio de la ejecución de un comando por shell remota :

ssh backupuser@backup-server \
"ln -sfn /backup/diff/diff-$(date +%F) /backup/last"

Rotación de backups

Como no disponemos de espacio ilimitado, en algún momento deberemos definir un ciclo de vida para los backups y hacer rotaciones.

Si quisiésemos tener una politica de rotaciones :

  • Full backup -> 30 días
  • Diferenciales -> 14 días

podríamos ejecutar manualmente estos comandos para eliminar los archivos que superen estas antigüedades :

find /backup/full -type f -mtime +30 -delete
find /backup/diff -type d -mtime +14 -exec rm -rf {} \;

Estos comandos los deberemos ejecutar en el servidor remoto donde guardamos las copias.

Es más que conveniente que automatices la rotación por medio de scripts.

Restauración y verificación

Antes de restaurar un archivo de backup deberíamos comprobar su integridad. Como durante el proceso de generación del backup habíamos creado su hash ahora podremos verificarlo :

sha256sum -c full-2026-02-05.tar.gpg.sha256

Si el resultado es OK, el archivo no ha sido manipulado desde el momento de su creación.

A continuación procedemos a descifrarlo con :

gpg --decrypt full-2026-02-05.tar.gz.gpg > full.tar.gz

Y finalmente desempaquetaremos con :

tar -xvpzf full.tar.gz -C /

Buenas prácticas

Algunas buenas prácticas que podríamos implementar son :

  • Usar una partición separada para la carpeta /backup.
  • Limitar los permisos del usuario backupuser.
  • Configurar la directiva PermitRootLogin a valor no en ssh. Lo tienes explicado en Cómo bastionar el servicio SSH
  • Hacer pruebas de restauración periódicas.
  • Documentar, documentar y documentar. No sólo los scripts, también todo la información referente a los periodos de retención o el RTO y RPO de nuestra organización.

Ya sabes que si quieres recibir cuando se publica o se actualiza un artículo puedes suscribirte a la newsletter.