Copias de seguridad con SSH

Realizar copias de seguridad es importante. Yo lo que tengo son varios servidores con sus datos que envían su backup a un servidor central, el cual, cuando las recibe toda pues las graba en un NAS externo, en cintas, o en lo que sea.

Esto implica que los diversos servidores (windows y linux) necesitan comunicarse con el servidor central (linux). Yo lo hago manualmente con ssh. Veamos como lo hacemos en linux (en windows con winscp va de coña):
1. Crear el conjunto de claves de encriptación de ssh para el emisor 

El servidor que tiene los datos los empaqueta y los envia al servidor central. En este servidor hacemos:

ssh-keygen -t rsa

Dejamos el nombre por defecto (.ssh/id_rsa) y sin passphrase. Esto nos crea en el directorio .ssh los archivos id_rsa y id_rsa.pub

2. Copiar la llave publica al servidor de destino

Para que el servidor central de copias autentifique al servidor emisor es necesario que en su .ssh/authorized_keys tenga la llave publica del emisor. Lo podemos hacer así desde el propio servidor emisor:

$emisor> cat .ssh/id_rsa.pub | ssh copia@10.0.0.6 'cat >> .ssh/authorized_keys'

es necesario, claro, que el servidor receptor ya tenga creado el directorio .ssh en el usuario copia (en este caso).

A partir de ahora el servidor emisor ya puede acceder sin pass como usuario copia en el servidor central.

3. Ejemplo script de copia
#!/bin/bash

data=$(date +%F)

#borrem el contingut del directori desti
ssh copia@10.0.0.6 "rm -rf documents/*.tar.bz2"

#copiem els privados
for i in `ls /home`; do
   num=$(find "/home/$i" -mtime -1 | wc -l)

   if [ $num -gt 0 ]; then
      tar --bzip2 -cvf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.tar.bz2"
   fi

done


4. Rsync


Rsync es un programilla que sincroniza directorios ya sean locales o remotos. Para mi caso es suficiente hacer lo siguiente para mantener toda una estructura de directorios copiada remotamente.

rsync -arvz --delete origen/ user@servidor-remoto:/path/

Funciona francamente bien cuando los directorios no cambian mucho, por lo que entonces lo que se ha mantenido inalterable no hace falta copiarlo y por tanto ahorramos ancho de banda y tiempo.
Ojo! con la barrita final del directorio origen


5. Copias incrementales


En el punto 3 es un script ineficiente desde el punto de vista que si algo se modifica comprime todo el directorio y lo envia al server de copias y si no se modifica nada (fines de semana) se ahorra el paso. PERO, por otro lado puede existir un script que se cargue los backups muy viejos (el espacio es limitado) cosa que como resultado puede provocar que con el paso del tiempo y un directorio no se modifique.... se pierda.

  1. Modificar el script de limpieza que guarde almenos 1 semana
  2. hacer un full backup el lunes y el resto de días una copia incremental de la copia del lunes.
#!/bin/bash

SPOOL="/var/spool/copia"
data=$(date +%F)
dia=$(date +%u)
FULLDAY=2
OK=0
MAIL=""

# Existe la spool?
if [ ! -d $SPOOL ]; then
  mkdir -p "$SPOOL"
fi

# si es el dia de FULL -> borramos los .snar
if [ $dia -eq $FULLDAY ]; then
   find $SPOOL -iname "*.snar" -exec rm -f '{}' \;
   find $SPOOL -iname "*.1" -exec rm -f '{}' \;
fi

#borrem el contingut del directori desti
ssh copia@10.0.0.6 "rm -rf documents/*.tar.bz2"

#copiamos los privados
for i in `ls /home`; do

   # si es el dia FULL -> FULL backup
   if [ $dia -eq $FULLDAY ]; then
      tar -g "$SPOOL/$i.snar" --bzip2 --ignore-failed-read -cf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.full.tar"
      OK=$?
      echo "FULL OK: $OK - $?"
      cp "$SPOOL/$i.snar" "$SPOOL/$i.snar.1"
   # sino -> INCREMENTAL
   else
      cp "$SPOOL/$i.snar.1" "$SPOOL/$i.snar"
      tar -g "$SPOOL/$i.snar" --bzip2 --ignore-failed-read -cf - /home/$i | ssh copia@10.0.0.6 "cat > documents/$data-$i.incr.tar"
      OK=$?
      echo "INCR OK: $OK - $?"
   fi

   echo "OK: $OK "

   if [ $OK -ne 0 ]; then
      MAIL=$MAIL"\n$(date +%T) $i -> NOT OK"
   else
      MAIL=$MAIL"\n$(date +%T) $i -> ok"
   fi

done

echo -e "$MAIL" | mail -r root@dataserver -s "[DATASERVER] backup" admin@example.org

Comentarios