Sistema de copias de seguridad con RAID 1, LUKS y BackupPC en Debian

Instalación de un sistema de copias de seguridad (backup) usando RAID 1, LUKS y BackupPC en el sistema operativo Debian Wheezy.

Instalación de Linux

Para este sistema de copias de seguridad vamos a necesitar tres discos duros (en este ejemplo /dev/sda, /dev/sdb y /dev/sdc). La capacidad del primer disco duro debe ser suficiente para contener el sistema operativo Linux.

Los otros dos discos duros deben tener la misma capacidad, pues serán usados más adelante para crear un conjunto redundante de discos independientes (RAID) donde almacenar las copias de seguridad.

Instalar en el primer disco duro (/dev/sda) el sistema básico de Debian Wheezy y elegir las colecciones

  • Servidor SSH
  • Utilidades estándar del sistema

Después de finalizar la instalación y reiniciar el sistema, entrar como usuario root para continuar con la configuración del servidor.

Nombre del servidor

En este ejemplo el nombre del servidor es backuppc. Ejecutar los comandos

echo "backuppc" > /etc/hostname
hostname -F /etc/hostname

Actualizar los archivos /etc/network/interfaces y /etc/hosts como se muestra abajo. En este ejemplo la dirección IP de la máquina es 192.168.0.98, el nombre del dominio es test.dominio.

Extracto del archivo: /etc/network/interfaces

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 192.168.0.98
        netmask 255.255.255.0
        gateway 192.168.0.1

Extracto del archivo: /etc/hosts

127.0.0.1    localhost
192.168.0.98    backuppc.test.dominio     backuppc

Actualizaciones de software

Instalar las actualizaciones de software disponibles.

aptitude update
aptitude upgrade

Agregarse al grupo sudo

Instalar el paquete sudo.

aptitude install sudo

Agregar su cuenta (usuario creado durante la instalación de Linux) al grupo de administradores del sistema (admin). En este ejemplo el nombre de usuario es debianuser.

usermod -a -G sudo debianuser

Salir del sistema como usuario root.

logout

Conectarse con su nombre de usuario (en este ejemplo debianuser) y comprobar si tiene los derechos de administrador.

sudo bash

De aquí en adelante ya no será necesario conectarse como el usuario root para administrar el sistema.

Conjunto redundante de discos independientes (RAID)

Instalar los paquetes necesarios para crear un conjunto RAID.

aptitude install mailutils mdadm

Durante la instalación de mdadm hay que responder dos preguntas. En la primera hay que introducir los arrays MD (RAIDs) necesarios para arrancar el sistema de ficheros raíz. En este ejemplo vamos a usar el RAID para almacenar nuestras copias de seguridad (backup), por lo tanto, la respuesta correcta es "none".

En la segunda pregunta hay que responder con "Sí" (Yes), pues queremos que mdadm inicie los arrays MD (RAIDs) de forma automática.

Con los dos discos duros restantes (/dev/sdb y /dev/sdc) vamos a crear ahora un RAID de nivel 1  (espejo).

mdadm --create --verbose /dev/md/backup --name=backup --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: size set to 134152064K
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/backup started.

Actualizar el archivo de configuración /etc/mdadm/mdadm.conf para que mdadm sepa cómo montar el RAID cuando el sistema operativo se reinicia. Primero obtenemos la información del RAID activo.

mdadm -Es
ARRAY /dev/md/backup metadata=1.2 UUID=89cda402:69980928:1905db04:3304e8db name=backuppc:backup

Con esa información actualizamos el archivo /etc/mdadm/mdadm.conf como se muestra abajo.

Extracto del archivo: /etc/mdadm/mdadm.conf

DEVICE /dev/sdb /dev/sdc

HOMEHOST backuppc

# definitions of existing MD arrays
ARRAY /dev/md/backup metadata=1.2 name=backup UUID=89cda402:69980928:1905db04:3304e8db

Actualizar el disco RAM inicial y reiniciar la máquina.

update-initramfs -u
reboot

Podemos ver el estado del RAID ejecutando como usuario root el comando

cat /proc/mdstat
Personalities : [raid1]
md127 : active raid1 sdb[0] sdc[1]
      134152064 blocks super 1.2 [2/2] [UU]
      [==>..................]  resync = 10.7% finish=9.9min speed=199607K/sec

Esperar hasta que el RAID haya sido creado.

cat /proc/mdstat
Personalities : [raid1]
md127 : active raid1 sdb[0] sdc[1]
      134152064 blocks super 1.2 [2/2] [UU]

unused devices: <none>

Ver la información detallada del dispositivo nuevo /dev/md/backup.

mdadm --detail /dev/md/backup
/dev/md/backup:
        Version : 1.2
  Creation Time : Wed Feb 26 11:08:13 2014
     Raid Level : raid1
     Array Size : 134152064 (127.94 GiB 137.37 GB)
  Used Dev Size : 134152064 (127.94 GiB 137.37 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Wed Feb 26 11:24:30 2014
          State : active
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : backuppc:backup  (local to host backuppc)
           UUID : 89cda402:69980928:1905db04:3304e8db
         Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Dispositivo cifrado con LUKS

Vamos a crear un dispositivo cifrado con LUKS del RAID /dev/md/backup utilizando la herramienta cryptsetup.

Instalar el paquete cryptsetup.

aptitude install cryptsetup

Cifrar y activar el dispositivo /dev/md/backup usando el formato LUKS y una contraseña como clave de cifrado.

cryptsetup luksFormat /dev/md/backup
WARNING!
========
This will overwrite data on /dev/md/backup irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: ***
Verify passphrase: ***

Activar dispositivo cifrado y asignarle el dispositivo /dev/mapper/backup_crypt.

cryptsetup luksOpen /dev/md/backup backup_crypt

Formatear el dispositivo /dev/mapper/backup_crypt.

mkfs.ext4 -L backup_crypt /dev/mapper/backup_crypt

Verificar la configuración.

tune2fs -l /dev/mapper/backup_crypt

Actualizar el archivo /etc/fstab como se muestra abajo.

Extracto del archivo: /etc/fstab

# Mount backup_crypt
LABEL=backup_crypt    /backup    ext4    defaults,noauto    0    0

Crear el punto de montaje /backup, montar el dispositivo cifrado y verificar la configuración.

mkdir /backup

mount /backup

df /dev/mapper/backup_crypt

Instalación de BackupPC

Instalar BackupPC ejecutando el comando

aptitude install backuppc

Durante la instalación seleccionar el servidor Apache 2 y tomar nota de la clave para el usuario backuppc.

BackupPC utiliza por defecto el directorio /var/lib/backuppc para almacenar las copias de seguridad. Vamos a modificar la configuración para usar en su lugar el dispositivo cifrado montado en /backup. Ejecutar los comandos que siguen.

/etc/init.d/backuppc stop

cp -a /var/lib/backuppc /backup/

mv /var/lib/backuppc /var/lib/backuppc.orig

ln -s /backup/backuppc /var/lib/backuppc

ln -s /backup/backuppc/log /var/log/backuppc

Iniciar BackupPC y verificar si está funcionando con la configuración nueva.

/etc/init.d/backuppc start

tail -f /var/log/backuppc/LOG

Abrir un navegador y comprobar el acceso a la interfaz web http://192.168.0.98/backuppc/ con el usuario backuppc y la clave creada durante la instalación de BackupPC.

Configuración de los clientes

Configuración de un cliente Linux Ubuntu

En este ejemplo vamos a configurar la copia de seguridad automática a través de la red de la carpeta personal de un usuario (ubuntuuser) en una máquina con el sistema operativo Ubuntu (ubuntupc, dominio test.dominio).

Actualizar el archivo /etc/default/rsync para activar el inicio automático de Rsync cuando el sistema operativo se reinicie.

Extracto del archivo: /etc/default/rsync

RSYNC_ENABLE=true

Crear la configuración para la carpeta personal en el archivo /etc/rsyncd.conf como se muestra abajo.

Extracto del archivo: /etc/rsyncd.conf

max connections = 1
log file = /var/log/rsync.log
timeout = 600

[UbuntuuserHomeFolder]
comment = Copia de seguridad de la carpeta personal del usuario
list = false

# Ruta completa de la carpeta personal del usuario
path = /home/ubuntuuser

# Nombre del usuario en esta máquina
uid = ubuntuuser

# Nombre de un usuario ficticio para la conexión desde
# el servidor BackupPC (backuppc.test.dominio).
# El usuario ficticio no debe existir en esta máquina.
auth users = virtualuser

# Archivo que contiene la contraseña para el usuario ficticio
secrets file = /etc/rsyncd.secrets

# Sólo el servidor BackupPC puede tener
# accesso a esta máquina usando rsync
hosts allow = backuppc.test.dominio

Agregar la contraseña (en este ejemplo "PalabraSecreta") del usuario ficticio virtualuser al archivo /etc/rsyncd.secrets.

Extracto del archivo: /etc/rsyncd.secrets

virtualuser:PalabraSecreta

Cambiar los permisos del archivo /etc/rsyncd.secrets y reiniciar rsync como se muestra abajo.

chmod 600 /etc/rsyncd.secrets

/etc/init.d/rsync restart

Finalizar la configuración del cliente en el servidor BackupPC.

Configuración de un cliente Mac

En este ejemplo vamos a configurar la copia de seguridad automática a través de la red de la carpeta personal de un usuario (macuser) en una máquina Mac (macmachine, dominio test.dominio).

Crear el archivo /Library/LaunchDaemons/rsync.plist para activar el inicio automático de Rsync cuando el sistema operativo se reinicie.

Contenido del archivo: /Library/LaunchDaemons/rsync.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>rsync</string>
        <key>Program</key>
        <string>/usr/bin/rsync</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/bin/rsync</string>
                <string>--daemon</string>
        </array>
        <key>inetdCompatibility</key>
        <dict>
                <key>Wait</key>
                <false/>
        </dict>
        <key>Sockets</key>
        <dict>
            <key>Listeners</key>
            <dict>
                <key>SockServiceName</key>
                <string>rsync</string>
                <key>SockType</key>
                <string>stream</string>
            </dict>
        </dict>
</dict>
</plist>

Crear la configuración para la carpeta personal en el archivo /etc/rsyncd.conf como se muestra abajo.

Extracto del archivo: /etc/rsyncd.conf

max connections = 1
log file = /var/log/rsync.log
timeout = 600

[MacuserHomeFolder]
comment = Copia de seguridad de la carpeta personal del usuario
list = false

# Ruta completa de la carpeta personal del usuario
path = /Users/macuser

# Nombre del usuario en esta máquina
uid = macuser

# Nombre de un usuario ficticio para la conexión desde
# el servidor BackupPC (backuppc.test.dominio).
# El usuario ficticio no debe existir en esta máquina.
auth users = virtualuser

# Archivo que contiene la contraseña para el usuario ficticio
secrets file = /etc/rsyncd.secrets

# Sólo el servidor BackupPC puede tener
# accesso a esta máquina usando rsync
hosts allow = backuppc.test.dominio

Agregar la contraseña (en este ejemplo "PalabraSecreta") del usuario ficticio virtualuser al archivo /etc/rsyncd.secrets.

Extracto del archivo: /etc/rsyncd.secrets

virtualuser:PalabraSecreta

Cambiar los permisos del archivo /etc/rsyncd.secrets e iniciar rsync como se muestra abajo.

chown root:wheel /Library/LaunchDaemons/rsync.plist

chmod 644 /Library/LaunchDaemons/rsync.plist

chmod 600 /etc/rsyncd.secrets

launchctl load /Library/LaunchDaemons/rsync.plist

Finalizar la configuración del cliente en el servidor BackupPC.

Configuración de un cliente Windows

En este ejemplo vamos a configurar la copia de seguridad automática a través de la red de la carpeta personal de un usuario (winuser) en una máquina Windows (winpc, dominio test.dominio).

Descargar e instalar el programa cygwin-rsyncd-3.0.9.0_installer.exe. Después de la instalación, el servicio nuevo RsyncServer de Windows ha sido creado y se encuentra activo. Los archivos de Cygwin y Rsync han sido instalados en el directorio C:\rsyncd.

Crear la configuración para la carpeta personal en el archivo C:\rsyncd\rsyncd.conf como se muestra abajo.

Extracto del archivo: C:\rsyncd\rsyncd.conf

max connections = 1
log file = c:/rsyncd/rsync.log
lock file = c:/rsyncd/rsync.lock
timeout = 600

[WinuserHomeFolder]
comment = Copia de seguridad de la carpeta personal del usuario
list = false
use chroot = false
strict modes = false

# Ruta completa de la carpeta personal del usuario
# Sustituir la letra de la unidad "C:" con "/cygdrive/c"
path = /cygdrive/c/Users/winuser

# Nombre del usuario en esta máquina
uid = winuser

# Nombre de un usuario ficticio para la conexión desde
# el servidor BackupPC (backuppc.test.dominio).
# El usuario ficticio no debe existir en esta máquina.
auth users = virtualuser

# Archivo que contiene la contraseña para el usuario ficticio
secrets file = c:/rsyncd/rsyncd.secrets

# Sólo el servidor BackupPC puede tener
# accesso a esta máquina usando rsync
hosts allow = backuppc.test.dominio

Agregar la contraseña (en este ejemplo "PalabraSecreta") del usuario ficticio virtualuser al archivo C:\rsyncd\rsyncd.secrets.

Extracto del archivo: C:\rsyncd\rsyncd.secrets

virtualuser:PalabraSecreta

Reiniciar el servicio RsyncServer de Windows para cargar la configuración nueva.

Abrir una consola de comandos (CMD) y ejecutar los comandos que siguen para crear las reglas en el cortafuego (Firewall) de Windows.

netsh advfirewall firewall add rule name="Open Port 873" dir=in action=allow protocol=TCP localport=873

netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow

Finalizar la configuración del cliente en el servidor BackupPC.

Agregar cliente a BackupPC

En este ejemplo vamos incorporar el cliente Linux (ubuntupc.test.dominio) a la configuración de BackupPC.

El procedimiento es igual para para clientes Linux, Mac y Windows. La única diferencia es que para clientes Linux y Mac se usa

$Conf{ClientCharset} = 'utf8';

mientras que para clientes Windows se debe usar

$Conf{ClientCharset} = 'cp1252';

En el servidor BackupPC (backuppc.test.dominio) creamos el archivo /etc/backuppc/pc/ubuntupc.test.dominio.pl que contiene la configuración para el cliente Linux (ubuntupc.test.dominio).

Contenido del archivo: /etc/backuppc/pc/ubuntupc.test.dominio.pl

$Conf{ClientCharset} = 'utf8';
$Conf{RsyncShareName} = [
        'UbuntuuserHomeFolder'
];
$Conf{RsyncdUserName} = 'virtualuser';
$Conf{RsyncdPasswd} = 'PalabraSecreta';
$Conf{XferMethod} = 'rsyncd';

Cambiar el propietario del archivo ubuntupc.test.dominio.pl.

chown backuppc:www-data /etc/backuppc/pc/ubuntupc.test.dominio.pl

Usando la interfaz web de BackupPC (http://backuppc.test.domain/backuppc/), agregar el cliente a la lista de máquinas configuradas como se muestra de la imagen que sigue.

Finalmente, en la página de resumen de los equipos (Host Summary) puede pulsar el nombre de la máquina recién configurada y luego, en la siguiente página, iniciar la primera copia de seguridad pulsando el botón "Comenzar copia de seguridad completa" (Start Full Backup).

Manuales y documentación detallada del sistema se pueden encontrar en el sitio oficial de BackupPC.

Reinicio del sistema

Para proteger la privacidad de la información almacenada en las copias de seguridad (backup), hemos configurado BackupPC para utilizar el directorio /backup/backuppc en el dispositivo cifrado con LUKS. Después de reiniciar el servidor, debemos activar el dispositivo usando la clave de cifrado.

Esto significa que el servicio BackupPC no será iniciado de forma automática después del reinicio del sistema, pues el dispositivo cifrado aun no ha sido activado. Para facilitar el proceso de activación del dispositivo cifrado y el reinicio de BackupPC, se puede crear el archivo ejecutable backup_crypt_setup.sh en la carpeta personal de su cuenta (en este ejemplo debianuser) en el servidor.

touch /home/debianuser/backup_crypt_setup.sh

chmod u+x /home/debianuser/backup_crypt_setup.sh

Agregar la siguiente secuencia de comandos al archivo /home/debianuser/backup_crypt_setup.sh.

Contenido del archivo: /home/debianuser/backup_crypt_setup.sh

#!/bin/sh

set -e

/sbin/cryptsetup luksOpen /dev/md/backup backup_crypt

/bin/mount /backup

/etc/init.d/apache2 restart

/etc/init.d/backuppc restart

Después de reiniciar (reboot) el servidor sólo tiene que ejecutar el comando que se muestra abajo.

sudo /home/debianuser/backup_crypt_setup.sh