BackupPC : Sauvegardes automatisées de machines

Mise en oeuvre d'un outil de sauvegarde des postes de travail et des serveurs

Par Fabien Germain <fabien (at) klipz (dot) org>
 
Cet article a initialement été écrit pour RedHat Magazine France, mais il n'a malheureusement pas eu le temps d'Ítre publié :-( Si vous souhaitez obtenir le fichier original au format OpenOffice, envoyez moi un mail.

Présentation

En terme d'architecture réseau et de sécurité, il est crucial de protéger les accès à son réseau, aussi bien en entrée qu'en sortie, en particulier pour éviter les fuites ou même les destructions de contenus sensibles, et également pour éviter une utilisation frauduleuse de vos ressources informatiques. Mais il est également primordial de protéger le contenu en lui même. En effet, les meilleurs firewalls du monde et autres sondes d'intrusion ne pourront rien au plantage du disque dur d'un de vos serveurs, et ne vous seront d'aucune aide si votre responsable commercial fait tomber son ordinateur portable en montant dans un train, perdant ainsi toutes les fiches clientèles ou la comptabilité de la société. De plus, la sauvegarde est un élément de sécurité non négligeable : les sauvegardes incrémentales permettent aisément de voir les fichiers qui ont été ajoutés ou modifiés entre deux dates données. Dans le cas où un rootkit aurait été installé sur une machine compromise, on peut alors visualiser et surtout restaurer les fichiers binaires systèmes qui ont été modifiés, et également voir où les fichiers du rootkit ont été posés, comme le fait tripwire.

La sauvegarde est un élément extrêmement important, malheureusement bien souvent négligé, surtout dans les petites entreprises. Le coût du matériel informatique ayant fortement diminué ces dernières années, en particulier tout ce qui touche au stockage des données, il est parfaitement possible de mettre en oeuvre une solution de sauvegarde efficace à moindre coût : Pour donner un exemple concret, un serveur avec plusieurs disques Serial ATA et une carte RAID, avec un agrégat configuré en RAID 5, propose un espace de stockage fiable qui dépasse le Tera Octet, tout ça pour moins de 2000 euros. Au travers de cet article, nous allons vous présenter un puissant outil de sauvegardes automatisées entièrement paramétrable, à savoir BackupPC, qui est sous licence GPL :

http://backuppc.sourceforge.net

Il gère aussi bien les postes de travail que les serveurs, sous Linux et sous Windows, grâce à ses diverses méthodes de copie et synchronisation : Samba, tar sur de SSH/RSH/NFS, ou encore rsync sur SSH/RSH. BackupPC est écrit en Perl, et se compose de plusieurs scripts distincts, faciles à appréhender. Il s'agit donc d'un outil extrêmement souple. De plus, chaque machine est paramétrable indépendamment : par exemple sur la méthode de sauvegarde, les jours et heures critiques où il ne faut pas lancer de sauvegarde (serveur soumis à une forte charge entre 09h00 et 22h30 du lundi au samedi), ou encore le nombre de sauvegardes incrémentales et complètes à conserver. De plus, l'auteur de BackupPC a prévu la possibilité de créer des comptes utilisateur, afin que ces derniers puissent visualiser l'état de leurs sauvegardes, exécuter manuellement une sauvegarde de leur machine en plus de celles faites automatiquement, ou bien encore récupérer un fichier effacé par erreur trois jours auparavant.

Pourquoi choisir BackupPC, alors qu'il existe de nombreuses solutions de sauvegarde sous Linux ? Tout simplement pour sa souplesse, sa puissance, sa facilité de mise en oeuvre, et surtout pour les nombreuses fonctionnalités avancées que nous allons détailler ci-dessous :


Installation

Pré-requis

A l'heure de la rédaction de cet article, la dernière version de BackupPC est la v2.1.0. Durant la phase d'installation, nous vous recommandons de vous appuyer en parallèle sur la documentation officielle, disponible sur le web à l'adresse http://backuppc.sourceforge.net/faq/BackupPC.html, les différentes étapes y étant bien détaillées. Nous vous conseillons également d'utiliser une machine dédiée à la tâche de la sauvegarde, plutôt que de mutualiser la ressource avec un autre serveur. A l'installation de cette machine -- une Fedora Core 2 de type "serveur" fera parfaitement l'affaire --, il faudra créer une grosse partition réservées aux données, disons /data, dans laquelle se situeront les configurations des sauvegardes des différentes machines, les fichiers de journaux, et bien entendu les sauvegardes en elle-mêmes. De plus, nous veillerons à ce que Perl 5.6.0 ou supérieur soit correctement installé, ainsi que mod_perl pour Apache, et les modules Compress::Zlib, Archive::Zip and File::RsyncP :

[root@backup root]# perl -MCPAN -e shell
 
cpan shell -- CPAN exploration and modules installation (v1.61)
ReadLine support available (try 'install Bundle::CPAN')
 
cpan> install Compress::Zlib

Dans le cas où vous souhaiteriez sauvegarder des machines Windows, il nous faudra smbclient et nmblookup (tous deux sont disponibles dans le package samba-client). Quant aux machines Linux, nous aurons besoin de tar, et surtout de rsync. De plus, nous recommandons d'utiliser ssh pour les sauvegardes sous Linux, pour des raisons évidentes de sécurité : c'est le cas que nous traiterons au long de cet article. Et enfin, pour finir avec la liste des pré-requis, Apache devra être installé si vous souhaitez profiter de l'interface web d'administration !

Installation de BackupPC

Après avoir téléchargé le fichier BackupPC-2.1.0.tar.gz depuis un serveur FTP miroir, nous allons le décompresser. Mais juste avant de lancer l'outil de configuration, nous allons créer un utilisateur backuppc, qui sera utilisé pour l'exécution de BackupPC :

$ tar xvfz BackupPC-2.1.0.tar.gz
 
$ cd BackupPC-2.1.0
 
$ su root
 
# adduser backuppc
 
# perl configure.pl

Passons maintenant à la configuration, très simplement, en répondant aux quelques questions posées :

--> Full path to existing conf/config.pl []?
 
I found the following locations for these programs:
   [...]
--> Are these paths correct? [y]? y
 
--> BackupPC will run on host [backup.reseau.local]? backup.reseau.local
 
--> BackupPC should run as user [backuppc]? backuppc
 
--> Install directory (full path) []? /usr/local/BackupPC
 
--> Data directory (full path) []? /data
 
--> Compression level [3]? 3
 
--> CGI bin directory (full path) []? /var/www/cgi-bin/
 
--> Apache image directory (full path) []? /var/www/html/BackupPC
 
--> URL for image directory (omit http://host; starts with '/') []? /BackupPC
 
--> Do you want to continue? [y]? y

Une fois toutes les réponses fournies, ce script Perl lance l'installation des différents éléments nécessaires au fonctionnement de BackupPC. En pratique, que s'est il passé avec les paramètres que nous venons de fournir ? Les différents outils en ligne de commande sont installés dans /usr/local/BackupPC, le répertoire /data a été créé et contient le squelette de la structure de BackupPC avec les fichiers de configuration, l'interface web est géré par le script CGI BackupPC_Admin installé dans /var/www/cgi-bin et les images web associées sont dans /var/www/html/BackupPC. De plus, nous avons fixé le niveau de compression à 3, qui est un bon compris entre gain d'espace disque et performances : l'expérience montre qu'augmenter ce nombre n'apporte pas un taux de compression beaucoup plus fort, par contre la charge machine est significativement plus élevée. Pour des raisons de sécurité, les outils en ligne de commande ainsi que le script CGI ne seront pas exécutés (ni même exécutables !) en root, mais ils le seront avec les droits de l'utilisateur backuppc, limitant ainsi les risques.

Paramétrage du serveur web

Après s'être assuré qu'Apache est démarré (sinon : 'chkconfig httpd on', puis 'service httpd start'), nous allons vérifier dès à présent si l'accès à l'interface d'administration fonctionne en nous rendant à l'URL http://backup.reseau.local/cgi-bin/BackupPC_Admin. Et là c'est la déception, puisque nous obtenons le message : "Erreur du serveur!". Pas de panique ! Le serveur web Apache est exécuté avec l'utilisateur apache. En regardant les droits du fichier /var/www/cgi-bin/BackupPC_Admin, on se rend compte que le bit SUID est fixé pour donner les droits de l'utilisateur backuppc, mais que seul l'utilisateur et le groupe backuppc sont autorisés à l'exécuter. Qu'à cela ne tienne, rajoutant l'utilisateur apache dans le groupe backuppc , et cela sans utiliser vi sur le fichier /etc/group ;-) : gpasswd -a apache backuppc. En fait, nous verrons plus tard que BackupPC souhaite qu'Apache soit exécuté également avec les droits de l'utilisateur backuppc. Nous pouvons donc dès à présent modifier le fichier /etc/httpd/conf/httpd.conf pour ajuster les deux lignes suivantes :

User backuppc
Group backuppc

Redémarrons Apache, et le tour est joué : l'interface est à présent accessible !


Figure 1 : L'interface d'administration, vide pour l'instant

Un second blocage se présente, comment démarrer BackuPC ? Heureusement, le script Perl de configuration nous a préparé un fichier pour init.d, qu'il ne reste plus qu'à recopier au bon endroit :

# cp BackupPC-2.1.0/init.d/linux-backuppc /etc/init.d/BackupPC
 
# chmod +x /etc/init.d/BackupPC
 
# chkconfig BackupPC on
 
# service BackupPC start

Mettons en place dès maintenant les authentifications HTTP pour l'accès à l'administration, puisque c'est de cette manière que nos utilisateurs devront s'authentifier. Editions le fichier /etc/httpd/conf.d/perl.conf, et à la fin de celui-ci on ajoutera :

<Location /cgi-bin/BackupPC_Admin>
  SetHandler perl-script
  PerlResponseHandler ModPerl::Registry
  PerlOptions +ParseHeaders
  Options +ExecCGI
  AuthName "Administration du serveur de sauvegarde"
  AuthType Basic
  AuthUserFile /etc/httpd/conf/backuppc_users
  Require valid-user
</Location>

Générons un premier utilisateur admin, qui sera l'administrateur du serveur de sauvegarde, puis un utilisateur classique :

# htpasswd /etc/httpd/conf/backuppc_users admin
 
# htpasswd /etc/httpd/conf/backuppc_users utilisateur
 
# chown backuppc: /etc/httpd/conf/backuppc_users

C'est terminé, BackupPC est correctement installé ! Nous allons donc pouvoir passer à la configuration.



 
Configuration

Configuration générale

Le fichier de configuration de BackupPC est /data/conf/config.pl : Il est très agréable à configurer, car les commentaires y sont très nombreux et il est découpé en plusieurs sections fonctionnelles. Nous n'entrerons pas dans une fastidieuse description des dizaines de paramètres disponibles, nous garderons tant que possible les paramétrages par défaut. Commençons par forcer l'utilisation de la langue française, et définissons l'utilisateur admin comme administrateur du système de sauvegarde, en modifiant les deux lignes ci-dessous :

$Conf{CgiAdminUsers} = 'admin';
$Conf{Language} = 'fr';

Après avoir rechargé BackupPC et éventuellement Apache, on peut s'authentifier avec l'utilisateur admin et avoir accès à tous les menus d'administration !

Voici quelques uns des paramètres usuels :

Définir les machines

Le fichier /data/conf/hosts recense l'ensemble des machines à sauvegarder. Editons le et ajoutons deux machines : Un serveur, accessible uniquement à l'administrateur, et le poste de travail de l'utilisateur utilisateur que nous avons créé auparavant :

serveur.reseau.local   0   admin
poste01   1   utilisateur

Le chiffre "0" indique une machine avec IP fixe, et "1" une machine avec IP dynamique (DHCP) : nous supposons ici qu'un serveur DNS est présent sur le réseau et résout le nom serveur.reseau.local, sinon il faudrait spécifier directement l'adresse IP de ce serveur. Comme vous pouvez vous en douter, le nom en fin de chaque ligne est celui de l'utilisateur qui gère la machine. L'administrateur a accès à toutes les machines, par contre utilisateur n'aura accès qu'à son poste de travail poste01. Il est nécessaire d'indiquer à BackupPC que sa configuration a été modifiée, directement dans l'interface d'administration : Options d'adminstration -> Recharger la configuration. Nos machines sont à présent accessibles dans l'interface web de gestion. En essayant successivement de vous connecter avec les deux utilisateurs que nous avons créé quelques lignes plus haut, vous constaterez qu'ils n'accèdent pas à la même interface : utilisateur a une interface simplifiée et ne voit que la machine poste01, alors que admin voit toutes les machines et accède à une interface beaucoup plus complète.



Figure 2 : L'état actuel de ma machine "serveur_admin"

Comme nous le voyons sur l'interface d'une des machines, l'utilisateur en charge de sa gestion est affiché, avec un lien de type mailto: pour lui envoyer un e-mail. C'est également à cette adresse, utilisateur@nom.du.serveur, que seront envoyées les e-mails d'alertes. Il convient donc de modifier le fichier d'alias de votre serveur de messagerie local, de telle sorte que cet utilisateur pointe vers l'adresse e-mail réelle à prévenir en cas de problème. Avec Postfix, le fichier concerné est /etc/postfix/aliases et les lignes à ajouter sont les suivantes :

admin: sysadmin@ma-societe.fr
utilisateur: laurent@ma-societe.fr

Sans oublier de régénérer le fichier aliases.db, pour que Postfix prenne les modifications en compte :

# newaliases

Configuration d'un hôte Linux

La machine serveur.reseau.local sera un serveur sous Linux. Tous les éléments concernant ce dernier se trouvent dans le répertoire /data/pc/serveur.reseau.local/. Si ce répertoire n'existe pas encore, cliquez dans l'interface de ce serveur sur "Démarrer la sauvegarde complète" : La sauvegarde ne fonctionnera bien évidemment pas, puisqu'aucun paramétrage n'a encore été fait. Mais BackupPC créera automatiquement la structure du répertoire, dans un premier temps composée uniquement des fichiers backups, LOCK et LOG.

Par défaut, le fichier /data/conf/config.pl contient la liste des paramètres à utiliser. Mais il est possible, pour chaque machine, de redéfinir certains paramétrages, comme la méthode de synchronisation à utiliser, ou bien la liste des répertoire à (ne pas) sauvegarder. La méthode utilisée sera rsync + ssh, car c'est la méthode la plus efficace et la plus sûre sous Linux. Nous n'entrerons pas dans le détail de la configuration des autres méthodes disponibles, celles ci étant parfaitement bien détaillées dans la documentation officielle. Deux choses doivent être faites :

Voici un exemple de fichier config.pl à créer pour notre serveur Linux :

$Conf{XferMethod} = 'rsync';
$Conf{RsyncClientPath} = '/usr/bin/rsync';
$Conf{RsyncClientCmd} = '$sshPath -l root $host $rsyncPath $argList+';
$Conf{RsyncClientRestoreCmd} = '$sshPath -l root $host $rsyncPath $argList+';
$Conf{RsyncShareName} = ['/', '/home'];
$Conf{BackupFilesExclude} = [ '/proc', '/dev' ];
$Conf{RsyncArgs} = [
      '--numeric-ids',
      '--perms',
      '--owner',
      '--group',
      '--devices',
      '--links',
      '--times',
      '--block-size=2048',
      '--recursive',
      '--one-file-system',
];
$Conf{RsyncRestoreArgs} = [
      "--numeric-ids",
      "--perms",
      "--owner",
      "--group",
      "--devices",
      "--links",
      "--times",
      "--block-size=2048",
      "--relative",
      "--ignore-times",
      "--recursive",
      "--one-file-system",
];
$Conf{RsyncLogLevel} = 1;

Ce fichier a été créé à partir des exemples fournis dans le fichier de configuration principal. Vous pourrez y trouver également des exemples type pour les autres types de sauvegardes.

Passons à l'authentification par clé RSA. Nous allons copier la clé d'authentification de l'utilisateur backuppc de notre serveur de sauvegarde, sur l'hôte Linux. Première étape, si ce n'est pas déjà fait : générer les clefs sur le serveur de sauvegarde :

# su – backuppc
 
$ ssh-keygen -t rsa
  <enter>
  <enter>
  <enter>
 
$ cat .ssh/id_rsa.pub

Votre clé d'authentification se trouve dans ~backuppc/.ssh/id_rsa.pub. Ajoutons là sur l'hôte Linux afin d'autoriser cet utilisateur+machine précis à se connecter en root sur le serveur Linux qui devra être sauvegardé :

# mkdir ~root/.ssh/
 
# vi ~root/.ssh/authorized_keys2
  <copier ici la clé de l'utilisateur backuppc du serveur de sauvegarde>
  :wq

Essayons à présent de nous connecter, depuis le serveur de sauvegarde avec backuppc, en root sur le serveur Linux :

$ ssh root@serveur.reseau.local

C'est parfait, vous êtes à présent connecté sans avoir eu besoin d'entrer de mot de passe ! Pour améliorer encore la sécurité de ces connexions par clé RSA, nous pouvons restreindre l'utilisation de la clé d'authentification de backuppc à l'adresse IP du serveur de sauvegarde en ajoutant from="<adresse IP>" devant la clé dans le fichier authorized_keys2. Ce dernier ressemblera à présent à ceci :

from="192.168.10.3" ssh-rsa AB3NzaC1yc2EAzYABIwAb[...] backuppc@backup.reseau.local

Configuration d'un hôte Windows

Nous partirons du principe que vous êtes à l'aise dans la mise en oeuvre d'un partage sous Windows, cela n'étant pas le propos de cet article. Voici simplement un fichier config.pl typique à mettre en place pour une machine sous Windows qui possède les partages "Disque_D" et "Disque_E", et qui sont accessibles grâce à l'utilisateur "backup" et le mot de passe "PasswordBackup" :

$Conf{XferMethod} = 'smb';
$Conf{SmbShareName} = ['Disque_D', 'Disque_E'];
$Conf{SmbShareUserName} = "backup";
$Conf{SmbSharePasswd} = "PasswordBackup";

Utiliser l'interface

C'est avec joie que nous pouvons maintenant retourner sur l'interface web de gestion des sauvegardes, et lancer nos premières sauvegardes d'un simple clic ! La toute première sauvegarde (complète) sera bien entendu plus longue que les suivantes (incrémentales). Toute la puissance et la souplesse de BackupPC réside surtout dans sa capacité à naviguer dans les différentes sauvegardes grâce à des "tree views", à restaurer en trois clics un fichier effacé, et même à télécharger un ensemble de fichiers et répertoires sous la forme d'un fichier zip ou tar, qu'il va génèrer pour vous ! Cela peut donc être un outil extrêmement efficace pour dupliquer des fichiers de configuration, ou encore déplacer un site web d'un serveur à un autre en quelques secondes seulement.

Un autre élément intéressant est l'accès aux fichiers de journaux. Vous conservez ainsi un historique des différentes opérations, mais également des éventuels échecs rencontrés. Couplé à la remontée par e-mail, une sauvegarde non fonctionnelle sera rapidement repérée. Il existe d'ailleurs une option qui vous permet d'être averti dès que la sauvegarde la plus récente d'une machine à par exemple plus de 2 jours :

$Conf{EMailNotifyOldBackupDays} = 2.0;

La navigation dans l'interface est relativement simple, mais vous constaterez qu'elle devient fastidieuse à utiliser lorsque plusieurs sauvegardes sont en cours, car la machine est en général soumise à de très fortes charges et la bande passante consommée en entrée est impressionnante. Il conviendra alors de trouver le réglage idéal, en fonction de la configuration matériel du serveur, pour limiter le nombre de sauvegardes simultanées et ainsi rendre son utilisation plus agréable, même en heure de pointe.



 
Conclusion

Au travers de cet article vous avez appris à installer et configurer un outil performant permettant de sauvegarder aussi bien des machines Windows que des machines Linux. Outil de sauvegarde, mais également outil de sécurité et dans certain cas même de réplication de configurations et de contenus. Les possibilités de BackupPC sont immenses, et aisément accessibles au travers d'une interface web simple et efficace. A part peut être la reconnaissance -- et c'est maintenant chose faite --, il ne manque décidemment rien à cet excellent outil de sauvegarde ! Encore une perle rare que nous offrent les logiciels libres.