Sauvegardes distantes chiffrées avec un Raspberry Pi, Truecrypt et Rsync
Cet article a été publié par Benjamin
le 29-04-13 à 16:07 dans la catégorie Auto hébergement
Tags :
- auto-hebergement
- Libre
- Raspberry Pi
- Serveur
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 :)
Commentaires
Bonjour,
Les sauvegardes doivent toujours se faire dans l'autre sens: le système de sauvegarde doit venir chercher les fichiers préparés sur la machine à sauvegarder. Tel que le système est configuré, si ta machine principale est piraté, le pirate aura vite fait de supprimer toutes tes sauvegardes.
Bonjour
Peux tu utiliser à la place de rsync, le logiciel csync2. Cela te permet de faire de la synchronisation bidirectionnelle. Et ça vaut peut etre aussi le coup d'intégrer des sommes de controles pour tes backups. Peut être même peux tu utiliser parchive, histoire de sécuriser encore mieux tes données.
@skc : tu as raison, je suis un boulet, ça ne m'avait jamais traversé l'esprit... Je vais corriger tout ça et je publierai mes nouveaux scripts. Merci pour la piqure de rappel !
@Bidibulle : Je ne connaissais pas ces applis, je vais jeter un oeil là dessus aussi.
Bonjour,
Une question ? Tu n'as pas de problème de reconnexion de ton Wifi lorsque la Box reboote car c'est le problème que je rencontre et il a fallu que je fasse un script qui force un up de la connexion.
Je n'ai pas souvenir de ce genre de problème mais je ne suis pas certain que la box ai déjà rebootée. J'ai testé le changement d'IP en désactivant la connexion via l'addmin de la livebox mais je ne crois pas l'avoir rebooté.
Dès que je retourne là bas, je teste ça.
@skc "Les sauvegardes doivent toujours se faire dans l'autre sens"
Pas forcement, et cela impose d'avoir confiance dans l'emplacement distant. Autoriser un accès a ton server/infra depuis un petit raspberry pi n'est pas du tout sécurisé d'un point de vue physique... Et il faudra aussi gérer la sécurisation du systeme sur ce dernier..
C'est la réflexion que j'étais en train de me faire. Actuellement, mon disque de backup (sur mon serveur perso) n'est assessible en entier que par root.
Cela m'embête de mettre un accès SSH sans mot de passe depuis le Raspberry Pi vers mon serveur perso en tant que root. Donc soit je reste dans le sens là, soit je change les droits sur mon répertoire de backup... À voir
Pourquoi avoir utiliser Truecrypt plutôt qu’une solution intégré au noyau: luks/cryptsetup sur la partition root?
> 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 :)
Salut, voici quelques remarques qui me vienne a l'esprit..
- Pour les commentaires ou c'est le serveur ou sont stoqués les backups qui se connecte sur la machine a backuper.. et la sécurité qui va avec..:
il est possible de restreindre la clé SSH en question a uniquement certaines commandes.
Exemple avec rdiff-backup
command="rdiff-backup
serverrestrict-read-only /"De cette manière, meme si le serveur ou sont stoqués les backup est compromis, et meme si ce serveur
peut se connecter en SSH sur la machine a backuper (pour lire/prendre les fichiers a backuper),
il ne sera pas possible pour autant d'y avoir un shell, d'y supprimer des fichiers etc...
- Concernant le script et TrueCrypt, pourquoi ne pas rajouter au début du script le "montage" du répertoire en clair..
Puis a la fin du backup, le "démontage" ..
De cette manière le disque restera chiffré tout le temps ou le backup n'est pas en cours... (un peu + secure)
Cela permet également au script de fonctionner apres un reboot du rasp des beaux parents ;)
Certe, le pass serait dans le script..? Mais est ce grave vu que ca permet d'accéder
a des données qu'on a deja en local ?
> Déchiffrage du disque dur
A ma connaissance on utilise plutôt de mot "Déchiffrement"
- "pourquoi réinventer la roue ?"
> 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 ?)
Dans le cas d'un logiciel de chiffrement, je préfère généralement prendre la roue chez l'auteur, dans les depots officiels..
ou a defaut refabriquer la roue soi-même.. car rien ne dit qu'une "backdoor" n'a pas été introduite par la personne tierce
lors de la compilation..
Pour un soft lambda.. pourquoi pas (je le fais aussi ;) ) mais pour un soft de chiffrement...
Je ne dis pas qu'une backdoor a été introduite.. je donne juste une raison pour "réinventer la roue" dans ce cas précis ;)
Sinon, l'idee est tres bonne, et je vrais probablement monter quelquechose de similaire (mais probablement différent ;) )
avec rdiff-backup au lieu de rsync..(gere les anciennes versions) et peut etre encfs ou LUKS au lieu de TrueCrypt (pour ne pas avoir de containeur de taille fixe entre autre) (Meme si j'aime bien TrueCrypt.. et que je le connais plutot bien)
Il faut que je teste aussi les perfs...) .. A suivre..
Merci
Hello
Une commande qui peut t'intéresser: `mountpoint` avec l'option -q elle répond 1 ou 0 si le répertoire en paramètre est un point de montage valide ou non (donc si le répertoire distant est monté ou non)
ça ne te dira pas spécialement que la connexion ne fonctionne pas, mais pas plus qu'avec ta solution à mon avis
Quitte à ne pas réinventer la roue .. :p
Merci pour ce post en tout cas, j'ai envie de m'y mettre !
@Yannick: tu risques de rencontrer un problème de performances avec rdiff-backup, j'ai eu beaucoup de retours en ce sens.
Par contre si tu maitrises bien les scripts shell tu devrais pouvoir faire la même chose avec rsync
@Epy
Ok.. merci.. Est ce que tu peux me donner + de details sur les types de problème de performance que tu as rencontré?
Car sur le papier "rdiff-backup uses librsync, which implements the same efficient diffing algorithm that rsync uses."
(une recherche me donne quelques trucs de 2009 ou des trucs vagues.. )
Mais comme je l'ai dit, "Il faut que je teste aussi les perfs"...
Pour rsync seul, il ne conserve pas les "anciennes versions". C'est a dire que une fois la syncro effectuée.. tu "perds" dans la "sauvegarde" l'ancienne version d'un document.
Il est effectivement surement possible de modifier ce "comportement" en jouant en scriptant des trucs a coté de rsync.. mais il sera difficile d'arriver a ce qu'il est possible de faire avec rdiff-backup a ce niveau..
Billet, très très intéressant il serait aussi sympa d'avoir la remontée des infos smart du disque dur pour ainsi pouvoir anticiper un éventuel problème.
Malheureusement c'est une chose que je n'arrive pas à faire au travers du port USB du raspberry.
Bonjour,
J'ai trouvé ton tuto très intéressant même si mon niveau ne me permet pas de saisir touts les opérations.
Je suis malgré tout parvenu a faire en parti ce que je souhaitais.Mon problème est que j'ai bien monté mon disque crypté et je peux le voir en SSH (il me liste les répertoires présents etc...) mais impossible de le voir dans Raspbmc ou sur un pc (avec samba je pense).
Avez vous une idée?
Merci
Question 1 : connais-tu un logiciel qui synchro mais sur Windows pour ton tuto?
Question 2 : si je vais sur ton RPI à chaud en me branchant directement dessus, j'ai accès à toutes tes données vu que le disque dur doit être en permanence monté ! comment bypasser ce problème de sécurité ?
Pour TrAsHeR
Question 1 : Pour la synchro depuis windows tu peux utiliser synchronizer http://neofreeware.free.fr/freeware...
Simpliste et efficace (un genre de rsync sous windows)
Question 2 :
Si tu te branches directement dessus genre avec clavier/écran/souris tu auras une bannière d'authentification demandant login/mdp. Bref tu ne pourras pas te logger donc tu n'auras pas accès aux données.
Tu vas répondre que tu pourrais alors faire une procédure de récup de mot de passe vu que tu as accès au matos pour changer le mdp root. Bon il y aura toujours un soucis. Mais quel est le risque réel ?
Bonjour
"Notez qu'à chaque redémarrage du Raspberry Pi, il faudra vous y connecter et remonter le volume truecrypt."
Il n'est pas possible de le monter automatiquement avec fstab ?
En tout cas merci pour ces informations, qui vont m'être bien utiles dans ma propre tentative d'auto-hébergement :)
Le problème si on veut faire un montage automatique c'est qu'il faut écrire le mot de passe quelque part sur le serveur, du coup, en cas de piratage, l'attaquant récupère le mot de passe et le chiffrement ne sert plus à rien :)
Ah, oui ... Je n'y avais pas pensé ^^'