Backups remotos con rsync a través de ssh sin contraseña

“Si la copia de seguridad se hace, y además está correcta, en el momento que sea necesario hacer uso de ella fallará el soporte donde se haya hecho”

Lo dice una ley de Murphy, y efectivamente, me ha pasado… Y como de sabios es rectificar (depurar, que diría un servidor), aquí tenemos esta entrada en el blog.

En una entrada anterior vimos como hacer un backup de las partes que nos interesaran de un sistema (ver aquí), y al final dejaba como posibilidad el poder enviar los backups a un servidor SFTP o similar. Pues en esta entrada vamos a ver como hacerlo.

Tenemos dos sistemas, el Cliente, del que queremos hacer la copia de seguridad, y enviarla de forma segura y automática al Servidor. Una herramienta muy útil para esto es rsync, ya que nos compara los ficheros en origen y en destino y solo envía los cambios hacia el destino, con los ahorros de ancho de banda que ello implica. En la entrada que os comentaba arriba, veíamos como hacer copia de todo el sistema a nivel de sistema de archivos (dispositivo de bloques), como la copia es semanal, los cambios son mínimos (base de datos, gráficas de cacti, logs y poco más) por tanto rsync se ajusta bastante a lo que necesitamos.

Vamos a ello.

Lo primero que necesitamos hacer es crear un usuario en nuestro Servidor (equipo que recibirá las copias a través de rsync/SSH), ya que después lo usaremos para logearnos desde el equipo Cliente y enviar la información (no conviene usar el usuario root, por motivos obvios de seguridad). Luego crearemos las carpetas donde ese usuario tendrá permiso de escritura, y finalmente crearemos el certificado (clave pública y clave privada, en realidad el cliente usará la clave privada para acceder al servidor y éste la clave pública para verificarla) con el que ese usuario se podrá logear en el Servidor, desde el Cliente, a través de SSH:

clienteservidor

En el Servidor

root@servidor:~# addgroup jdomo
Adding group `jdomo` (GID 1003) ...
Done.
root@servidor:~# adduser --ingroup jdomo jdomo
Adding user `jdomo` ...
Adding new user `jdomo` (1003) with group `jdomo` ...
Creating home directory `/home/jdomo` ...
Copying files from `/etc/skel` ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jdomo
Enter the new value, or press ENTER for the default
    Full Name []: Usuario para Backups
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] Y

root@servidor:~# mkdir /mnt/Compartido/jdomo/backup

root@servidor:~# mkdir /mnt/Compartido/jdomo/backup/img

root@servidor:~# chown jdomo:jdomo -R /mnt/Compartido/jdomo/backup

root@servidor:~# ls -ali /mnt/Compartido/jdomo
total 1444
77332481 drwxr-xr-x 4 root root 4096 Mar 23 21:29 .
2 drwxr-xr-x 8 root root 4096 Mar 18 11:49 ..
77332482 drwxr-xr-x 3 jdomo jdomo 4096 Mar 14 13:26 backup

root@servidor:~#

Ya tenemos el usuario creado, y las carpetas donde almacenaremos los datos que recibamos, con los permisos oportunos dados.

En el Cliente

Una vez creado el usuario en el Servidor, podemos comprobar que el acceso desde el Cliente funciona correctamente, usando la contraseña que le hayamos puesto al usuario jdomo:

root@cliente:~# ssh jdomo@servidor
jdomo@servidor's password:
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.10.80-121 armv7l)
* Documentation:  https://help.ubuntu.com/

33 packages can be updated.
5 updates are security updates.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@servidor:~#

Para poder automatizar el envío de ficheros a través de rsync y ssh necesitamos decirle a nuestro Servidor que con determinado certificado (que crearemos a continuación), vamos a permitir loguearse al usuario jdomo en el sistema, sin necesidad de usar contraseña (en su lugar usará un certificado). Vamos a crearlo, y cuando nos pregunte la passphrase debemos dejarla en blanco (muy importante, si no, al usarlo nos la preguntará, y no es lo que queremos):

root@cliente:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/jdomo_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/jdomo_rsa.
Your public key has been saved in /root/.ssh/jdomo_rsa.pub.
The key fingerprint is:
68:e7:1a:a7:65:7d:90:70:2b:56:21:59:ca:12:1a:8e root@cliente
The key`s randomart image is:
+--[ RSA 2048]----+
|    . . .oo      |
|   o o o.o .     |
|  E o . + o      |
|       o + o     |
|      o S +      |
|     . + o .     |
|      . = . .    |
|       B   .     |
|      o          |
+-----------------+

root@cliente:~# ls .ssh/
jdomo_rsa  jdomo_rsa.pub

root@cliente:~# cat .ssh/jdomo_rsa.pub | ssh jdomo@servidor `cat >> .ssh/authorized_keys`
The authenticity of host `servidor (192.168.3.35)` can`t be established.
ECDSA key fingerprint is a2:84:83:8c:49:4d:33:0d:43:1f:d8:9a:b5:8a:fb:6d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added `servidor` (ECDSA) to the list of known hosts.
jdomo@servidor's password:

root@cliente:~#

Ahora solo tenemos que acceder al servidor usando la clave privada (archivo que no acaba en .pub) que nos acaba de generar, y ¡listo!:

root@cliente:~# ssh -i .ssh/jdomo_rsa jdomo@servidor

Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.10.80-121 armv7l)

* Documentation: https://help.ubuntu.com/

Last login: Thu Mar 24 14:33:59 2016 from 192.168.2.216
jdomo@servidor:~$

Con todo esto ya tenemos el login automático del usuario jdomo preparado, solo nos queda enviar los archivos mediante algún comando desde el cliente hacia el servidor, y vivir más tranquilos, sabiendo que tenemos nuestra copia en dos lugares distintos (por si las moscas…).

Enviando nuestro backup con rsync de forma segura

Uno de los modos de envío de ficheros de rsync es a través de un túnel ssh. Suponiendo que tenemos en nuestro equipo Cliente, los archivos de imagen del sistema de archivos en /mnt/Data/backup/img, podemos enviarlos de forma segura mediante el siguiente comando rsync:

root@cliente:~# ls -ali /mnt/Data/backup/img
total 2008896
1332741 drwxr-xr-x 2 root root      4096 mar 23 22:41 .
1320779 drwxr-xr-x 3 root root      4096 mar 24 06:25 ..
1320787 -rw-r--r-- 1 root root 209715200 mar 23 21:29 mmcblk1.img.aa
1320788 -rw-r--r-- 1 root root 209715200 mar 23 21:36 mmcblk1.img.ab
1320789 -rw-r--r-- 1 root root 209715200 mar 23 21:47 mmcblk1.img.ac
1320790 -rw-r--r-- 1 root root 209715200 mar 23 21:58 mmcblk1.img.ad
1320791 -rw-r--r-- 1 root root 209715200 mar 23 22:06 mmcblk1.img.ae
1320792 -rw-r--r-- 1 root root 209715200 mar 23 22:15 mmcblk1.img.af
1320793 -rw-r--r-- 1 root root 209715200 mar 23 22:24 mmcblk1.img.ag
1320794 -rw-r--r-- 1 root root 209715200 mar 23 22:32 mmcblk1.img.ah
1320795 -rw-r--r-- 1 root root 209715200 mar 23 22:41 mmcblk1.img.ai
1320796 -rw-r--r-- 1 root root 169621072 mar 23 22:55 mmcblk1.img.aj

root@cliente:~# rsync -av --progress -e "ssh -i /root/.ssh/jdomo_rsa" \
/mnt/Data/backup/img/mmcblk1.img* jdomo@servidor:/mnt/Compartido/jdomo/backup/img
sending incremental file list
mmcblk1.img.aa
    209,715,200 100%    3.34MB/s    0:00:59 (xfr#1, to-chk=9/10)
mmcblk1.img.ab
    209,715,200 100%    3.28MB/s    0:01:00 (xfr#2, to-chk=8/10)
mmcblk1.img.ac
    209,715,200 100%    3.32MB/s    0:01:00 (xfr#3, to-chk=7/10)
mmcblk1.img.ad
    209,715,200 100%    3.20MB/s    0:01:02 (xfr#4, to-chk=6/10)
mmcblk1.img.ae
    209,715,200 100%    3.26MB/s    0:01:01 (xfr#5, to-chk=5/10)
mmcblk1.img.af
    209,715,200 100%    3.33MB/s    0:01:00 (xfr#6, to-chk=4/10)
mmcblk1.img.ag
    209,715,200 100%    3.29MB/s    0:01:00 (xfr#7, to-chk=3/10)
mmcblk1.img.ah
    209,715,200 100%    3.25MB/s    0:01:01 (xfr#8, to-chk=2/10)
mmcblk1.img.ai
    209,715,200 100%    3.25MB/s    0:01:01 (xfr#9, to-chk=1/10)
mmcblk1.img.aj
    169,621,072 100%    3.13MB/s    0:00:51 (xfr#10, to-chk=0/10)

sent 2,057,560,687 bytes  received 206 bytes  3,432,128.26 bytes/sec
total size is 2,057,057,872  speedup is 1.00

root@cliente:~# rsync -av --progress -e "ssh -i /root/.ssh/jdomo_rsa" \
/mnt/Data/backup/img/mmcblk1.img* jdomo@servidor:/mnt/Compartido/jdomo/backup/img
sending incremental file list

sent 213 bytes  received 12 bytes  150.00 bytes/sec
total size is 2,057,057,872  speedup is 9,142,479.43

Si comparamos con una copia completa normal, con scp, tenemos que la primera copia con rsync y scp tardan más o menos lo mismo, pero las siguientes (si los ficheros originales no varían), con rsync es instantánea, pero con scp no (tarda lo mismo que si no estuvieran los archivos en destino).

root@cliente:~# scp -i /root/.ssh/jdomo_rsa /mnt/Data/backup/img/mmcblk1.img* \
jdomo@192.168.3.35:/mnt/Compartido/jdomo/backup/img
mmcblk1.img.aa                                          100%  200MB   3.3MB/s   01:00    
mmcblk1.img.ab                                          100%  200MB   3.4MB/s   00:59    
mmcblk1.img.ac                                          100%  200MB   3.4MB/s   00:59    
mmcblk1.img.ad                                          100%  200MB   3.3MB/s   01:00    
mmcblk1.img.ae                                          100%  200MB   3.2MB/s   01:03    
mmcblk1.img.af                                          100%  200MB   3.3MB/s   01:01    
mmcblk1.img.ag                                          100%  200MB   3.2MB/s   01:02    
mmcblk1.img.ah                                          100%  200MB   3.3MB/s   01:00    
mmcblk1.img.ai                                          100%  200MB   3.3MB/s   01:00    
mmcblk1.img.aj                                          100%  162MB   3.4MB/s   00:48    

root@cliente:~#

Tan solo nos queda insertar el comando rsync anterior en un archivo, darle permisos de ejecución y ponerlo dentro de /etc/cron.daily para que se ejecute cada día. Si ejecutamos el envío de los archivos al servidor con rsync cada día, pero los archivos los generamos una vez a la semana, nos aseguramos de que se hacen 7 intentos de envío de los archivos entre copia semanal y copia semanal. No esta mal pensado ya que la conexión puede fallar por mil motivos (se corta la conexión de internet, el servidor y el cliente no están activos a la vez, …), y si se hacen varios intentos de copia, si la primera se completa, las siguientes no tardarán nada, ya que los archivos ya estarán en destino (y no se consumirá casi ancho de banda).

Y con esto, ya tenemos el sistema un poco más seguro… o no… jajajajaaaa 🙂

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.