Copias de seguridad remotas con rsync

Objetivos

La idea de este apartado, es hacer copias de seguridad periódicas (usando tareas de cron) remotas desde un cliente (en este caso mi portátil personal) a un servidor con Ubuntu Intrepid.
Para hacer las copias de seguridad, utilizaremos el comando rsync (el mismo que utilizo habitualmente para hacer las copias de los ficheros de configuración del servidor a un disco externo) pero de forma remota. Para ello, debemos acceder "remotamente" desde el servidor al cliente a través de ssh mediante un usuario conocido (staffadm en este caso) y sin contraseña, ya que queremos un proceso automático.
Para ello, lo primero es habilitar el acceso ssh sin contraseña al cliente.

En primer lugar, debemos tener el usuario que hará las copias (staffadm) creado en ambos equipos, cliente y servidor. Si no lo está, lo creamos:

$ sudo cat /etc/passwd|grep staffadm

Si no está, lo creamos y lo añadimos al grupo de administradores:
$ sudo adduser staffadmm
$sudo adduser staffadm adm

Accesso ssh sin contraseña al equipo cliente

En el equipo al que vamos a acceder via ssh, debemos instalar el servidor ssh:

$sudo apt-get install openssh-server

En el servidor, y con el usuario con el vamos a hacer las copias de seguridad, generamos las claves RSA para el protocolo sshv2:

$ su - staffadm
staffadm@ushuaia:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/staffadm/.ssh/id_rsa): 
/home/staffadm/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/staffadm/.ssh/id_rsa.
Your public key has been saved in /home/staffadm/.ssh/id_rsa.pub.
The key fingerprint is:
ea:5b:e7:8f:95:e6:6c:5f:f5:63:bd:f7:ad:3c:b5:a4 staffadm@ushuaia.patagonia.es
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|        S       .|
|       .     . .=|
|      . . . + o+=|
|     . . o *.Eoo=|
|      o.  oo+.++=|
+-----------------+

La clave privada está en el servidor en /home/staffadm/.ssh/id_rsa y la pública en /home/staffadm/.ssh/id_rsa.pub.

En el cliente (el portátil), al cual queremos acceder sin contraseña, copiamos la clave pública en el directorio /home/staffadm/.ssh. Es decir, suponiendo que estamos en el cliente (que se llama yamana) con el usuario staffadm, escribimos:

staffadm@yamana:~$ scp staffadm@ushuaia:/home/staffadm/.ssh/id_rsa.pub /home/staffadm/.ssh

y obtenemos algo similar a esto:

The authenticity of host 'ushuaia (192.168.1.10)' can't be established.
RSA key fingerprint is 12:61:9e:ab:dc:7d:9a:b8:c6:b4:d2:73:fc:ce:cf:6d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ushuaia,192.168.1.10' (RSA) to the list of known hosts.
staffadm@ushuaia's password: 
id_rsa.pub                                    100%  411     0.4KB/s   00:00

A continuación añadimos la clave pública del servidor al fichero authorized_keys.

staffadm@yamama:~$ cd /home/staffadm/.ssh
staffadm@yamama:~$ cat id_rsa.pub >/home/staffadm/.ssh/authorized_keys

Comprobamos los permisos para el directorio .ssh y el fichero de claves autorizadas, que deben estar como sigue:

staffadm@yamama:~$ chmod 700 /home/staffadm/.ssh
staffadm@yamama:~$ chmod 600 /home/staffadm/.ssh/authorized_keys

Una vez hecho esto, ya podemos acceder desde el servidor al cliente del que haremos las copias remotas:

staffadm@ushuaia:~$ ssh staffadm@yamana
staffadm@ushuaia:~$ uname -a

Scripts de copias de seguridad

Una vez verificado que podemos acceder remotamente (via ssh) al cliente, sin necesidad de utilizar ningún password, con el usuario staffadm, es hora de crear los scripts de backup.

Accedemos al servidor con el usuario staffadm (o hacemos un sudo a ese usuario suponiendo que estamos con el root.

$ su - staffadm

Y, con nuestro editor favorito (vi), creamos el fichero rsync-cyamana.cron

$ vi rsync-cyamana.cron

Este fichero tiene el siguiente contenido:

#!/bin/bash
set -x

##########################################################
# Descripcion: Script para hacer backup de los ficheros de
# del home de yamana
# Autor: Javier Polo Cozar
# Fecha de Creación: 26/12/08
##########################################################

# Directorio donde almacenaremos la copia de seguridad

HOST=Yamana
RUTA_DEST=/media/hd500GB/Ubuntu/Backups/$HOST
LOG=/home/staffadm/rsync-backup-$HOST.log
TODAY=`date`
RSYNC=`which rsync`
PARM="-a --verbose --stats --recursive --times --perms --links --delete --delete-excluded"
CAT=`which cat`
rm -f $LOG

echo -e "\n**** Salvaguardia de ficheros de /home/jpcozar/scripts ****\n" >> $LOG
$RSYNC $PARM -e ssh staffadm@yamana:/home/jpcozar/scripts $RUTA_DEST >> $LOG
echo -e "\n**** Finalizado backup de /home/jpcozar/scripts****\n" >> $LOG
echo -e "\n**** Salvaguardia de /home/jpcozar/Documentos-Javi****\n" >> $LOG
$RSYNC $PARM --exclude='Fotos_Imagenes/' -e ssh staffadm@yamana:/home/jpcozar/Documentos-Javi $RUTA_DEST >> $LOG

echo -e "\n**** Salvaguardia de /home/jpcozar/Paquetes****\n" >> $LOG
$RSYNC $PARM -e ssh staffadm@yamana:/home/jpcozar/Paquetes $RUTA_DEST >>$LOG

# Envío de correo informativo
###############################################################
$CAT $LOG|mail -s "Backup de Yamana - Rsync, creado el $TODAY" \
jpcozar@ushuaia.patagonia.es

exit 0

Como vemos, establecemos las variables: equipo origen, ruta de destino, fichero de logs, fecha de backup, ruta de los comandos a utilizar, parámetros de rsync y en mi caso, del directorio /home/jpcozar, hago copias de seguridad de:

  • Del directorio de scripts
  • De mis documentos
  • Del directorio paquetes

Cuando he terminado, me envío por correo eléctronico el resultado de dicho backup. Porque en este servidor también está configurado un servidor de correo, el cual se explica como configurarlo aquí

Programación vía crontab

Una vez que tenemos todo funcionando, es hora de automatizarlo. Para ello ejecutamos lo siguiente:

$ sudo crontab -e

Y se nos abrirá el fichero de crontab. Si queremos que nos mande un correo cada vez que se ejecuta el crontab (lo cual es bueno, por lo menos al principio, hasta que veamos que la tarea se ejecuta periódicamente, añadimos lo siguiente:

SHELL=/bin/bash
MAILTO=<cuenta@dominio>

1 0 * * * /home/staffadm/rsync-cyamana.cron

Lo cual ejecutará todos los días a las 00:01 de la noche el script que reside en /home/staffadm/rsync-cyamana.cron y nos enviará dos correos: uno diciendo que la tarea se ha ejecutado y otro el propio que manda el script.


Referencias

http://linuxupc.upc.es/~kampa/blog/gnulinux/acceso-ssh-sin-contrasena/

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License