Utiliser rsnapshot pour automatiser des sauvegardes distantesUsing rsnapshot for automatic remote backups

Ce tutoriel présente quelques cas pratiques d’utilisation de rsnapshot pour sauvegarder des données d’un serveur distant sur une machine locale. En particulier trois types de sauvegardes vont être présentées :

  1. sauvegarde d’un dossier distant sur l’ordinateur local en utilisant une connexion SSH par paire de clé publique/privée
  2. sauvegarde d’un dossier distant sur l’ordinateur local en utilisant une connexion SSH avec mot de passe
  3. sauvegarde d’une base de données distante sur l’ordinateur local en utilisant une connexion SSH

Pour reprendre le contexte décrit dans ce tutoriel, on appellera

  • padawan le serveur contenant les données à sauvegarder. Ce serveur est réputé être accessible par connexion SSH (clé ou mot de passe) ;
  • master l’ordinateur local de stockage (Ubuntu, 12.04 LTS)

Plus d’informations : sur la documentation officielle (en français) et merci à Fabrice pour m’avoir indiqué le logiciel.

Installation de rsnapshot

Le logiciel possède un package Ubuntu et s’installe donc en ligne de commande avec :

sudo apt-get install rsnapshot

On commence par soigneusement sauvegarder le fichier de configuration initial avec :

sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.bak

On peut ensuite créer un utilisateur dédié qui gèrera les sauvegardes :

sudo adduser sauveur

puis on édite le fichier /etc/rsnapshot.conf en super-utilisateur pour préciser la configuration générale (les cas typiques d’utilisation sont précisées dans la section suivante) :

  • le répertoire de base où les sauvegardes sont effectuées est précisé en début de fichier :
    snapshot_root /home/sauveur/saves/
    
  • si vous souhaitez utiliser SSH, il faut également décommenter la ligne
    cmd_ssh /usr/bin/ssh  
    
  • les logs de rsnapshot doivent être sauvegardés dans un fichier accessible à l’utilisateur qui lance la commande. J’ai choisi :
    verbose 1
    loglevel  3
    logfile /home/sauveur/rsnapshot.log
    lockfile  /home/sauveur/rsnapshot.pid
    
  • l’option
    link_dest 1
    

    permet de sauvegarder un certain nombre de fichiers spéciaux (sockets, pipes…) ;

  • je lance une sauvegarde hebdomadaire, toutes sont sauvegardées dans un dossier monthly.XX vaut 0, 1, 2, … (0 étant le plus récent, 1 la sauvegarde de la semaine précédente, …). Ce paramètre est spécifié dans
    retain  monthly  4
    

    qui indique 4 sauvegardes mensuelles.

Finalement, commentez toute les lignes commençant par backup et limitez la lecture du fichier au seul utilisateur sauveur :

sudo chown sauveur:sauveur /etc/rsnapshot
sudo chmod -r /etc/rsnapshot

Ceci est particulièrement utile si vous inscrivez des mots de passe en dur dans ce fichier, comme indiqué plus loin, afin que les autres utilisateurs n’aient pas accès à la lecture de ces mots de passe.

Quelques cas d’utilisation pratique de rsnapshot

Sauvegarde par connexion SSH avec paire de clés publique/privée

Supposons que sur padawan, l’utilisateur dude ait accès (en lecture au moins) aux fichiers/dossiers à sauvegarder. Sur master, en tant que sauveur, on génère une paire de clés SSH sans mot de passe :

sudo su sauveur
ssh-keygen -t dsa

La dernière commande génère deux fichiers à l’emplacement que vous avez précisé en répondant à la question

Enter file in which to save the key (/home/sauveur/.ssh/id_dsa):

Si vous avez laissé cette réponse vide, les fichiers générés sont id_dsa et id_dsa.pub. Copiez le fichier id_dsa.pub sur padawan dans le dossier /home/dude/.ssh en le renommant authorized_keys. Vous devriez alors, depuis master, en tant que sauveur pouvoir vous connecter sur padawan en tant que dude :

ssh dude@padawan.fr
Éditez alors de nouveau le fichier /etc/rsnapshot.conf en y ajoutant la ligne suivante (à adapter selon vos besoin) :
backup  dude@padawan.fr:./  root/

qui aura pour effet de sauvegarder toute le répertoire personnel de dude dans /home/sauveur/saves/monthly.X/root/.

Attention ! Dans la syntaxe de ce fichier, il faut bien utiliser des tabulations et non des espaces pour séparer les différentes parties de la commande.

Sauvegarde de données par connexion SSH avec mot de passe

Pour se connecter via un mot de passe, on peut utiliser la même astuce que celle décrite dans ce post. Le principe général est d’utiliser le programme sshpass en conjonction avec rsync pour faire une copie locale du serveur distant puis ensuite, de lancer un backup de cette copie locale. Cela consiste à ajouter dans le fichier /etc/rsnapshot.conf les deux lignes suivantes :

backup_script   /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no -l dude" padawan.fr:./ /home/sauveur/tmp/      unused/
backup  /home/sauveur/tmp/    root2/

PWD est le mot de passe de dude pour accéder au serveur padawan.

Sauvegarde de bases de données par connexion SSH avec mot de passe

La même astuce que précédemment peut être utilisée pour sauvegarder une base de données avec une connexion SSH par mot de passe sur un serveur sur lequel la base de données est accessible. Le principe général consiste à réaliser un sqldump de la base de données après une connexion ssh (utilisant soit une paire de clés sans mot de passe, soit une connexion avec mot de passe) puis de lancer le backup du répertoire dans lequel la base de données a été sauvegardée. Ceci est effectué à l’aide des trois lignes suivantes à ajouter au fichier /etc/rsnapshot.conf :

backup_script   /usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no dude@padawan.fr "mysqldump --no-tablespace --opt -h HOST -u LOGIN -p"PWD2" BDNAME | gzip > ~/sauvebd/bdsauvee.sql.gz"    unused1/
backup_script   /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no -l dude" padawan.fr:sauvebd/ /home/sauveur/tmp2/      unused2/
backup  /home/sauveur/tmp2/    root3/

La première ligne se connecte avec l’utilisateur dude sur padawan (mot de passe PWD) et sauvegarde la base de données BDNAME du serveur HOST accessible à l’utilisateur LOGIN avec le mot de passe PWD2 : une copie gzippée est sauvegardée dans /home/dude/sauvebd/bdsauvee.sql.gz (le répertoire /home/dude/sauvebd doit avoir été créé préalablement). La seconde effectue une synchronisation de ce répertoire dans le répertoire local /home/sauveur/tmp2 et la troisième effectue la sauvegarde via rsnapshot de ce répertoire temporaire dans /home/sauveur/saves/monthly.X/root3/.

Tester et automatiser la sauvegarde avec une tâche CRON

Une fois la configuration effectuée, on peut tester la syntaxe du fichier /etc/rsnapshot.conf en lançant, sur master avec l’utilisateur sauveur les commandes suivantes :

rsnapshot configtest
rsnapshot -t monthly

La première teste la syntaxe du fichier et la seconde simule les opérations qui seront effectuées pour un lancement hebdomadaire de rsnapshot.

Si tout fonctionne correctement, on finalise en créant, sur master avec l’utilisateur sauveur, une tâche CRON :

crontab -e

où on ajoute la ligne suivante :

30 01 * * 3 rsnapshot monthly

qui démarre la commande rsnapshot monthly tous les troisièmes jours de la semaine (le mardi), à 1h30.