Sauvegardes distantes chiffrées avec un Raspberry Pi, Truecrypt et Rsync
Je vous l'avait dit, je voulais mettre en place un système de sauvegarde distante de mon serveur perso. Ces sauvegardes devaient être automatiques, sécurisées et peu coûteuses en énergie. J'ai trouvé mon bonheur avec la mise en place d'un Raspberry Pi, loin de chez moi, sur lequel j'ai branché un disque dur externe chiffré et où mes sauvegardes sont exportées (synchronisées) toutes les nuits. Voici comment j'ai fait :
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 :
- Installation du Raspberry Pi
- Déchiffrage du disque dur
- 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 :
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 leur documentation 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 http://www.generation-linux.fr/dl/truecrypt -O /usr/local/bin/truecrypt && chmod +x /usr/local/bin/truecrypt
Cette commande va :
- récupérer le binaire trucrypt compatible avec le Raspberry Pi (fonctionne avec la Raspbian Wheezy) ;
- le mettre dans le répertoire /usr/local/bin (pourquoi ce répertoire ?) ;
- 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 :
root@yoshi:~# 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/ :
root@yoshi:~# truecrypt /dev/sda1 /mnt/
Enter password for /dev/sda1:
Enter keyfile [none]:
Protect hidden volume (if any)? (y=Yes/n=No) [No]:root@yoshi:~# 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 :
root@yoshi:~# 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="root@raspi.distant.fr"
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" mon@mail.fr
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 root@raspi.distant.fr"
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 :)