BackupPC: sobre máquinas internas

18 Oct

Pues sí, me ha tocado jugar con ello y al final he conseguido que funcione.

Siendo BackupPC un sistema de copias de seguridad activo (abre una conexión y extrae datos) no siempre es fácil conseguir que se conecte a servidores internos en una red privada. Sí, se puede crear una VPN y acceder al servidor empleándola, pero como en mi caso pueden llegar a ser tres redes privadas diferentes he preferido el viejo método de conectar vía SSH, uno de los programas más versátiles que he visto nunca para accesos seguros a lugares muy, muy lejanos. Bueno, y también a los cercanos, pero la entrada no va de eso.

Primero el esquema y luego las explicaciones:

Como puede verse tengo un servidor en casa que se encarga de estos menesteres y que cuando la máquina cliente tiene acceso directo desde la red no presenta dificultad alguna. Se conecta y ya.

Pero en nuestro caso tenemos que hacer copia de un servidor (server1.empresa.net) que no tiene acceso SSH directo. La única ventaja que presenta es que su nombre está registrado como alias (tipo CNAME) en el DNS público de empresa.net. Y aquí la ventaja es que el programa backuppc puede comprobar si está vivo empleando paquetes ICMP (el ping de toda la vida) aunque en realidad lo está haciendo con empresa.net y no con server1. Pero para nuestro propósito es más que suficiente.

He enfocado la tarea en tres partes:

  • Acceso desde backup.home a server1.empresa.net
  • Empleo de usuario restringido en server1.empresa.net
  • Retoques en configuración de copia de seguridad en backup.home

Acceso desde backup.home a server1.empresa.net

En BackupPC el acceso a los clientes lo lleva a cabo su propio usuario (backuppc), por lo que tiene que ser él el habilitado para acceder a las máquinas con el suficiente nivel de acceso para leer los archivos.

Como tenemos que emplear una máquina puente para acceder no nos queda otra que enviarles a ambas nuestra identidad. Empleamos para ello una cuenta local (osr, operador de sistema remoto, mi favorita) y transferimos nuestra clave pública.

backuppc@backup.home $ ssh-copy-id -i ~/.ssh/id_rsa osr@empresa.net 
osr@empresa.net' password: xxx
backuppc@backup.home $ ssh-copy-id -i ~/.ssh/id_rsa -o ProxyJump=empresa.net osr@server1.empresa.net
osr@server1.empresa.net' password: xxx

Así que ya tenemos acceso directo a server1 y podemos facilitarlo un poco más todavía si editamos el archivo de configuración:

backuppc@backup.home $ cat > ~/.ssh/config 
Host empresa.net
User osr
IdentityFile ~/.ssh/id_rsa

Host server1
User osr
IdentityFile ~/.ssh/id_rsa
ProxyJump  empresa.net
^D

Empleo de usuario restringido en server1.empresa.net

Lo habitual es que sea el usuario root el que se utilice para las copias de seguridad dado que él tiene acceso a todo, o al menos a todo lo que nos interesa. Pero existe una forma de conseguir con facilidad que sea otro el que se utilice.

BackupPC utiliza en el lado cliente el programa rsync para leer los datos (y también para restaurarlos) así que con que se pueda ejecutar con permisos administrativos es más que suficiente.

Si creamos un perfil para sudo en la máquina cliente en un archivo como /etc/sudoers.d/backuppc-remote:

#
#       Configuración para que osr sea cliente para backuppc remoto
#
Defaults        env_keep += MAINTAINER

osr     ALL=NOPASSWD: /usr/bin/rsync --server *

Podremos emplear el programa osr -al que ya tenemos acceso- para efectuar la copia de seguridad. En caso de tener dudas después de crear el archivo basta con hacer lo siguiente para saber si podremos emplearlo o ha habido algún error:

osr@server1.empresa.net $ sudo -l
Matching Defaults entries for osr on erp:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
    env_keep+=MAINTAINER

User osr may run the following commands on erp:
    (ALL : ALL) ALL
    (root) NOPASSWD: /usr/bin/rsync --server *
osr@server1.empresa.net $ 

Retoques en configuración de copia de seguridad en backup.home

En el servidor de copias se deben cambiar algunas cosas, bien empleando el interfaz web, bien retocando el archivo de configuración correspondiente en /etc/backuppc/server1.empresa.net.pl. Los parámetros clave son los siguientes (código fuente Perl):

$Conf{PingMaxMsec} = 100;
$Conf{RsyncClientPath} = 'sudo /usr/bin/rsync';
$Conf{RsyncSshArgs} = [
  '-e',
  '$sshPath -l osr'
];
  • Asegurar que el tiempo de respuesta de los paquetes ping es lo bastante alto como para que se pueda iniciar la copia.
  • El programa cliente se debe llamar directamente con sudo.
  • La cuenta de acceso al sistema remoto no es root (como valor predeterminado) si no osr que es la que hemos configurado antes.

Rendimiento

El rendimiento no es malo. En mi caso el servidor es bastante monstruoso para mis estándares y la copia inicial se ha cortado en media docena de ocasiones. No ha importado porque BackupPC ha vuelto a intentarlo un tiempo más tarde y ha seguido y seguido hasta que lo ha conseguido.

Ahora me queda conseguir que el resto de los servidores (server2 y server3) tengan el mismo tratamiento. Como ninguna de las dos tiene un registro CNAME y no pretendo crearlo quizás sea más complicado. Uno de los mayores defectos que le veo al programa es que está diseñado inicialmente para realizar copias de máquinas Windows y eso implica que utiliza NetBIOS para localizarlas y hay que forzarlo un poco para que se deje de tonterías y haga caso de SSH directamente.