Sauvegarde d’un ordinateur personnel avec BorgBackup

Dans notre quête du système de sauvegarde parfait, attaquons-nous au gros du problème : la mise en place des sauvegarde d’un ordinateur personnel.

Grâce aux étapes précédentes, on a :

  • Un serveur de sauvegarde :
    • allumé 24/7 ;
    • sur lequel est installé BorgBackup ;
    • autorisant l’ajout de sauvegarde avec une clé SSH publique sans mot de passe ;
  • Un ordinateur personnel :
    • parfois éteint ;
    • sur lequel est installé BorgBackup ;
    • disposant de la clé SSH privée sans mot de passe.

Il ne reste plus qu’à installer un script sur l’ordinateur pour effectuer automatiquement des sauvegardes à intervalle régulier.

Prise en main de BorgBackup

L’utilisation de BorgBackup n’est pas triviale, il est donc intéressant d’en lire la documentation officielle. Cela permettra de comprendre ce qu’il est possible de faire, comment, et surtout de connaitre certaines limitations du logiciel. Ce n’est pas si long, donc avant toute utilisation sérieuse du logiciel, je vous invite à en prendre connaissance (on vous a déjà dit que les sauvegardes étaient un sujet sérieux ?).

Le principe de base est le suivant :

  1. Dans un premier temps, on crée un dépôt avec la commande suivante :

    borg init -e 'repokey' "adresseDuDépôt"
    
  2. On lance ensuite une sauvegarde avec la commande :

    borg create "adresseDuDépôt"::"nomDeLaSauvegarde" "dossiers à sauvegarder"
    

Dans mon cas, ça donne à peu près ça (il vous sera demandé le mot de passe de connexion au serveur, puis la clé de déchiffrement du dépôt) :

borg init -e 'MaCléDeChiffrement' ssh://pi@192.168.0.26/mnt/BackupWD2T/Backups/laptop/
borg create ssh://pi@192.168.0.26/mnt/BackupWD2To/Backups/laptop::laptop-{now} /

Ensuite, l’accès aux données peut se faire comme ça :

mkdir ~/pointdemontage
borg mount ssh://pi@192.168.0.26/mnt/BackupWD2To/Backups/laptop/ ~/pointdemontage

J’ai vérifié deux ou trois choses qui m’intéressent :

  • Il est possible de “déplacer” le dépôt, par exemple en débranchant le disque dur du serveur de sauvegarde pour le brancher directement sur l’ordinateur personnel (par exemple pour la première sauvegarde qui demande le transfer de plusieurs centaines de Go). Dans ce cas, Borg va détecter que le dépôt que l’on désigne via un borg create "/nouveau/chemin/local"::"grosseSauvegarde" a changé de chemin et demandera confirmation ;
  • Pour chaque dépôt, un cache est conservé sur le client (dans ~/.cache/borg/), il est réutilisé quel que soit le chemin vers le dépôt.
  • Ce cache doit être généré chez chaque client/utilisateur qui va accéder au dépôt, donc il vaut mieux n’y accéder qu’à partir d’un seul utilisateur, sur une seule machine.
  • Attention aux problèmes de droits sur le dépôt en lui-même. C’est pour ça que j’utilise une partition NTFS, qui “fixe” les droits. Sur une partition ext4, des problèmes se présenteront forcément lorsqu’on passe le disque dur externe d’un ordinateur à un autre.
  • Attention aux problèmes de droits sur le cache et la configuration locale (~/.config/borg/), en particulier si on lance les sauvegardes avec un sudo (pour avoir accès à la totalité du système par ex.). En effet, une fois que le cache et la config appartiennent à root, l’utilisateur normal ne peut plus y accéder sans récupérer auparavant la possession de ces fichers.

    TODO: Parler de https://borgbackup.readthedocs.io/en/stable/usage/serve.html et des limitations de —append-only

Usage concret - script simple

Je m’inspire de plusieurs sources, dont en particulier l’exemple de script donné dans la documentation officielle de Borg.

Commençons par un script simple. Je crée un script via sudo nano /opt/sauvegardeBorg.sh dans lequel je mets ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
export BORG_REPO=ssh://pi@192.168.0.26/mnt/BackupWD2T/Backups/laptop/
export BORG_PASSPHRASE='MaCleDeChiffrement'
export BORG_RSH='ssh -oBatchMode=yes -i /root/.ssh/id_rsa_borg'

nice -n 19 ionice -c 3 borg create  \
    --verbose                       \
    --filter AME                    \
    --list                          \
    --stats                         \
    --compression lz4               \
    --exclude-caches                \
    --exclude '/cdrom'              \
    --exclude '/dev'                \
    --exclude '/media'              \
    --exclude '/mnt'                \
    --exclude '/proc'               \
    --exclude '/run'                \
    --exclude '/swapfile'           \
    --exclude '/sys'                \
    --exclude '/tmp'                \
    --exclude '/var/cache'          \
    --exclude '/var/run'            \
    --exclude '/var/tmp'            \
    --exclude '/home/*/.cache'      \
                                    \
    ::'{hostname}-{now}'            \
    /                               \

borg prune                          \
    --list                          \
    --prefix '{hostname}-'          \
    --show-rc                       \
    --keep-within   15d             \
    --keep-daily    7               \
    --keep-weekly   4               \
    --keep-monthly  12              \

Je m’assure que le script appartient à l’utilisateur root et que celui-ci est le seul à pouvoir le lire, le modifier et l’exécuter.

$ sudo chown root:root /opt/sauvegardeBorg.sh
$ sudo chmod 0700 /opt/sauvegardeBorg.sh
$ ls -l /opt/sauvegardeBorg.sh
-rwx------ 1 root root 3299 mars  25 12:50 /opt/sauvegardeBorg.sh

On peut désormais lancer la sauvegarde via un simple :

$ sudo bash /opt/sauvegardeBorg.sh

Sauvegarde à intervalle régulier

Pour qu’une sauvegarde soit efficace, il faut qu’elle s’exécute automatiquement. On pourrait penser qu’un cron serait suffisant, mais l’ordinateur n’étant pas allumé en permanence, un cron se lançant à heure fixe ne sera pas forcément d’une grande utilité. En revanche, anacron sera bien plus utile : configuré pour s’exécuter quotidiennement, il se lancera chaque jour heure fixe si l’ordinateur est allumé, et s’exécutera au démarrage si l’heure habituelle a été loupée.

Anacron est installé par défaut sur Ubuntu. Dans le cas contraire, l’installer puis créer un lien symbolique entre notre script et le dossier cron.daily :

sudo ln -s /opt/sauvegardeBorg.sh /etc/cron.daily/sauvegardeBorg.sh

Et voilà, il n’y a plus rien à faire, on a une sauvegarde qui se lance quotidiennement (tous les jours à 07h30, ou au démarrage de l’ordinateur).

Script complet

Le script simple présenté ci-dessus fonctionne, mais il lui manque de nombreuses fonctionnalités :

  • Il ne nous prévient pas de sa réussite ou de son échec
  • Il n’a aucune gestion des erreurs
  • Un attaquant pourrait supprimer l’ensemble des sauvegardes via un borg prune avec les données contenues dans le script (clé de chiffrement et clé SSH sans mot de passe).

Sécurisation des sauvegardes contre une suppression malveillante

TODO

Information automatique

Étant utilisateur d’une ligne de téléphone mobile chez Free, j’ai accès à une super fonctionnalité : la possibilité de m’envoyer un SMS via une API gratuite.

TODO

Gestion des erreurs

Par expérience, j’ai connu de nombreux cas de figure dans lesquels la sauvegarde échouait. Listons-les :

  • Le serveur de sauvegarde est injoignable.
    Causes possibles :
    • Il est éteint ;
    • Il est allumé, mais ne répond pas au réseau ;
  • La connexion SSH échoue.
    Causes possibles :
    • Le serveur SSH a planté ;
    • Le serveur refuse la connexion SSH ;
    • L’authentification échoue (mauvais mot de passe ou mauvaise clé) ;
  • La sauvegarde échoue malgré une connexion SSH réussie.
    Causes possibles :
    • Borg n’est pas installé ;
    • Le dépôt de sauvegardes n’est pas disponible (le disque est déconnecté ou le dossier du dépôt n’est pas disponible) ;
    • Le dépôt Borg est verrouillé ;

Le script de sauvegarde doit donc les prévoir et s’adapter, avant de nous prévenir avec un message précis et utile.

Mise en œuvre : le script complet

TODO

Sources :

  • https://blog.andrewkeech.com/posts/170719_borg.html