Backup de un servidor remoto con rsnapshot y ubuntu sin usar root

En un post anterior expliqué cómo utilizar rsnapshot para realizar copias de seguridad. En esta ocasión voy a explicar cómo utilizar esta herramienta para realizar copias de seguridad de un servidor remoto. Si los equipos están en la misma red podríamos utilizar NFS exportando el filesystem remoto (con no_root_squash para no tener problemas con los permisos) y montándolo en el equipo en el que querríamos realizar el backup, sin embargo en la mayoría de ocasiones esta solución no será factible. Para estas situaciones, rsnapshot permite realizar backups de equipos remotos utilizando rsync sobre una conexión ssh. Para ello requiere instalar la clave pública del usuario que realiza el backup en el servidor remoto. Como la mayoría de las veces querremos hacer las copias de seguridad con el usuario root, esto plantea un problema en sistemas como Ubuntu, en lo que no está habilitada la conexión con este usuario. La solución más sencilla es habilitar esta cuenta, sin embargo existe una alternativa relativamente sencilla y mucho más segura.

Vamos a llamar “almacén” al servidor que realiza la copia de seguridad y “servidor” al equipo que contiene los datos que queremos copiar. La solución que vamos a ver se basa en disponer de un usuario auxiliar (rbackup) en ambos equipos y realizar la conexión ssh utilizando su clave pública. Cuando se ejecute rsnapshot desde “almacén” como root, se conectará a “servidor” utilizando el usuario rbackup, y se realizará un sudo para ejecutar rsync como root en “servidor”.

Conexión ssh entre los equipos

Como primer paso, crearemos el usuario rbackup en ambos equipos y le asignaremos una contraseña. Primero en “almacén”.

user@almacen$ sudo useradd -d /home/rbackup --system -m rbackup -U -s /bin/bash
user@almacen$ sudo passwd rbackup

Y a continuación en “servidor”.

user@servidor$ sudo useradd -d /home/rbackup --system -m rbackup -U -s /bin/bash
user@servidor$ sudo passwd rbackup

A continuación tenemos que generar la clave pública del usuario en “almacén” y copiarla en “servidor”. Para ello, desde el equipo “almacen”, primero pasamos a usuario rbackup (nos pedirá la contraseña) y generamos la clave.

user@almacen$ su - rbackup
rbackup@almacen$ ssh-keygen -t rsa

Ahora hay que copiar la clave generada a “servidor”. Para ello hacemos uso del comando ssh-copy-id, indicándole que queremos copiarla en “servidor”, con el usuario “rbackup”. Con este comando, la clave se añadirá al archivo “.ssh/authorized_keys” del usuario.

rbackup@almacen$ ssh-copy-id -i /home/rbackup/.ssh/id_rsa.pub rbackup@servidor

Ahora ya podemos probar si hemos creado bien la conexión. Estando en “almacén” como usuario rbackup, si hacemos ssh a “servidor”, deberíamos acceder sin que nos pidiera la contraseña.

rbackup@almacen$ ssh servidor

Si tenemos problemas para acceder, tendremos que comprobar la configuración de ssh en el servidor. Por ejemplo, en el caso de que ssh esté configurado con la directiva AllowUsers en /etc/ssh/sshd_config, deberemos añadir el usuario rbackup a la lista de usuarios y reinicar sshd.

Configuración del equipo “servidor”

Para configurar el equipo “servidor”, comenzaremos conectándonos a él y pasando a ser el usuario rbackup.

user@servidor$ su - rbackup

Para hacer que la conexión sea más segura, vamos a hacer que cuando se conecte el usuario rbackup por ssh utilizando la clave pública generada, se compruebe la dirección ip desde la que se conecta, y se ejecute automáticamente un comando de validación, que comprobará que quien se está conectando es rsync a través de ssh. Para ello editaremos el archivo .ssh/authorized_keys del usuario rbackup.

El archivo comenzará con “ssh-rsa”, y deberemos poner antes, en la misma línea, la dirección ip desde la que vamos a aceptar conexiones (la ip de “almacen”) y el path del comando de validación.

from="192.168.1.24",command="/home/rbackup/validate_rsync.sh" ssh-rsa …...

A continuación crearemos el archivo de validación “validate_rsync.sh” en la carpeta del usuario con el siguiente contenido:

#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
  *\&*)
    echo "Connection closed"
    ;;
  *\;*)
    echo "Connection closed"
    ;;
    rsync*)
    $SSH_ORIGINAL_COMMAND
    ;;
  *true*)
    echo $SSH_ORIGINAL_COMMAND
    ;;
  *)
    echo "Connection closed."
    ;;
esac

Le damos permisos de ejecución.

rbackup@servidor$ chmod 764 validate_rsync.sh

De nuevo como un usuario normal del equipo “servidor”, tenemos que permitir que el usuario rbackup haga sudo. Como únicamente va a requerir ejecutar rsync, lo indicaremos en el archivo /etc/sudoers, así como que no se le pida la contraseña al hacer sudo. Para ello editamos el archivo /etc/sudoers.

user@servidor$ sudo vi /etc/sudoers

Y añadimos la siguiente línea al final del archivo.

rbackup	ALL=NOPASSWD:/usr/bin/rsync

Ya solo nos queda crear un wrapper para rsync, de manera que cuando el usuario rbackup se conecte para realizar rsync, utilice este wrapper e internamente se realice el sudo, pasando a ejecutarse rsync como usuario root.

user@servidor$ sudo vi /usr/local/bin/rsync_wrapper.sh
#!/bin/sh
/usr/bin/sudo /usr/bin/rsync "$@";

Y le asignamos permisos de ejecución.

user@servidor$ sudo chmod 755 /usr/local/bin/rsync_wrapper.sh

Con estos pasos ya tenemos el equipo “almacén” listo para aceptar conexiones y realizar las copias.

Configuración del equipo “almacén”

Conectados como un usuario normal (sin ser rbackup) que pueda realizar sudo, vamos a configurar una conexión para el usuario root, de manera que utilice la información del usuario rbackup. Para ello lo primero es crear la carpeta .ssh en el usuario root.

user@almacen$ sudo -i
root@almacen# cd /root
root@almacen# mkdir .ssh
root@almacen# chmod 700 .ssh
root@almacen# cd .ssh

A continuación crearemos un archivo “config” dentro de la carpeta (vi config), con el siguiente contenido.

Host servidor-rsync
  Port 22
  Hostname servidor
  User rbackup
  IdentityFile /home/rbackup/.ssh/id_rsa

Esta configuración crea un alias “servidor-rsync”, de manera que cada vez que el usuario root quiera hacer ssh indicando este alias, se creará una conexión al puerto 22 del equipo “servidor”, utilizando el usuario rbackup y la clave pública generada.

Podemos comprobar si la conexión está correctamente podemos tratar de realizar una conexión ssh indicando el alias. Sin pedirnos contraseña, debería indicarnos “Connection closed.”, que es lo que nos devuelve como respuesta el script “validate_rsync.sh” al detectar que no estamos intentando hacer rsync.

root@almacen# ssh servidor-rsync
Connection closed.
Connection to servidor closed.

Si esta prueba ha sido satisfactoria, ya podemos probar a realizar rsync de alguna carpeta restringida de “servidor”, por ejemplo “/etc”. Haremos la prueba como usuario root en “almacén”, ya que éste es el usuario que realiza el rsync desde rsnapshot.

root@almacen# rsync -ae ssh --rsync-path='rsync_wrapper.sh' servidor-rsync:/etc /home/user/tmp/

Si todo ha ido bien, debería haberse creado una carpeta de nombre “tmp” en en usuario “user”, con el contenido de “/etc” en “servidor”. Asegúrate de sustituir el alias (servidor-rsync) y el nombre del usuario al hacer las pruebas, indicando los que correspondan en tu caso.

Llegados a este punto ya solo queda configurar rsnapshot para que realice la copia de las carpetas que se desee de “servidor”. Suponiendo que queramos copiar únicamente la carpeta /etc, crearemos la siguiente entrada:

backup	rbackup@servidor-rsync:/etc	hydra/	localhost/

Es necesario configurar también el parámetro de configuración rsync_long_args para indicar a rsync que utilice el wrapper al conectar (sudo vi /etc/rsnapshot.conf).

rsync_long_args --rsync-path=rsync_wrapper.sh --delete --numeric-ids --relative --delete-excluded

Ten en cuenta que si vas a hacer copias de carpetas locales o de otros servidores, la configuración del wrapper no tiene porqué ser válida para estos casos, por lo que deberías dejar el valor de configuración sin modificar, e incluir estos parámetros en la línea de backup.

backup	rbackup@servidor-rsync:/etc	hydra/	localhost/	rsync_long_args=--rsync-path=rsync_wrapper.sh --delete --numeric-ids --relative --delete-excluded

El siguiente paso es comprobar que la configuración es correcta, por

user@almacen$ rsnapshot configtest
Syntax OK

Y ya podemos realizar copias lanzándolas desde línea de comandos o /etc/cron.d/rsnapshot.

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

Los comentarios están cerrados.