rsnapshot : Backup d’un serveur distant par un utilisateur non root

Nous allons voir comment mettre en place la sauvegarde d’un serveur distant sans pour autant compromettre la sécurité du serveur sauvegardé.

Problématique

Lorsque vous faites une sauvegarde avec rsnapshot, vous avez besoin d’accéder aux fichiers du serveur. Seul l’utilisateur root peut avoir accès à tous les dossiers sans restriction. Toutefois pour des raisons de sécurité il ne faut pas laisser l’accès SSH à l’utilisateur root. Nous allons donc voir une méthode de contournement avec un utilisateur que nous allons appeler rbackup.

Les protagonistes

Dans notre tutoriel nous allons avoir un serveur distant sur lequel il y a les fichiers que nous souhaitons sauvegarder et un Raspberry PI sur lequel nous sauvegarderons nos données. Notez qu’en réalité mon Raspberry Pi ne sauvegarde pas sur sa carte SD mais sur un serveur NAS présent dans le réseau local.

Première partie : Serveur Distant

Commençons par nous connecter sur le serveur distant puis devenons root pour pouvoir créer l’utilisateur rbackup.

sudo su
adduser rbackup
mkdir /home/rbackup
chown -R rbackup: /home/rbackup
usermod -d /home/rbackup rbackup

Cette commande va vous demander plusieurs informations et notamment un mot de passe à noter impérativement. N’hésitez pas à définir un mot de passe compliqué, d’environ 16 caractères avec des chiffres, des lettres majuscule/minuscule et quelques caractères spéciaux car vous n’aurez à le taper réellement qu’une fois.

Configuration rapide de l’accès SSH

Une fois l’utilisateur créé, il faut autoriser sa connexion via SSH en allant éditer le fichier /etc/ssh/sshd_config et ajouter la ligne suivante.

AllowUsers rbackup

Nous redémarrons SSH pour prendre en compte cette commande.

/etc/init.d/ssh restart
Pensez à ajouter les autres utilisateurs qui sont autorisés à se connecter en SSH. Sinon, vous risquez de vous retrouver avec un serveur sans accès au SSH…

Permettre l’accès à l’ensemble des fichiers du serveur

Maintenant que l’utilisateur peut avoir accès au SSH, il va falloir lui donner le droit d’exécuter la commande rsync en mode root. Pour cela, il faut éditer le fichier /etc/sudoers afin d’ajouter la ligne ci-dessous.

rbackup ALL = NOPASSWD: /usr/bin/rsync

Notez que si vous ne savez pas le chemin vers la commande rsync il vous suffit de taper la commande suivant pour avoir le chemin.

whereis rsync

Maintenant nous allons créer un fichier qui va permettre d’automatiser la commande sudo rsync de manière transparente. Pour commencer créez un fichier dans le dossier /usr/bin.

nano /usr/bin/rsync_wrapper.sh

Puis ajoutez le texte ci-dessous :

#!/bin/sh
/usr/bin/sudo /usr/bin/rsync "$@";

Grâce à ce script, la commande rsync pourra donc accéder à tous les fichiers du serveur comme si c’était l’utilisateur root qui l’exécutait. Pensez à faire un petit chmod car moi j’étais bloqué à cause de ça…

chmod +x /usr/bin/rsync_wrapper.sh

Deuxième partie : Raspberry Pi

Rendons-nous sur notre chère Raspberry Pi et commençons par installer rsnapshot.

apt-get install rsnapshot

Configuration de rsnapshot

Maintenant nous allons faire une sauvegarde de la configuration d’origine de rsnapshot pour pouvoir repartir sur une base saine plus tard.

cp /etc/rsnapshot.conf /etc/rsnapshot-original.conf

Puis nous allons éditer notre premier fichier de configuration. Notez que toutes les séparations doivent être des tabulations et non des espaces ! Si jamais vous vous oubliez, rsnapshot vous le rappellera !

nano /etc/rsnapshot.conf

Définir les dossiers à sauvegarder

Dans ce fichier, en vous rendant à la fin, vous pourrez voir des exemples de configuration. Commencez par effacer tout ce qui se trouve en dessous de “BACKUP POINTS / SCRIPTS” car cela ne nous servira pas. (dans nano faite CTRL + K pour retirer une ligne complète). Une fois le ménage fait vous allez pouvoir ajouter la ligne ci-dessous en remplaçant l’adresse IP par celle du serveur à sauvegarder.

backup rbackup@2.2.2.2:/home/mondossier/ mondossier/

Copiez cette ligne autant de fois que vous le souhaitez pour définir les différents dossiers distant à sauvegarder.

L’option rsync_long_args

Il faut impérativement que vous dé-commentiez la commande rsync_long_args pour ajouter le chemin vers notre script rsync_wrapper.sh. Si vous copiez la ligne ci-dessous pensez à mettre des tabulations au lieux des espaces.

rsync_long_args    --rsync-path=rsync_wrapper.sh

Emplacement de sauvegarde

Maintenant retournez au début du fichier ou à l’aide de nano et de CTRL + W rechercher la ligne avec le mot clef ci-dessous pour définir le dossier dans lequel les sauvegardes seront stocker. Attention ce dossier doit être de préférence vide. Dans mon cas ce dossier point vers un NAS à l’aide d’un montage NFS qui permet d’épargner la carte SD du Raspberry…

snapshot_root /home/rsnapshot/

Fréquences des sauvegardes

Les paramètres ci-dessous sont à adapter suivant ce que vous souhaitez faire.

retain  hourly  7
retain  daily   12
#retain weekly 4

Il faut impérativement que hourly soit à 2 après daily c’est pour les sauvegardes journalières et weekly représente une sauvegarde par semaine. Je reviendrais plus tard dans un billet car c’est un sujet assez complexe…

Nous allons simplement configurer pour qu’il y ait une sauvegarde toutes les nuits ainsi qu’un historique sur 12 semaines. Donc dans notre cas hourly devient daily et daily devient weekly ou, autrement dit, hourly c’est une sauvegarde toutes les jours et daily une toutes les semaines.

La configuration du SSH

La commande cmd_ssh doit être dé-commenté car nous allons passer par du SSH et si votre serveur utilise un port autre que le 22 pour le SSH pensez à définir ce port avec le paramètre ssh_args.

ssh_args    -p 2222

Des logs à gogo !

Si vous souhaitez des fichiers de log dé-commentez la ligne logfile et définir le chemin dans lequel écrire les logs.

Exécuter plusieurs instances de rsnapshot en même temps

Je fais une petite aparté pour vous parler du paramètre lockfile qui est important si vous souhaitez exécuter plusieurs rsnapshot en même temps. Ce paramètre permet de définir le fichier “verrou” qui sera écrit en début de traitement et supprimé en fin afin de ne pas avoir plusieurs écritures dans le même dossier. Si vous faites plusieurs fichiers de configurations pensez à changer ce paramètre pour ne pas vous bloquer et avoir un message d’erreur parlant de “pid verrouillé”…

Générer et envoyer votre clé publique SSH

Pour pouvoir vous connecter en SSH sans entrer votre mot de passe, vous allez devoir générer une clé et l’envoyer au serveur pour qu’ils vous reconnaisse. Attention toutefois à l’utilisateur avec lequel vous faites ça ! Dans notre tutoriel l’utilisateur qui va exécuter les différentes sauvegarde depuis le Raspberry PI  est root ce qui fait que vous devez exécuter les commandes ci-dessous avec l’utilisateur : root.

Commençons par générer une clé si vous ne l’avez pas encore fait. Entrez la commande ci-dessous puis appuyez entrée pour laisser le choix par défaut aux questions.

ssh-keygen -t rsa

Maintenant envoyez votre clef publique à l’utilisateur rbackup. Voici le moment de sortir le fameux mot de passe !

ssh-copy-id "rbackup@2.2.2.2 -P 2222"

La commande ci-dessus est pour le cas ou vous avez un numéro de port autre que le 22.

Mise en place du cron

Maintenant nous allons automatiser la tâche pour qu’une sauvegarde s’exécuter tous les matin à 6 heure et tous les soirs à 20 h. Vous devez éditer le crontab de l’utilisateur qui devra faire les sauvegardes qui dans notre cas est root.

crontab -e

Ajoutons les lignes ci-dessous qui parlent d’elles même…

#Sauvegarde du lundi au dimanche a 2 heure du matin (tous les jours)
0 2 * * 1-6 /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly
#Sauvegarde le dimanche a 1 heure du matin (toutes les semaines)
0 1 * * 6 /usr/bin/rsnapshot -c /etc/rsnapshot.conf daily

Troisième partie : De retour sur le serveur distant !

Dans l’étape précédent nous avons envoyé la clé root du Raspberry Pi vers l’utilisateur rbackup du serveur distant. Nous allons renforcer un peu plus notre sécurité !

Éditez le fichier contenant la clé publique de root.

nano /home/rbackup/.ssh/authorized_keys

Puis ajouter en début de ligne les paramètres suivant.

from="1.1.1.1",command="/home/rbackup/validate_rsync.sh" ssh-rsa....

L’adresse IP 1.1.1.1 est l’adresse ip fixe publique du Raspberry Pi ce qui fait que si vous utilisez votre Raspberry dans votre maison, il aura sur internet la même adresse que votre box. Pour connaître cette adresse IP, rendez-vous sur cette page. Le second paramètre est un script que nous allons créer dés maintenant.

nano /home/rbackup/validate_rsync.sh

Puis vous allez copier-coller le contenu du fichier ci-dessous.

#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
  *\&*)
    echo "Connection closed"
    ;;
  *\;*)
    echo "Connection closed"
    ;;
    rsync*)
    $SSH_ORIGINAL_COMMAND
    ;;
  *true*)
    echo $SSH_ORIGINAL_COMMAND
    ;;
  *)
    echo "Connection closed."
    ;;
esac

Pour les plus feignant vous pouvez tout faire avec la commande ci-dessous qui va vous télécharger le fichier…

wget http://files.hawkcreation.com/rsnapshot/validate_rsync.sh -O /home/rbackup/validate_rsync.sh

Vive la ligne de commande ! \o/

Changez les droits du fichier comme il faut :

chmod 755 /home/rbackup/validate_rsync.sh

Validation du travail

L’heure est grave, nous allons devoir valider notre travail !

Tester la connexion au serveur

Pour commencer vous pouvez essayer de vous connecter au serveur distant depuis votre Raspberry Pi.

ssh rbackup@2.2.2.2 -p 2222

Si vous avez un retour comme ci-dessous c’est que toute la partir SSH semble fonctionner !

Connection closed.
Connection to 2.2.2.2 closed.

Pour aller un peu plus loin vous pouvez essayer la commande ci-dessous qui va vous retourner la liste des arguments de la commande rsync.

ssh rbackup@2.2.2.2 -p 2222 'rsync'

Pour vous aider à comprendre si quelque chose se passe mal dans la connexion SSH, vous pouvez ajouter l’option (en gras) comme ci-dessous pour activer le mode “verbose” :

ssh -vvv rbackup@2.2.2.2 -p 2222 ‘rsync’

Côté serveur, vous pouvez avoir des informations concernant les problèmes de connexion grâce à la commande suivante :

tail -f /var/log/auth.log

Lancer manuellement votre rsync

Maintenant que nous savons que la connexion SSH fonctionne il ne reste plus qu’à lancer manuellement la sauvegarde et traiter les messages d’erreurs qui pourront être retourné… Notez qu’il vaut mieux au début synchroniser un petit dossier pour valider plus vite que tout fonctionne bien avant de se lancer dans la sauvegarde de plusieurs giga…

/usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly

Si vous rencontrez des problèmes n’hésitez pas à les poster que je puisse améliorer ce billet !

Bonne backup à tous !

3 commentaires sur “rsnapshot : Backup d’un serveur distant par un utilisateur non root”

  1. Bonjour,

    Je pense (mais je ne suis pas expert) que c’est le chemin vers le dossier qui n’est pas bon. Ou alors qu’il manque le script côté serveur.
    J’ai eu le même soucis hier soir et c’était le chemin vers le dossier à sauvegarder qui n’était pas bon. Essaye déjà pour commencer avec un dossier simple à la racine de ton système de fichier.
    Bon courage.

  2. Et j’ajoute que l’echange de cle a été realise avec succes et la commande isolée ‘ssh -p 2764 rbackup@xxxxx’ fonctionne sans demande de mot de passe

  3. Bonjour,

    Merci pour cet excellent tuto.
    J’ai mis en place la configuration pour declencher rsnapshot mais j’ai un souci :

    # /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly
    Bad port ‘-l’
    rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
    rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]
    —————————————————————————-
    rsnapshot encountered an error! The program was invoked with these options:
    /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly
    —————————————————————————-
    ERROR: /usr/bin/rsync returned 12 while processing rbackup@xxxxxx:/media/70bf214e-10e0-467c-b049-94089efca32f/ES_docs

    => extrait de /var/log/rsnapshot.log
    [06/Apr/2014:03:38:42] /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly: started
    [06/Apr/2014:03:38:42] echo 2503 > /var/run/rsnapshot.pid
    [06/Apr/2014:03:38:45] /bin/rm -rf /media/Transcend/testrsync/hourly.6/
    [06/Apr/2014:03:38:45] mv /media/Transcend/testrsync/hourly.5/ /media/Transcend/testrsync/hourly.6/
    [06/Apr/2014:03:38:45] mv /media/Transcend/testrsync/hourly.4/ /media/Transcend/testrsync/hourly.5/
    [06/Apr/2014:03:38:45] mv /media/Transcend/testrsync/hourly.3/ /media/Transcend/testrsync/hourly.4/
    [06/Apr/2014:03:38:45] mv /media/Transcend/testrsync/hourly.2/ /media/Transcend/testrsync/hourly.3/
    [06/Apr/2014:03:38:45] mv /media/Transcend/testrsync/hourly.1/ /media/Transcend/testrsync/hourly.2/
    [06/Apr/2014:03:38:45] /bin/cp -al /media/Transcend/testrsync/hourly.0 /media/Transcend/testrsync/hourly.1
    [06/Apr/2014:03:38:45] /usr/bin/rsync -a –rsync-path=/usr/bin/rsync_wrapper.sh –rsh=”/usr/bin/ssh -p” rbackup@xxxxxxx:/media/70bf214e-10e0-467c-b049-94089efca32f/ES_docs /media/Transcend/testrsync/hourly.0/ES_docs/
    [06/Apr/2014:03:38:45] /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly: ERROR: /usr/bin/rsync returned 12 while processing rbackup@xxxxx:/media/70bf214e-10e0-467c-b049-94089efca32f/ES_docs
    [06/Apr/2014:03:38:46] touch /media/Transcend/testrsync/hourly.0/
    [06/Apr/2014:03:38:46] rm -f /var/run/rsnapshot.pid
    [06/Apr/2014:03:38:46] /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly: ERROR: /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly: completed, but with some errors

    Quelqu’un saurait-il maider ?
    Je precise que j’attaque le ssh distant sur le port 2764
    Merci par avance.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.