Table of Contents

BORG: Les bases

Présentation

Borg est un outil de sauvegarde incrémentielle en ligne de commande écrit en Python. C’est un fork d’Attic mais un peu plus en avance puisqu’il corrige pas mal de bug d’Attic et propose des fonctionnalités supplémentaires (choix de la compression, par exemple).En outre le projet est très actif et en constante évolution.

Une des particularités de Borg est qu’il supporte la déduplication, c’est-à-dire que les fichiers sauvegardés sont découpés en une multitude de tronçons, et Borg ne sauvegarde que les tronçons qui ont été modifiés depuis la dernière sauvegarde, d’où une économie substantielle en termes d’espace disque et un gain lors de transfert des sauvegardes distantes. De plus Borg gère différents types de compression permettant de diminuer encore la taille des sauvegardes ainsi que le chiffrement en AES 256-bit.

Particularités principales

Installation

Le paquet borgbackup, disponible dans les dépôts de la distribution ou via pip, doit être installé sur tous les serveurs.

Installation sur Ubuntu

Le paquet borgbackup, disponible dans les dépôts des distributions récentes.

Pour les ancienns versions ajouter le repository borgbackup backports

$ sudo -HE add-apt-repository ppa:costamagnagianfranco/borgbackup

puis

$ sudo apt install borgbackup

Les NOUVEAUX paquets suivants seront installés :
   borgbackup libb2-1 libzstd1 python3-llfuse python3-msgpack

Installation sur Centos

Le paquet borgbackup, est disponible dans les dépôts EPEL.

Activer le dépôt dans /etc/yum.repos.d/epel.repo

[epel]
enabled=1
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority

Installer le rpm borgbackup

$ yum install borgbackup

 Installé :
   borgbackup.x86_64 0:1.1.8-2.el7                                               

 Dépendances installées :
   fuse.x86_64 0:2.9.2-11.el7                                                    
   fuse-libs.x86_64 0:2.9.2-11.el7                                               
   libzstd.x86_64 0:1.3.8-1.el7                                                  
   lz4.x86_64 0:1.7.5-2.el7                                                      
   python34.x86_64 0:3.4.9-1.el7                                                 
   python34-libs.x86_64 0:3.4.9-1.el7                                            
   python34-llfuse.x86_64 0:1.0-1.el7                                            
   python34-msgpack.x86_64 0:0.5.6-4.el7                                         
   python34-setuptools.noarch 0:39.2.0-2.el7                                     
 
 Dépendances mises à jour :
   openssl.x86_64 1:1.0.2k-16.el7       openssl-libs.x86_64 1:1.0.2k-16.el7  

Interface graphique

Vorta permet d’offrir la possibilité de faire des sauvegardes chiffrées, dédupliquées et compressées facilement.

Vorta est open source et permet de gérer différents profils de sauvegardes, plusieurs sources, plusieurs destinations, ainsi qu’une planification des sauvegardes.

Installation

Installer les dépendances

$ sudo apt install -y python3-pip libqt5x11extras5-dev libxcb-xinerama0

Installer les packages python

$ pip3 install vorta

Installing collected packages: appdirs, pytz, six, setuptools, tzlocal, apscheduler, asn1crypto, pycparser,
cffi, cryptography, jeepney, secretstorage, entrypoints, keyring, bcrypt, pynacl, pyasn1, paramiko, peewee,
psutil, PyQt5-sip, pyqt5, python-dateutil, qdarkstyle, vorta

intégration sur le bureau

À moins que Vorta ne soit démarré avec l'option –foreground, il sera réduit dans la barre d'état système sans ouvrir de fenêtre de paramètres. Assurez-vous que votre environnement de bureau prend en charge les icônes de la barre des tâches, par exemple. installer l'extension xfce4-indicator-plugin

 $ sudo apt-get install -y xfce4-indicator-plugin

Utilisation

Variables d'environnement

Borg permet de définir plusieurs variables d'environnement afin de simplifier les commandes exécutées, dont :

Lors de l'utilisation de Borg avec sudo, il est nécessaire de passer le paramètre -i à sudo, pour que les données (cache, clé de chiffrement, etc.) soit écrites et lues dans le répertoire /root.

Opérations de base

Initialisation

L'initialisation d'un dépôt de sauvegarde Borg se fait à l'aide de la commande borg init. Le paramètre chemin passé en paramètre peut être un emplacement local (absolu ou relatif), ou un emplacement distant en utilisant la syntaxe <user>@<host>:<path>. Dans le cas d'un dépôt distant, l'accès se fait par SSH, et nécessite que Borg soit installé sur la machine distante.

 $ borg init --encryption {none,keyfile,repokey} /home/babar/borg_backup 
 

Le paramètre –encryption (abrégé -e) permet de définir la manière dont la sauvegarde est chiffrée ::

Il est vital de sauvegarder le fichier /home/babar/borg_backup/config dans le mode repokey et le dossier /home/babar/.config/borg/keys dans le mode keyfile car en cas de perte on ne pourra pas déchiffrer les sauvegardes.

Création d'une sauvegarde

borg create est la commande la plus importante car c’est elle qui effectue la sauvegarde. Évidemment la première sauvegarde est la plus longue.

 $ borg create -v --stats /home/babar/borg_backup::{hostname}_{now:%d.%m.%Y} /home/babar/syncthing /etc /var/www

Le premier paramètre est le nom de la sauvegarde, de la forme <RepoPath::SaveName>, suivi des fichiers et répertoires à sauvegarder.

Le nom de la sauvegarde peut contenir des chaînes réservées, remplacées par une valeur spécifique, dont :

Pour les valeurs {now} et {utcnow}, il est possible de définir le format, au moyen de cette syntaxe : {now:%Y%m%d-%H%M%S}. Les éléments de formattage utilisés sont ceux disponibles de Python.

Il est possible d'utiliser - comme nom de fichier pour sauvegarder les données envoyées à l'entrée standard de la commande Borg. Ces données sont enregistrées dans un fichier nommé stdin, placé à la racine de la sauvegarde.

Concernant les sauvegardes par script on peut utiliser export BORG_PASSPHRASE='monjolimotdepasse'. On peut également choisir le mode keyfile et renseigner un mot de passe vide.

#!/bin/bash

export BORG_PASSPHRASE='monjolimotdepasse'
REPOSITORY='/home/babar/borg_backup'

/usr/local/bin/borg create -v --stats $REPOSITORY::{hostname}_{now:%d.%m.%Y} /home/babar/syncthing /etc /var/www
/usr/local/bin/borg prune -v --keep-within=10d --keep-weekly=4 --keep-monthly=-1 $REPOSITORY

Parcourir les données sauvegardées

La commande borg list permet de lister le contenu d’un repository ou d’une sauvegarde.

Exemples :

$ # Lister les sauvegardes disponibles
$ borg list <RepoPath>
$ # Lister le contenu d'une sauvegarde
$ borg list <RepoPath>::<SaveName>

La commande borg info permet d'afficher quelques informations basiques sur une sauvegarde, comme les dates de début et de fin, la commande utilisée pour générer cette sauvegarde, la taille des données sauvegardées, ou encore l'espace disque total occupé :

$ borg info <RepoPath>::<SaveName>

Pour parcourir le contenu des sauvegardes de manière plus naturelle, la commande borg mount permet de monter le dépôt de sauvegarde dans un répertoire en utilisant fuse (Filesystem in USErspace). Le répertoire racine du point de montage contiendra alors une liste de répertoires, correspondant aux différentes sauvegardes disponibles, qu'il est possible d'explorer avec vos outils habituels, comme n'importe quel répertoire. Cette méthode est particulièrement pratique pour récupérer un fichier, voire une information précise dans un fichier, sans avoir à restaurer la totalité de la sauvegarde.

$ # Monter le dépôt de sauvegarde dans un répertoire
$ borg mount <RepoPath> <MountPointPath>
$ # Pour une sauvegarde réalisée en root, il est intéressant de permettre aux utilisateurs de la parcourir
$ sudo -i borg mount -o allow_other <RepoPath> <MountPointPath>

Restauration d'une sauvegarde

La restauration d'une sauvegarde peut être effectuée au moyen de la commande borg extract. Cette commande prend en paramètre le nom de la sauvegarde à restaurer, ainsi qu'une liste optionelle de chemins à restaurer depuis cette sauvegarde. Si aucun chemin n'est donné, la totalité de la sauvegarde est restaurée.

Les fichiers et répertoires restaurés sont écrits dans le répertoire courant. Il est possible de restaurer des données sur la sortie standard, au moyen du paramètre –stdout. Cela est utile pour les données sauvegardées depuis l'entrée standard, mais permet aussi de transférer directement un fichier provenant d'une sauvegarde complète à un programme.

Exemples :

$ # Restaurer une sauvegarde complète
$ borg extract <RepoPath>::<SaveName>
$ # Restaurer une partie de la sauvegarde
$ borg extract <RepoPath>::<SaveName> <Filename> <Path>/<Directory>
$ # Restaurer une base de données PostgreSQL
$ borg extract --stdout <RepoPath>::<SaveName> stdin | pg_restore -d <DbName>
$ # Lister le contenu d'une archive tar présente dans la sauvegarde
$ borg extract --stdout <RepoPath>::<SaveName> <FileName>.tgz | tar zt

Contrôler l'intégrité

La commande borg check permet de vérifier l'intégrité des données sauvegardées. Elle peut travailler sur le dépôt complet, ou sur une ou plusieurs sauvegardes.

Le paramètre –prefix (abrégé -P) détermine le préfixe du nom des sauvegardes à vérifier. Par défaut, toutes sont vérifiées.

Exemples :

$ # Vérifier le dépôt complet
$ borg check <RepoPath>
$ # Vérifier une unique sauvegarde
$ borg check <RepoPath>::<SaveName>
$ # Vérifier toutes les branches de la machine desktop
$ borg check --prefix=desktop <RepoPath>

Il existe aussi un paramètre –repair, permettant de tenter la réparation des données corrompues détectées, mais son utilisation est actuellement déconseillée, puisque cette fonctionnalité est encore expérimentale.

Libérer de l'espace disque

Lorsque le dépôt de sauvegarde devient trop gros, il peut être nécessaire de réduire l'espace disque utilisé.

Borg propose deux commandes pour cela :

borg delete

borg delete permet de supprimer une sauvegarde ou un repository entier.

$ borg delete /home/babar/borg_backup # Va supprimer le repository et donc toutes les sauvegardes contenues dedans
$ borg delete /home/babar/borg_backup::host_19.08.2016 # Va supprimer la sauvegarde du 19/08

borg prune

borg prune s’occupe de la rotation c’est-à-dire de respecter les règles de conservation/suppression des sauvegardes.

Les paramètres possibles sont :

Exemple de commande :

$ borg prune -v --keep-within=10d --keep-weekly=4 --keep-monthly=-1 /home/babar/borg_backup

Débloquer un dépôt verrouillé

Lorsqu'il travaille sur le dépôt, Borg le verrouille pour empêcher qu'une autre opération ne se lance en parallèle dessus. Tenter de lancer la création d'une sauvegarde, la restauration, ou simplement de lister les sauvegardes disponible renverra alors une erreur, indiquant que le dépôt de sauvegarde est verouillé.

Cependant, il peut arriver que le dépôt reste bloqué, suite à une coupure de la connexion réseau, ou un crash de Borg ou du système, par exemple. Dans ce cas, il est nécessaire de forcer le déverrouillage, au moyen de la commande borg break-lock.

Le dépôt est verrouillé lors de toutes les opérations. Par exemple, monter le dépôt dans un répertoire avec la commande borg mount verrouille aussi le dépôt. Vérifiez donc bien qu'aucune opération ne soit en cours avant de forcer le déverrouillage du dépôt, pour éviter toute corruption de données.

Sauvegarder et restaurer la clé de chiffrement

Sauvegarder la clé de chiffrement est fortement conseillé, surtout lorsqu'elle est conservée dans un fichier séparé du dépôt de sauvegarde. En effet, sans cette clé, les sauvegardes sont inutilisables.

Lors de l'utilisation du mode repokey, la clé étant sauvegardée dans le fichier de configuration du dépôt, il n'est pas vraiment nécessaire de la sauvegarder. Cependant, dans le cas où ce fichier serait endommagé, il peut être utile de le faire.

Borg propose plusieurs formats pour sauvegarder la clé de chiffrement, avec la commande borg key export :

Les deux formats destinés à être imprimés permettent de sauvegarder la clé de chiffrement hors de tout système informatique. Dans le cas du QR Code, le scanner avec un lecteur compatible permet de retrouver le contenu original de la clé. Dans le cas de la série de valeurs générée, elle est faite de manière à pouvoir vérifier, ligne par ligne, s'il y a eu des fautes de frappe, et ainsi simplifier la recherche d'une erreur dans ce cas.

L'import d'une clé est réalisé grâce à la commande borg key import. De la même manière que pour l'export, le paramètre –paper active le mode papier, permettant de saisir les séries de valeurs, ligne par ligne, en vérifiant la somme de contrôle de chaque ligne. Le mode par défaut demande, en plus du chemin du dépôt de sauvegarde, un paramètre désignant le fichier contenant la clé de chiffrement à importer.

Exemple de serveur de sauvegardes

Configuration du serveur de stockage des sauvegardes

Contexte

On a quatre serveurs persos hébergés dans un datacenter de Paris et pour la sécurité des données, on a un cinquième serveur, situé dans le datacenter d’Amsterdam (au cas où Paris prend feu) pour servir de serveur de sauvegarde.

+-------------------------+    +-------------------------+
|          Paris          |    |        Amsterdam        |
+-------------------------+    +-------------------------+
|                         |    |                         |
|        Serveur 1---\    |    |                         |
|                     \   |    |                         |
|        Serveur 2-\   \  |    |                         |
|                   >===>=|====|=======>Serveur 5        |
|        Serveur 3-/   /  |    |                         |
|                     /   |    |                         |
|        Serveur 4---/    |    |                         |
|                         |    |                         |
+-------------------------+    +-------------------------+

Création des dépôts

Sur Serveur 5 créer un utilisateur dédié à recevoir les sauvegardes, avec les dossiers qui vont être nécessaires pour la suite :

useradd -d /home/backup -m -r -U backup
su - backup
mkdir /home/backup/.ssh
mkdir /home/backup/repos/srv{1,2,3,4}

Configuration de clients

Configuration des accés ssh

Chaque client (les serveurs à sauvegarder) dispose de son dépôt dédié dans le dossier /home/backup/repos, par exemple /home/backup/repos/srv1 pour Serveur 1 et ainsi de suite.

Sur le client Serveur 1, en root, on va créer une clé SSH qui servira à l’authentification sur serveur Serveur 5 :

 ssh-keygen -t ed25519

Valider en appuyant sur la touche « Entrée » à toutes les questions, à moins de savoir exactement ce q'on fait.

On doit maintenant avoir une clé privée contenue dans le fichier /root/.ssh/ided25519, et une clé publique contenue dans le fichier /root/.ssh/ided25519.pub. La clé privée est à garder en sécurité et à ne jamais partager.

Sur le serveur Serveur 5, il va falloir ajouter dans le fichier /home/backup/.ssh/authorized_keys la clé publique de chacun des clients avec l’option command, sur le modèle suivant :

command="cd /home/backup/repos/<SRV#>; borg serve --restrict-to-path /home/backup/repos/<SRV#>",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty,no-user-rc <CLÉ_PUBLIQUE_DE_SRV#>

Exemple pour Serveur 1 :

command="cd /home/backup/repos/srv1; borg serve --restrict-to-path /home/backup/repos/srv1",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty,no-user-rc ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG+n17i8h2PF1/OTv62Ax/mOYhpWpDNDHXukGaK3Noaf root@srv1

L’option command permet de restreindre l’utilisation de la connexion SSH à une commande donnée, pour le client qui utilisera la clé publique associée.

Configuration des tâches de backup

Ceci étant fait pour tous les clients, il reste à configurer et planifier la sauvegarde sur ceux-ci.

Sur chaque client, faudra commencer par initialiser son dépôt avec la commande suivante :

 borg init backup@<ADRESSE_DE_SRV5>:repo

La phrase de passe est à conserver soigneusement, c’est elle qui chiffre et déchiffre les données à sauvegarder. Si vous la perdez vos sauvegardes seront inexploitables.

Pour faciliter l’exécution de la sauvegarde on va faire un script, à placer par exemple dans /usr/local/bin/borg-backup :

#!/bin/bash

REPO='backup@<ADRESSE_DE_SRV5>:repo'

LIST=(
  /etc
  /root
  /usr/local
  /var/backups/mariadb
  /var/www
)

export BORG_PASSPHRASE='<VOTRE_PHRASE_DE_PASSE>'

function main() {
  # backup
  borg create --compression lz4 \
    ${REPO}::'{now:%Y-%m-%d}' \
    "${LIST[@]}"

  # rotation
  borg prune ${REPO} \
    --keep-daily=7 --keep-weekly=4 --keep-monthly=6
 }

if [[ "${BASH_SOURCE}" == "${0}" ]]; then
  main "${@}"
fi

Avec ce script, chacun des fichiers et dossiers présents dans la variable LIST seront sauvegardés.

On oublie pas de rendre le script exécutable :

 chmod +x /usr/local/bin/borg-backup

Il ne reste plus qu’à planifier l’exécution du script toutes les nuits via une tâche cron. Pour ceci on ajoute la ligne suivante dans le fichier /etc/crontab :

30 3 * * *    root    /usr/local/bin/borg-backup

Et voilà, les serveurs sont sauvegardés ! Du moins à la prochaine exécution de la crontab…