Copias de seguridad sólo con borg en otro VPS o servidor dedicado
Este tutorial mostrará cómo hacer una copia de seguridad de los datos de un servidor, denominado servidor principal, a otro host, aquí denominado servidor de copia de seguridad, con el programa de copia de seguridad de software libre Borg. El servidor de copia de seguridad se configurará de forma que el servidor principal, en su uso normal, sólo pueda añadir nuevos datos, y no borrar o alterar las copias de seguridad antiguas. Esta característica de sólo añadir datos, combinada con el hecho de que las copias de seguridad se almacenan en un servidor independiente en una ubicación separada, hace que las copias de seguridad estén protegidas contra la pérdida de datos, por ejemplo, por accidentes naturales o por un ataque de hackers contra el servidor principal.
Los requisitos previos para seguir esta guía son utilizar Debian Stretch (9) o Debian Buster (10) y disponer de dos servidores, uno principal del que se toman las copias de seguridad, y otro servidor de copias de seguridad en el que se almacenarán los archivos de seguridad. Estos dos servidores deben estar en lugares separados para una protección óptima.
Esta guía comenzará con la configuración en el servidor de copias de seguridad en la primera sección. En la segunda sección, configuraremos el servidor principal y luego realizaremos una copia de seguridad, una restauración de prueba y mostraremos cómo podar manualmente los archivos de copia de seguridad antiguos.
1 Configurar el servidor de copias de seguridad
1.1 Instala borg y crea un nuevo usuario borgbackup
En el servidor de copias de seguridad (el servidor donde se deben almacenar las copias de seguridad) instala Borg en un terminal de root con este comando:
apt install borgbackup
A continuación, elige una contraseña para el usuario borg que pronto crearemos. (Es obligatorio tener una contraseña para cada usuario, sin embargo, esta contraseña casi nunca se utilizará, ya que normalmente nos conectaremos al servidor de copias de seguridad con una clave SSH). Si quieres generar una contraseña aleatoria de 64 caracteres utiliza este comando:
< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-64};echo;
Copia la contraseña del usuario borg mostrada en el portapapeles, y guárdala en un lugar seguro que no esté en el propio servidor.
Ahora, crearemos el usuario borgbackup:
adduser borgbackup
Cuando te pregunten por la contraseña, pega la contraseña que has copiado antes, pulsa Intro y vuelve a pegar la contraseña seguida de Intro. No rellenes nada más, sólo pulsa Intro para responder a las siguientes preguntas.
1.2 Generar claves SSH para el usuario borgbackup
Ahora tenemos que convertirnos en el nuevo usuario con su:
su borgbackup
cd
A continuación, generamos un nuevo par de claves SSH para el usuario:
ssh-keygen -t ed25519
Tras pulsar Intro, te aparecerán una serie de preguntas. Deja las respuestas vacías, simplemente sigue pulsando Enter varias veces hasta que el comando termine. No establezcas ninguna frase de contraseña para la clave, pulsa Enter también en esa pregunta.
1.3 Crear el directorio de copia de seguridad
Ahora, es el momento de crear el directorio donde se almacenarán las copias de seguridad, que en la terminología de borg se define como el repositorio borg. Llamaremos simplemente al directorio borgbackup, pero podrías optar por llamarlo con el nombre de tu servidor principal.
cd
mkdir borgbackup
chmod go-rwx borgbackup
chmod u+rwx borgbackup
2 Configurar el servidor principal y cómo se conecta al servidor de respaldo
2.1 Instalar Borg
Ahora pasamos de trabajar en el servidor de copia de seguridad a hacerlo en el servidor principal.
En el servidor principal (el servidor del que quieres hacer copias de seguridad) instala Borg en un terminal raíz con este comando:
apt install borgbackup
Después necesitaremos la dirección IP externa del servidor principal (en el que estamos). Copia esta dirección IP para tenerla a mano. Si no recuerdas la dirección IP externa del servidor principal, ejecuta este comando para mostrarla:
wget -qO- http://ipecho.net/plain | xargs echo
2.2 Permitir que el servidor principal acceda al servidor de respaldo
Comandos que se ejecutan en el servidor principal
Ahora vamos a preparar la autenticación de la clave SSH para que sea posible conectarse desde el servidor principal al servidor de copia de seguridad. En primer lugar, utiliza este comando para mostrar la clave pública SSH del usuario root en el servidor principal:
cat ~/.ssh/id_*.pub
Si tienes una clave pública SSH para el usuario root, ahora deberías ver esta clave mostrada. Copia la clave en tu portapapeles, ya que tendrás que pegarla más tarde en un archivo del servidor de copia de seguridad.
Si no ves la clave mostrada, tienes que generar el par de claves. Por ejemplo, ejecuta este comando en ese caso: ssh-keygen -t ed25519 seguido de pulsar repetidamente Intro.
Ahora, tenemos que decirle al servidor de copia de seguridad que permita el acceso desde el servidor principal (en el que estamos ahora mismo) con la clave SSH pública. Para ello, introduce este comando, pero sustituye primeroBACKUPHOSTNAME por el nombre del servidor de copia de seguridad:
ssh-copy-id -i ~/.ssh/id_*.pub borgbackup@BACKUPHOSTNAME
Conectar con el servidor de copias de seguridad
Ahora tendrás que introducir la contraseña del usuario borgbackup que has creado en el paso 1.1. Una vez hecho esto, debería ser posible acceder directamente al servidor de copias de seguridad como el usuario borgbackup sin ninguna contraseña. Ahora, comprueba que esto es posible escribiendo este comando, sustituyendo BACKUPHOSTNAME por el nombre de host de tu servidor de copias de seguridad:
ssh borgbackup@BACKUPHOSTNAME
Comandos que se ejecutan en el servidor de copias de seguridad
Ahora reforzaremos aún más la seguridad restringiendo el acceso sólo desde la dirección IP del servidor principal mediante esta clave.
Permanece en el servidor de copia de seguridad y ejecuta este comando:
nano ~/.ssh/authorized_keys
Ahora, deberías ver una larga línea que comienza con ssh. Comprueba que el cursor está al principio del archivo. Añade los siguientes datos en la misma línea, antes de la clave ssh, pero sustituye primero SERVERIPADDRESS por la dirección IP de tu servidor (que has investigado al principio de esta sección):
from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc
Asegúrate de que hay un carácter de espacio entre la sección que has añadido y la sección preexistente que empieza por ssh que sigue a continuación. Luego guarda el archivo con Ctrl+O y sal con Ctrl+X. Ahora hemos limitado el acceso al servidor de copia de seguridad de dos maneras. En primer lugar, sólo se permite el acceso a la dirección IP del servidor principal. En segundo lugar, mediante la opción –append-only sólo se permite añadir datos al repositorio borg, pero no se permiten las eliminaciones ni las alteraciones.
Desconectar del servidor de copia de seguridad y volver al servidor principal
Ejecuta este comando para salir del servidor de copias de seguridad y volver al servidor principal:
exit
2.3 Elegir una contraseña de repositorio borg
Un repositorio borg es la ubicación donde se almacenan las copias de seguridad. Está protegido por una contraseña de repositorio borg, que debes elegir. La contraseña es necesaria para realizar nuevas copias de seguridad y acceder a las antiguas. Puedes idear una contraseña tú mismo (elige un mínimo de 20 caracteres para una seguridad óptima) o generar aleatoriamente una contraseña de 64 caracteres con este comando:
< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-64};echo;
Copia la contraseña del repositorio borg en tu portapapeles marcándola y pulsando Ctrl+C. Es esencial que guardes la contraseña del repositorio borg en un lugar seguro, ya que sin esta contraseña no podrás acceder a tus copias de seguridad. Así que guarda ahora mismo una copia de la contraseña de borg en otro lugar que no sea tus servidores, por ejemplo en un gestor de contraseñas (como KeePass) en tu propio ordenador.
2.4 Crear el repositorio borg
En la terminología Borg, la ubicación donde se almacenan las copias de seguridad se denomina repositorioborg. La contraseña se establecerá ahora como una variable de entorno para preparar la creación de este repositorio. Sustituye CONTRASEÑA por tu contraseña real y ejecuta el comando que aparece a continuación como usuario root de tu servidor principal:
export BORG_PASSPHRASE='PASSWORD'
Crea el repositorio borg de esta manera – pero sustituye primero BACKUPHOSTNAME por el nombre de host de tu servidor de respaldo:
borg init -e repokey-blake2 borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/
Ahora todo está preparado para utilizar borg para las copias de seguridad, que será el tema de la siguiente sección.
3 Hacer una copia de seguridad desde el servidor principal
3.1 Ejecutar la copia de seguridad manualmente
En el ejemplo que sigue, se hará una copia de seguridad de todo el sistema del servidor principal, excepto de ciertos directorios que no son relevantes para la copia de seguridad.
Asegúrate de que has iniciado la sesión como root en el servidor principal antes de continuar. En primer lugar, estableceremos la variable de entorno para la contraseña del repositorio borg mediante este comando (sustituye PASSWORD por tu contraseña real del repositorio borg:
export BORG_PASSPHRASE='PASSWORD'
A continuación, ejecutaremos el siguiente comando para realizar una copia de seguridad completa del sistema. Por favor, ajusta las exclusiones de directorios, las que empiezan por –exclude, a tus necesidades. Por ejemplo, puedes añadir una exclusión del directorio /mnt añadiendo –exclude=mnt Ten en cuenta que no debes introducir la primera barra en el patrón de exclusión, por ejemplo, escribe mnt en lugar de /mnt. También tienes que cambiar el BACKUPHOSTNAME por el nombre real de tu servidor de copias de seguridad. Necesitamos ejecutar primero un comando cd /, ya que borg normalmente inicia la copia de seguridad desde el directorio desde el que se ejecuta.
cd / && borg create --stats --progress --compress lz4 borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/::`hostname`-`date +%Y-%m-%d-%H-%M-%S` ./ --exclude=dev --exclude=mnt/borgbackup -exclude=proc --exclude=run --exclude=root/.cache/ --exclude=sys --exclude=tmp && cd
La primera vez que se ejecute la copia de seguridad tardará un rato (hasta varias horas si tienes una gran cantidad de datos que respaldar). Verás una línea de estado que actualiza rápidamente qué archivo está procesando borg en la copia de seguridad. A partir de la segunda vez las copias de seguridad serán mucho más rápidas, ya que sólo se transmitirán los cambios desde la última copia de seguridad.
3.2 Programar la copia de seguridad con cron
Por supuesto, lo mejor es ejecutar una copia de seguridad automática a un intervalo regular, en lugar de tener que acordarse de ejecutar copias de seguridad manuales. Para conseguirlo, primero creamos un script de shell que ejecute el trabajo de copia de seguridad, que luego editaremos con el editor nano como usuario root en el servidor principal:
touch /usr/local/bin/borgbackup.sh
chmod go-rwx /usr/local/bin/borgbackup.sh
chmod u+rwx /usr/local/bin/borgbackup.sh
nano /usr/local/bin/borgbackup.sh
Inserta estas líneas en el nuevo script de shell:
#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
cd / && borg create --stats --progress --compress lz4 borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/::`hostname`-`date +%Y-%m-%d-%H-%M-%S` ./ --exclude=dev --exclude=proc --exclude=run --exclude=root/.cache/ --exclude=mnt/borgmount --exclude=sys --exclude=tmp && cd
Tienes que sustituir PASSWORD por la contraseña de tu repositorio borg, sustituir BACKUPHOSTNAME por el nombre de tu servidor de copias de seguridad y, por último, ajustar los patrones de exclusión a tus necesidades: quizá quieras añadir –exclude=mnt para excluir el directorio /mnt de la copia de seguridad. Guarda el archivo en el editor nano pulsando Ctrl+O, y luego sal con Ctrl+X.
A continuación, prueba el script ejecutándolo desde el terminal:
/usr/local/bin/borgbackup.sh
Para programar una copia de seguridad a las 02:00 cada noche, añade el script de copia de seguridad que acabamos de crear a /etc/crontab :
nano /etc/crontab
A continuación, añade una nueva línea al crontab con el trabajo de copia de seguridad:
# Backup via Borg to backup server
00 02 * * * root /usr/local/bin/borgbackup.sh
4 Restaurar archivos (mientras estás conectado al servidor principal)
4.1 Mostrar una lista de las copias de seguridad realizadas
No tienes un sistema de copias de seguridad que funcione hasta que hayas comprobado que puedes restaurar los datos de tus copias de seguridad. Por lo tanto, nuestro siguiente paso es comprobar la copia de seguridad que hicimos anteriormente. Esto se hará desde el terminal raíz del servidor principal. Lo haremos montando el archivo de la copia de seguridad como un sistema de archivos adicional, pero antes comprobaremos la lista de las copias de seguridad realizadas creando un script de shell como usuario root en tu servidor principal:
touch /usr/local/bin/borglist.sh
chmod go-rwx /usr/local/bin/borglist.sh
chmod u+rwx /usr/local/bin/borglist.sh
nano /usr/local/bin/borglist.sh
Introduce lo siguiente en el nuevo script de shell, sustituyendo PASSWORD por la contraseña de tu repositorio borg, y BACKUPHOSTNAME por el nombre de host de tu servidor de copias de seguridad:
#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
borg list -v borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/
Guarda el archivo con Ctrl+O seguido de Ctrl+X. A continuación, ejecuta el script de shell de esta manera:
/usr/local/bin/borglist.sh
Ahora deberías ver una lista de las copias de seguridad que se han hecho. Si se ha realizado la primera copia de seguridad, deberías ver un elemento en la lista. Ahora marca y copia el nombre del archivo en el portapapeles. Encontrarás el nombre del archivo en la primera columna, que se compone del nombre del host de tu servidor principal seguido de una fecha y una hora, en este formato: mainhostname-2019-01-31-12-59-59 .
3.4 Verificar/restaurar datos
Ahora montaremos todo el repositorio borg como un montaje del sistema de archivos FUSE. Esto significa que el repositorio borg -incluyendo todos los archivos de los que se ha hecho una copia de seguridad- se convierte en un sistema de archivos, que podemos recorrer e inspeccionar mediante comandos normales como ls y cd.
Para poder montar fácilmente el repositorio borg, crearemos un acceso directo a los comandos en forma de script de shell. Crea y edita el script de shell de esta manera:
touch /usr/local/bin/borgmount.sh
chmod go-rwx /usr/local/bin/borgmount.sh
chmod u+rwx /usr/local/bin/borgmount.sh
nano /usr/local/bin/borgmount.sh
A continuación, inserta las siguientes líneas en el script de schell, pero antes cambia CONTRASEÑA por la contraseña de tu repositorio borg y cambia BACKUPHOSTNAME por el nombre de host de tu servidor de respaldo:
#!/bin/sh
mkdir -p /mnt/borgbackup
export BORG_PASSPHRASE='PASSWORD'
borg mount borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/ /mnt/borgbackup
Guarda el archivo con Ctrl+O seguido de Ctrl+X. A continuación, ejecuta el script de shell de esta manera:
/usr/local/bin/borgmount.sh
El repositorio borg debería estar ahora montado en /mnt/borgbackup – puedes comprobarlo utilizando cd y ls:
cd /mnt/borgbackup
ls
Ahora deberías ver un directorio en el que reside tu copia de seguridad. Entra en ese directorio con cd (sustituye DIRECTORYNAME por el nombre del directorio que veas mostrado como resultado del comando ls que acabas de introducir) y luego utiliza ls para ver el contenido:
cd DIRECTORYNAME
ls
Ahora podrás ver el último archivo (la última copia de seguridad realizada). Puedes comparar con diff que un archivo ha sido respaldado correctamente, por ejemplo para /etc/fstab, con este comando:
diff etc/fstab /etc/fstab
Si no obtienes ninguna salida de diff, los dos archivos son idénticos y la copia de seguridad ha funcionado para ese archivo. Si, por el contrario, has cambiado el archivo desde la última copia de seguridad, verás qué líneas de los archivos difieren.
Si quieres puedes restaurar los archivos desde la copia de seguridad, simplemente utilizando el comando cp para copiar los archivos del subdirectorio de /mnt/borgbackup en el que te encuentres en el terminal en este momento.
Por último, crearemos un script para desmontar el montaje del fusible borg.
Crea y edita el script de shell de esta manera:
touch /usr/local/bin/borgumount.sh
chmod go-rwx /usr/local/bin/borgumount.sh
chmod u+rwx /usr/local/bin/borgumount.sh
nano /usr/local/bin/borgumount.sh
A continuación, inserta las líneas que aparecen a continuación en el script schell:
#!/bin/sh
cd ~
umount /mnt/borgbackup
rmdir /mnt/borgbackup
Guarda el archivo con Ctrl+O seguido de Ctrl+X. A continuación, ejecuta el script de shell de esta manera:
/usr/local/bin/borgumount.sh
El montaje del fusible borg está ahora desmontado y se ha colocado en el directorio /root/ en la terminal.
4 Depurar las copias de seguridad antiguas (requiere acceso tanto a la copia de seguridad como al servidor principal)
Ahora tenemos que alternar entre el servidor de copia de seguridad y el servidor principal. Primero, empezamos con los comandos en el servidor de copia de seguridad.
Después de un tiempo, el tamaño de las copias de seguridad puede aumentar. Por razones de seguridad, no está permitido que el servidor principal elimine automáticamente las copias de seguridad antiguas. Sin embargo, podemos permitir temporalmente la eliminación de archivos de copia de seguridad antiguos cuando sea necesario, para ahorrar espacio en el disco del servidor de copias de seguridad.
Este proceso de eliminación se denomina podar en la terminología borg. El proceso de poda comienza en el servidor de copias de seguridad, permitiendo el acceso temporal de lectura y escritura. A continuación, nos conectamos al servidor principal para emitir la orden de poda. Por último, accedemos de nuevo al servidor de copias de seguridad para deshabilitar el acceso de lectura-escritura, de modo que las copias de seguridad antiguas queden protegidas contra el borrado o la modificación de nuevo.
4.1 Permitir el acceso temporal de lectura+escritura (hecho desde el servidor de copias de seguridad)
Ahora vamos a trabajar en el servidor de copias de seguridad.
Por tanto, conéctate al servidor de copias de seguridad e inicia sesión como root. Para permitir el acceso de lectura+escritura necesitamos cambiar el archivo /home/borgbackup/.ssh/authorized_keys en el servidor de copia de seguridad. Emite estos comandos para convertirte en el usuario borgbackup, haz una copia de seguridad del archivo y luego edita el archivo con nano:
su borgbackup
cd
cp -a ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak
nano ~/.ssh/authorized_keys
Ahora, en el editor nano deberías ver una línea larga que empieza por from= . Corta la línea pulsando Ctrl+K y luego pulsa Ctrl+U, y de nuevo Ctrl+U para que tengas ahora dos líneas idénticas. Pulsa la tecla Arriba de tu teclado dos veces para situar el cursor en la primera línea. A continuación, escribe un carácter # para comentar la primera línea. A continuación, pulsa la tecla Abajo de tu teclado para llegar a la segunda fila. Aquí, deberás desplazarte hacia la derecha con la tecla Derecha de tu teclado hasta situarte en la primera – en –apéndice. A continuación, pulsa repetidamente la tecla Supr para eliminar la opción –append-only . El archivo debería tener un aspecto aproximado al siguiente, observa que hemos comentado la primera línea y que –append-only se ha eliminado de la segunda línea:
#from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ...
from="SERVERIPADDRESS",command="borg serve --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ..
Guarda el archivo con Ctrl+O y sal con Ctrl+X. Ahora hemos habilitado el acceso de lectura+escritura al repositorio borg.
4.2 Depurar las copias de seguridad antiguas (se hace desde el servidor principal)
Ahora, conéctate al servidor principal en una nueva ventana de terminal como usuario root.
Ahora crearemos un script en el servidor principal para podar (es decir, eliminar) las copias de seguridad antiguas. Crea y edita el script en el servidor principal de la siguiente manera
touch /usr/local/bin/borgprune.sh
chmod go-rwx /usr/local/bin/borgprune.sh
chmod u+rwx /usr/local/bin/borgprune.sh
nano /usr/local/bin/borgprune.sh
A continuación, inserta las líneas de abajo en el script de shell. Luego sustituye CONTRASEÑA por la contraseña de tu repositorio borg y BACKUPHOSTNAME con el nombre de host de tu servidor de copias de seguridad. También tienes que ajustar el número de copias de seguridad antiguas que quieres conservar. En este ejemplo, guardamos 7 copias de seguridad diarias, 4 semanales y 12 mensuales.
#!/bin/sh
export BORG_PASSPHRASE='PASSWORD'
borg prune --stats --progress borgbackup@BACKUPHOSTNAME:/home/borgbackup/borgbackup/ --prefix `hostname`- --keep-daily=7 --keep-weekly=4 --keep-monthly=12
Pulsa Ctrl+O y Ctrl+X para guardar y salir del archivo. A continuación, ejecuta el script de poda que acabas de crear en el servidor principal:
/usr/local/bin/borgprune.sh
Este comando tardará un rato (puede ser hasta un par de horas), pero puedes ver el progreso que hace por el camino, en dos pasadas para llegar al 100%.
4.3 Deshabilitar el acceso de lectura+escritura (hecho desde el servidor de respaldo)
Ahora volvemos a trabajar en el servidor de copias de seguridad.
Una vez finalizado el comando prune en el servidor principal, conéctate ahora al servidor de copia de seguridad como usuario borgbackup y edita de nuevo el archivo /home/borgbackup/.ssh/authorized_keys para no permitir el acceso de lectura+escritura.
Haz lo mismo en el servidor de copia de seguridad:
su borgbackup
cd
nano ~/.ssh/authorized_keys
En el editor nano, quita el carácter # del principio de la primera fila pulsando la tecla Supr de tu teclado. Después, pulsa la tecla Abajo e inserta un nuevo carácter # en la segunda línea. Después de esto, el archivo debería tener más o menos este aspecto:
from="SERVERIPADDRESS",command="borg serve --append-only --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ...
#from="SERVERIPADDRESS",command="borg serve --restrict-to-path /home/borgbackup/borgbackup/",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh ... (the line continues) ..
Guarda el archivo con Ctrl+O y sal con Ctrl+X. Ahora hemos desactivado el acceso de lectura y escritura al repositorio borg.
Ahora las copias de seguridad pueden continuar como de costumbre, de forma apendicular, y estás protegido de los intentos de borrado desde el servidor principal dirigidos a las copias de seguridad almacenadas en el servidor de copia de seguridad.
4.4 Observaciones finales
Ahora has creado un sistema de copias de seguridad que está fuera de las instalaciones y es de sólo apéndice. Esto significa que las copias de seguridad están protegidas de dos maneras. En primer lugar, las copias de seguridad están protegidas en el sentido de estar físicamente separadas del servidor principal. En segundo lugar, y por último, las copias de seguridad ya realizadas están protegidas de los intentos de alteración desde el servidor principal (excepto cuando decidas explícitamente alterarlas mediante una poda manual).