Aller au contenu

Sauvegarde distante sur un disque dur externe chiffré

secret

Aujourd'hui, un article sur la mise en place d'une sauvegarde "distante" de ses fichiers sur un disque dur externe chiffré branché sur un raspberry. Je vais vous décrire cela sur un disque dur que j'ai à la maison, mais je l'ai autrefois fait sur un disque dur installé chez quelqu'un, cela fonctionne aussi. Il est juste nécessaire dans ce cas que la personne chez qui vous déposez le raspberry ait une ip fixe ou un nom de domaine et de rediriger les ports qui vont bien vers le raspberry.

Comme souvent, la majorité des commandes sont à faire en root ou avec sudo.

Accès SSH sans mot de passe

Je ne vais pas vous redécrire l'opération, vous trouverez cela facilement sur internet, j'ai également un article en cours de rédaction sur le sujet. C'est important pour automatiser la sauvegarde.

La création du volume chiffré sur son disque dur externe

Rendez-vous sur le raspberry où est branché votre disque dur externe, ou bien vous pouvez brancher le disque dur sur votre ordinateur. Il sera nécessaire de supprimer les données du disque ou au moins de la partition que l'on veut chiffrer.

Il est d'abord nécessaire d'installer cryptsetup si ce n'est pas le cas, exemple sur une debian :

apt install cryptsetup

On cherche notre disque dur :

lsblk

On créé la partition qui sera chiffrée ensuite sur le disque trouvé (attention à ne pas se tromper de disque) :

cfdisk /dev/sda

Vous arriverez sur l'interface de cfdisk qui vous permettra de supprimer la ou les partitions que vous souhaitez puis d'en créer une nouvelle à chiffrer. On ne formate pas la partition nouvellement créée.

On chiffre la nouvelle partition :

cryptsetup --verify-passphrase luksFormat /dev/sda1

Cherchez dans le manuel de cryptsetup mais on peut spécifier des paramètres :

cryptsetup --verify-passphrase --cipher serpent-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1

On vous demandera confirmation pour effacer les données et d'entrer votre nouvelle passphrase (deux fois).

On ouvre ensuite le conteneur en lui donnant un nom (ici, je l'appelle cryptWD, on pourra le changer à chaque fois qu'on l'ouvrira) :

cryptsetup luksOpen /dev/sda1 cryptWD

La partition sera alors accessible via /dev/mapper/cryptWD

Il suffit ensuite de formater la partition :

mkfs.ext4 /dev/mapper/cryptWD

Enfin, on monte la partition :

mount /dev/mapper/cryptWD /mnt

Automatisation de l'ouverture du conteneur

Nous avons créé notre conteneur et vu comment l'ouvrir puis le monter. Pour automatiser l'ouverture et le montage, rendez-vous sur cet article qui décrit toute la démarche.

La sauvegarde

Tout est en place maintenant pour faire la sauvegarde :

  • notre disque dur contient une partition chiffrée qui s'ouvre et se monte automatiquement au démarrage du système
  • nous avons accès à notre système distant sans mot de passe

Nous allons maintenant passer au script de sauvegarde. Je vous mets en exemple, le script bash que j'utilise. Il est à adapter :

  • SOURCE >> les fichiers à sauvegarder
  • LOGFILE >> où vous sauvegarder les logs de la sauvegarde
  • SERVDEST >> ip de mon raspberry où est branché le disque dur chiffré

J'ai crée une fonction pour chaque dossier, cela me permet de bien séparer les choses et d'en ajouter ou supprimer facilement.

Mon fichier exclusions_rsync.txt contient les lignes suivantes :

.recycle
@Recycle
.Trash
#! /bin/bash
#Variables
PORT=22
EXCLUDEFILE="/srv/mergerfs/DATA/Informatique/Backups/Rsync_RPI/exclusions_rsync.txt"
DATEFICHIER=$(date +%Y.%m.%d_%H.%M.%S)
LOGFILE="/srv/mergerfs/DATA/Informatique/Backups/Rsync_RPI/logs/rsync_$DATEFICHIER.log"
SOURCE="/srv/mergerfs/DATA/"
USER="user"
SERVDEST="192.168.1.51"
PATHDEST="/mnt/cryptWD/"
OPTIONS="-ah --ignore-existing --info=MISC2,PROGRESS2,STATS2 --exclude-from=$EXCLUDEFILE --log-file=$LOGFILE --log-file-format="
DATEDEBUT=$(date +%Y.%m.%d_%H.%M.%S)
DebutFichier(){
    echo "Début de la sauvegarde - $DATEDEBUT" >> $LOGFILE
    echo "" >> $LOGFILE
}
SauvegardeHomes(){
    echo "Sauvegarde du dossier Homes" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Homes/" $USER@$SERVDEST:$PATHDEST"Homes/"
    echo "" >> $LOGFILE
}
SauvegardeInformatique(){
    echo "Sauvegarde du dossier Informatique" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Informatique/" $USER@$SERVDEST:$PATHDEST"Informatique/"
    echo "" >> $LOGFILE
}
SauvegardeLivres(){
    echo "Sauvegarde du dossier Livres" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Livres/" $USER@$SERVDEST:$PATHDEST"Livres/"
    echo "" >> $LOGFILE
}
SauvegardeMusique(){
    echo "Sauvegarde du dossier Musique" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Musique/" $USER@$SERVDEST:$PATHDEST"Musique/"
    echo "" >> $LOGFILE
}
SauvegardePhotos(){
    echo "Sauvegarde du dossier Photos" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Photos/" $USER@$SERVDEST:$PATHDEST"Photos/"
    echo "" >> $LOGFILE
}
SauvegardePublic(){
    echo "Sauvegarde du dossier Public" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Public/" $USER@$SERVDEST:$PATHDEST"Public/"
    echo "" >> $LOGFILE
}
SauvegardeTelechargements(){
    echo "Sauvegarde du dossier Telechargements" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Telechargements/" $USER@$SERVDEST:$PATHDEST"Telechargements/"
    echo "" >> $LOGFILE
}
SauvegardeVideos(){
    echo "Sauvegarde du dossier Videos" >> $LOGFILE
    rsync -e "ssh -p $PORT" $OPTIONS $SOURCE"Videos/" $USER@$SERVDEST:$PATHDEST"Videos/"
}
FinFichier(){
    DATEFIN=$(date +%Y.%m.%d_%H.%M.%S)
    echo "Fin de la sauvegarde - $DATEFIN" >> $LOGFILE
}
EnvoiMail(){
    echo "La sauvegarde s'est terminée" | mutt -s "Sauvegarde réussie" -a $LOGFILE -- [email protected]
}
main(){
    DebutFichier
    SauvegardeHomes
    SauvegardeInformatique
    SauvegardeLivres
    SauvegardeMusique
    SauvegardePhotos
    SauvegardePublic
    SauvegardeTelechargements
    SauvegardeVideos
    FinFichier
    EnvoiMail
}
main

Il vous suffit ensuite de tester le script avant de passer à l'étape suivante.

Planification de la sauvegarde

Enfin, on planifie la sauvegarde avec un petit crontab -e et on ajoute la ligne qui va bien, pour mon exemple :

30 3 * * 7 bash /srv/mergerfs/DATA/Informatique/Backups/Rsync_RPI/sauvegarde.sh

Me permet de faire ma sauvegarde toutes les semaines le lundi matin à 3h30.