Sauvegardes distantes chiffrées avec un Raspberry Pi, Truecrypt et Rsync

Rappel des besoins

Voici ma "politique de sauvegarde" actuelle : j’ai mon serveur personnel chez moi dans lequel se trouve deux disques durs : un principal, sur lequel se trouve mon OS et mes données et un autre disque, sur lequel je synchronise les données à sauvegarder présentes sur mon premier (j’avais expliqué comment je faisais tout ça dans cet article ).

Je voulais mettre en place une sauvegarde distante automatique, sécurisée et pas chère. L’objectif est de dupliquer mon deuxième disque dur sur un disque externe distant chiffré. J’ai trouvé mon bonheur avec ce matériel :

  • Un Raspberry Pi

    • Un Hub alimenté
    • Un disque dur externe chiffré
      Coût total du projet : Raspberry Pi + Boitier + Carte SD + Clé WiFi + Disque dur externe d’occasion = environ 70€

    Cette mise en place se déroule en 3 grandes étapes que je vais expliquer :

    1. Installation du Raspberry Pi
    2. Déchiffrage du disque dur
    3. Synchronisation des données

      Installation du Raspberry Pi

    Matériel

    J’ai donc décidé de mettre en place le Raspberry Pi chez mes beaux parents. Il sera placé dans le fin fond d’une pièce, dans une belle boite prévue à cet effet :

    raspi_ancerville.png

    WiFi

    Le premier problème à été de mettre en place le WiFi. La box de mes beaux parents étant configuré en WEP, j’ai eu du mal à y associer le Raspberry Pi. Après quelques essais infructueux, j’ai décidé de les passer en WPA, ce qui augmente la sécurité et (surtout) facilite la configuration de mon Raspberry. Je n’ai eu plus qu’à suivre ma documentation pour configurer le tout correctement.

    IP dynamique

    Ensuite est venu un deuxième gros problème : mes beaux parents sont chez Orange et ont donc une adresse IP dynamique. Comme mon nom de domaine est géré chez OVH, j’ai suivi pour paramétrer un champ DynHost et associer une URL à la livebox de manière permanente. J’ai tout de même patché le petit programme qu’ils fournissent en modifiant cette ligne du fichier dynhost :

    IP=/sbin/ifconfig $IFACE | fgrep "inet ad" | cut -f2 -d":" | cut -f1 -d" "

    par celle-ci :

    IP=wget http://checkip.dyndns.org/ -O - -o /dev/null | awk '{ print $6 }' | cut -d "<" -f 1

    Sans ce patch, l’IP renvoyée à OVH (et associée à mon URL) est l’IP privée de mon Raspberry et non pas l’IP publique de la Livebox (sic).

    C’est prêt

    Une fois toutes ces choses faites, j’ai bien un Raspberry Pi qui tourne dans un coin de chambre à 100 Km de chez moi et qui répond toujours à la même URL (malgré son IP dynamique).

    Déchiffrage du disque dur

    Le Raspberry Pi n’étant pas chez moi (je ne peux pas savoir qui rentre et sors chez mes beaux parents), je voulais chiffrer mon disque dur afin que mes données soient illisibles en cas de vol de mon disque dur externe.

    Pour faire cela, j’ai déjà dû, dans un premier temps, "l’initialiser" (le chiffrer). J’ai utilisé le logiciel Truecrypt et j’ai expliqué cette manipulation dans cet article . Sur mon Raspberry Pi, il me suffit ensuite d’installer Truecrypt afin de déchiffrer et d’exploiter ce disque.

    Installation de Truecrypt

    L’installation de truecrypt est un peu compliquée sur le Raspberry Pi. En effet, le processeur de ce dernier est un ARM. L’installeur de truecrypt est compatible avec les architectures x84 et x64. Autrement dit, l’installation "facile" (que j’avais expliquée dans mon article ) ne marche pas sur le Raspberry et il faut compiler soi même le programme.

    Par manque de temps (et par fainéantise), j’ai préféré récupérer un binaire déjà compilé (en version 7.1a) plutôt que de le faire moi-même (pourquoi réinventer la roue ?). Je vous le propose à mon tour : vous pouvez le récupérer en tapant cette commande en tant que root sur votre Raspberry Pi :

    wget https://generation-linux.fr/dl/truecrypt -O /usr/local/bin/truecrypt && chmod +x /usr/local/bin/truecrypt

    Cette commande va :

    1. récupérer le binaire trucrypt compatible avec le Raspberry Pi (fonctionne avec la Raspbian Wheezy) ;
    2. le mettre dans le répertoire /usr/local/bin () ;
    3. le rendre exécutable.
      Désormais, vous pouvez utiliser truecrypt en l’appelant simplement dans votre ligne de commande :

    truecrypt –version

    Montage (déchiffrage) du disque dur externe

    Une fois que truecrypt est installé, je vais pouvoir l’utiliser pour déchiffrer mon disque dur externe. Avant cela, un df me montre que mon disque n’est pas encore monté sur mon système :

  • [email protected] :~# df
    Sys. fich. 1K-blocks Util. Disponible Uti% Monté sur
    rootfs 15443952 2076020 12583668 15% /
    /dev/root 15443952 2076020 12583668 15% /
    devtmpfs 240516 0 240516 0% /dev
    tmpfs 49756 260 49496 1% /run
    tmpfs 5120 0 5120 0% /run/lock
    tmpfs 99500 0 99500 0% /run/shm
    /dev/mmcblk0p1 57288 21056 36232 37% /boot *

    Pour le monter, il suffit de taper la commande suivante : truecrypt /dev/sda1 /mnt/
    Truecrypt me demande le mot de passe associé à mon disque dur, mon keyfile (tapez entrer directement si vous n’en avez pas) et s’il faut monter un dossier caché. Une fois ceci fait, vous verrez que le disque est bien monté dans le répertoire /mnt/ :

  • [email protected] :~# truecrypt /dev/sda1 /mnt/
    Enter password for /dev/sda1:
    Enter keyfile [none]:
    Protect hidden volume (if any)? (y=Yes/n=No) [No]:

  • [email protected] :~# df
    Sys. fich. 1K-blocks Util. Disponible Uti% Monté sur
    rootfs 15443952 2076028 12583660 15% /
    /dev/root 15443952 2076028 12583660 15% /
    devtmpfs 240516 0 240516 0% /dev
    tmpfs 49756 264 49492 1% /run
    tmpfs 5120 0 5120 0% /run/lock
    tmpfs 99500 0 99500 0% /run/shm
    /dev/mmcblk0p1 57288 21056 36232 37% /boot
    /dev/mapper/truecrypt1 153835300 67334292 78686572 47% /mnt *

    Un petit ls -l /mnt/ me confirme bien que mon disque est monté et lisible :

  • [email protected] :~# ls -l /mnt/
    total 28
    drwxr-xr-x 2 root root 4096 avril 9 05:27 Papiers
    drwxrwxr-x 3 root pi 4096 avril 20 15:54 Photos
    -rw-r–r– 1 root root 0 avril 25 07:49 truecryptok *

    Notez qu’à chaque redémarrage du Raspberry Pi, il faudra vous y connecter et remonter le volume truecrypt.

Synchronisation des données

Script de synchronisation

J’ai décider d’utiliser rsync pour synchroniser les données présentes sur le deuxième disque dur de mon serveur avec le Raspberry Pi distant. Voici le script que je vais utiliser :

/bin/bash

AUTH=" [email protected] "
FICHIER_LOG="./logs/backup_raspi.log"
/bin/rm $FICHIER_LOG
/usr/bin/touch $FICHIER_LOG

FileExists=ssh -p 2345 ${AUTH} "test -e /mnt/truecryptok && echo 1 || echo 0"

if [ ${FileExists} = 0 ]
then

echo "non"

echo "Le volume truecrypt n’est pas monté sur raspi" | /usr/bin/mail -s "Problème sauvegarde raspi" [email protected]
else

Le répertoire est monté

/usr/bin/rsync -rlpgotD -e ssh –compress –stats –verbose –delete –force /backup/* ${AUTH}:/mnt/ >> $FICHIER_LOG

/usr/bin/rsync -rlpgotD –rsh=’ssh -p2345′ –compress –stats –verbose –delete –force /backup/* ${AUTH}:/mnt/ >> $FICHIER_LOG
fi

Voici les explications des points spéciaux :

Mon script doit avant tout tester si le volume truecrypt est bien monté sur le Raspberry Pi . Pour faire cela, dans le disque dur externe (chiffré) du Raspberry, j’ai créé le fichier truecryptok. Ce fichier n’apparaît donc que lorsque le volume est monté (déchiffré). La commande passée dans la variable FileExist va contrôler à distance que ce fichier est bien présent. Si la commande renvoi 0 c’est qu’il n’est pas présent (ou que la connexion SSH ne marche pas), je m’envoie donc un mail pour m’avertir de monter le volume et de relancer la sauvegarde. Sinon, c’est que le volume est déjà monté et je lance ma commande de synchro rsync. Notez que j’ai ouvert mon serveur SSH sur le port 2345, mes commandes incluent ce port différent.

Désormais, en lançant mon script depuis mon serveur perso, il me demande le mot de passe de mon Raspberry Pi et la synchronisation se passe correctement.

Connexion automatique

Une dernière chose à régler pour automatiser le tout c’est d’empêcher la demande de mot de passe SSH quand on lance une synchro. Pour ce faire, on va établir une authentification SSH avec clés publique/privée entre mon serveur et mon Raspberry Pi. J’avais expliqué ce mécanisme dans cet article il y a un peu plus de 5 ans (déjà !).

Pour résumé, sur mon serveur perso, j’ai tapé la commande ssh-keygen -t rsa (puis entrée à chaque fois), ce qui m’a généré une clé publique et une clé privée dans mon répertoire .ssh. J’ai ensuite utilisé la commande ssh-copy-id "-p 2345 [email protected] " pour envoyer la clé publique ainsi générée sur mon Raspberry Pi.

Ceci étant fait, comme je n’avais mis aucune passphrase lors de la génération de mes clés, je peux désormais me connecter (avec le compte qui m’a servi à générer les clés) en tant que root sur le Raspberry Pi sans aucune demande de mot de passe.

De cette manière, j’ai pu automatiser la synchro en faisant exécuter mon script via un cron toutes les nuits (à 23h15) :

15 23 * /rep/de/script/backup_raspi.sh >/dev/null 2>&1

Conclusion

La mise en place est terminée. Le disque de backup de mon serveur est désormais synchronisé toutes les nuits sur un disque dur externe distant et chiffré.

Si vous avez des remarques, si vous avez des conseils pour améliorer mon système et/ou mes scripts, n’hésitez pas, je suis tout ouïe 🙂