Borg est un logiciel de sauvegarde doté de fonctionnalités avancées comme la déduplication et le chiffrement.

Cet article explique la manière dont je l'utilise pour sauvegarder mes systèmes.

Pourquoi utiliser Borg ?

J'ai récemment revu l'organisation des sauvegardes de mes machines. En effet, j'utilisais jusque là un script très basique à base de rsync, et cela ne me convenait plus.

Mes buts principaux étaient :

  • Sauvegarder la totalité du système, plutôt qu'une liste limitée de répertoires.
  • Disposer d'un historique de plusieurs sauvegardes, avec de la déduplication pour limiter l'espace utilisé.
  • Pouvoir parcourir le contenu de n'importe quelle sauvegarde simplement et rapidement.
  • Chiffrer les données sauvegardées.

Ma première idée a été de me tourner vers Bup, que j'ai déjà présenté dans un précédent article et que j'utilise déjà pour d'autres besoins. Cependant, plusieurs éléments m'ont décidé à utiliser un autre outil :

  • Le chiffrement n'est possible que via le script externe encbup, qui revient à sauvegarder une archive chiffrée des données. Accéder à une donnée dans la sauvegarde nécessite alors de lire la totalité de cette sauvegarde, ce qui ne me convient pas.
  • Supprimer des sauvegardes pour réduire l'espace occupé par le dépôt bup n'est pas encore géré. Il est possible de ne conserver qu'une certaine quantité de sauvegardes, par exemple en créant une branche par mois, mais l'automatisation de ce procédé est compliquée, et cette méthode ne permet pas de supprimer une sauvegarde précise sans altérer les autres.

J'ai alors cherché des logiciels capables de remplir tous mes objectifs, et j'ai finalement choisi Borg, qui remplit tous mes objectifs et est assez simple d'utilisation.

Installation

Sous Debian, il suffit d'installer le paquet borgbackup.

$ sudo apt install --no-install-recommends borgbackup

Variables d'environnement

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

  • BORG_REPO : Chemin d'accès au dépôt de sauvegardes.
  • BORG_PASSPHRASE : Phrase de passe, si nécessaire, pour débloquer la clé de chiffrement.
  • BORG_PASSCOMMAND : Commande utilisée pour fournir la phrase de passe.

Note : 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.

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.

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

  • none : La sauvegarde n'est pas chiffrée.
  • repokey : La clé de chiffrement est écrite dans le fichier de configuration du dépôt de sauvegarde (par défaut).
  • keyfile : La clé de chiffrement est écrite dans un fichier séparé.

Le mode keyfile permet d'éviter qu'un attaquant ayant accès au dépôt de sauvegarde n'ait aussi la clé de déchiffrement. Il est bien évidemment fortement conseillé de sauvegarder la clé de chiffrement dans un emplacement séparé.

Lors de l'utilisation des modes repokey et keyfile, une phrase de passe optionnelle sera demandée, afin de protéger la clé de chiffrement. La phrase de passe est nécessaire pour débloquer la clé de chiffrment lors de la création de nouvelles sauvegarde, pas uniquement lors de la lecture des données. Il sera donc nécessaire d'utiliser l'une des variables d'environnement BORG_PASSPHRASE ou BORG_PASSCOMMAND pour automatiser la sauvegarde, si vous en définissez une.

Si la phrase de passe ne convient plus, ou qu'elle a été révélée à un tiers, il est possible de la changer avec la commande borg change-passphrase. Cela peut être utile aussi pour conserver une clé de chiffrement protégée par une phrase de passe sur un support externe, tout en laissant une clé de chiffrement sans phrase de passe sur la machine qui effectue les sauvegardes. De cette manière, il n'est pas nécessaire de mettre la phrase de passe en clair dans le script de sauvegarde, tout en sécurisant les sauvegardes de la clé de chiffrement.

Exemples :

$ # Initialiser un dépôt de sauvegarde non chiffré
$ borg init -e none <UnencryptedRepoPath>
$ # Initialiser un dépôt de sauvegarde chiffré
$ borg init -e keyfile <RepoPath>
$ # Changement de la phrase de passe
$ borg change-passphrase <RepoPath>

Création d'une sauvegarde

La sauvegarde de fichiers et de répertoires se fait à l'aide de la commande borg create. 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 :

  • {hostname} : Le nom d'hôte court de la machine.
  • {fqdn} : Le nom d'hôte complet de la machine.
  • {now} : La date et l'heure locales.
  • {utcnow} : La date et l'heure UTC.
  • {user} : Le nom de l'utilisateur réalisant la sauvegarde.

Note : 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.

Pour compresser les données sauvegardées, il faut utiliser le paramètre --compress (abrégé -C). La valeur définit à la fois l'algorithme de compression (none, lz4, zlib ou lzma) et le niveau de compression, dans le cas des algorithme zlib et lzma, de 0 à 9, séparés par une virgule.

Pour exclure des chemins de la sauvegarde, il est possible d'utiliser le paramètre --exclude (abrégé -e), qui exclue un unique chemin, ou le paramètre --exclude-from, qui exclue tous les chemins présents dans un fichier donné.

Enfin, les paramètres --verbose (abrégé -v), --stats (abrégé -s) et --progress (abrégé -p) permettent d'afficher des informations sur les opérations effectuées pendant la sauvegarde et sur son contenu.

Exemples :

$ # Sauvegarde d'un fichier
$ borg create --verbose --stats --progress <RepoPath>::<SaveName> <Path>/<Filename>
$ # Sauvegarde d'un répertoire en le compressant
$ borg create --verbose --stats --progress --compress zlib,9 <RepoPath>::<SaveName> <Path>/<Directory>
$ # Sauvegarde d'une base de données PostgreSQL
$ pg_dump -Ft <DbName> | borg create --verbose --stats --progress <RepoPath>::<SaveName> -
$ # Sauvegarde du système complet, en le compressant, et en excluant certains chemins
$ borg create -v -s -p -C lzma,6 --exclude-from=<IgnoreFilePath> <RepoName>::{hostname}-{now:%Y%m%d-%H%M%S} /

Note : Lors de la sauvegarde d'un système complet, il est conseillé d'exclure tous les répertoires de montages spéciaux et temporaires (/dev, /media, /mnt, /proc, /run, /sys, /tmp, etc.). J'exclue aussi le répertoire de cache de Borg (par défaut ~/.cache/borg), puisqu'il est généré automatiquement, et qu'il peut atteindre une taille assez importante.

Parcourir les données sauvegardées

Il est possible de lister le contenu du dépôt de sauvegarde au moyen de la commande borg list.

Lorsque le seul paramètre passé est l'emplacement d'un dépôt de sauvegarde, cette commande liste les différentes sauvegardes qui s'y trouvent. On peut y ajouter le nom d'une sauvegarde, pour lister le contenu complet de la 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ôle d'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>

Note : 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 : Supprime le dépôt complet, ou une sauvegarde précise.
  • borg prune : Supprime des sauvegardes selon des critères.

Suppression du dépôt complet

Lorsque seul le chemin du dépôt est passé en paramètre à la commande borg delete, le dépôt complet est supprimé. Le cache local associé à ce dépôt est alors lui aussi supprimé.

L'utilisation de cette commande provoque l'affichage d'un message d'avertissement, listant toutes les sauvegardes qui seront supprimées.

Suppression d'une sauvegarde

Lorsque le nom d'une sauvegarde est ajouté à la suite du nom du dépôt de sauvegarde dans les paramètres de la commande borg delete, cette sauvegarde est supprimée du dépôt. Cette commande est utile pour supprimer une sauvegarde ayant inclus un gros fichier temporaire par inadvertance, par exemple.

Cette commande n'affiche pas de message d'avertissement, il faut donc bien faire attention avant de la lancer.

Suppression de sauvegardes selon des critères

Un nettoyage automatique du dépôt de sauvegarde peut être réalisé au moyen de la commande borg prune. Cette commande prend en paramètres le dépôt à nettoyer, ainsi que le nombre de sauvegardes à conserver par période (heure, jour, semaine, mois, année).

Les paramètres possibles sont :

  • --prefix (abrégé -P) : Définit le préfixe des sauvegardes à prendre en compte (toutes par défaut).
  • --keep-within : Définit une période dans laquelle toutes les sauvegardes doivent être conservées.
  • --keep-hourly (abrégé -H) : Conserver la dernière sauvegarde des X dernières heures.
  • --keep-daily (abrégé -d) : Conserver la dernière sauvegarde des X derniers jours.
  • --keep-weekly (abrégé -w) : Conserver la dernière sauvegarde des X dernières semaines.
  • --keep-monthly (abrégé -m) : Conserver la dernière sauvegarde des X derniers mois.
  • --keep-yearly (abrégé -y) : Conserver la dernière sauvegarde des X dernières années.
  • --list : Associé à --verbose, permet d'afficher la liste des sauvegardes conservées et supprimées.
  • --dry-run (abrégé -n) : Permet de tester ce qui serait fait, sans supprimer réellement les données, avec --list.

Lors de l'évaluation des paramètres, les sauvegardes marquées comme devant être conservées par les précédents ne sont pas prises en compte. Ainsi, demander à conserver la dernière sauvegarde des 48 dernières heures, ainsi que la dernière sauvegarde des 15 derniers jours conservera les 48 dernières sauvegardes, plus une sauvegarde des quinza derniers jours. Si le critère "sauvegardes des 48 dernières heures" prend toutes les sauvegardes des deux derniers jours, le critère "sauvegardes des 15 derniers jours" commencera à partir du troisième jour, jusqu'au dix-huitième.

Exemples :

$ # Supprimer toutes les sauvegardes plus vieilles que deux semaines
$ borg prune --keep-within 2w
$ # Supprimer les sauvegardes selon des critères plus précis
$ borg prune --keep-within 1w --keep-hourly 24 --keep-daily 14 --keep-monthly 6

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.

Attention : 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 :

  • Par défaut : Enregistrement de la clé directement dans un fichier.
  • --paper : Génération d'une série de valeurs, destinées à être imprimées, ou écrites à la main sur un papier.
  • --qr-html : Génération d'un QR Code contenant la clé de chiffrement, destiné à être imprimé.

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.


Limiter les attaques par force brute sur le service SSH

dim. 07 janv. 2018 by Marmotte

Le service SSH (Secure SHell) permet d'obtenir l'accès à un terminal sur une machine distante, ce qui le rend donc très pratique pour l'administration. De ce fait, il est disponible sur un grand nombre de serveurs. Malheureusement, cela le rend donc aussi très attirant pour les personnes cherchant à contrôler …

read more

Un serveur PXE pour les booter tous

sam. 06 janv. 2018 by Marmotte

Après avoir mis au point le menu de boot dynamique de ma clé USB, j'ai eu envie de faire la même chose sur mon serveur PXE. Comme j'ai déjà une configuration de grub qui le fait, j'ai donc remplacé pxelinux par grub sur le serveur PXE, puis j'ai repris la …

read more

Une clé USB pour les booter vraiment tous

sam. 30 sept. 2017 by Marmotte

Lorsqu'on bidouille des machines, il arrive que le système ne démarre plus. Que seul le boot loader soit cassé, ou que ce soit le système complet, il est donc important d'avoir à disposition un moyen de démarrer la machine, pour réparer les dégâts.

J'explique ici la manière dont j'ai configuré …

read more

LXC sur Debian Jessie

ven. 03 mars 2017 by Marmotte

LXC, pour Linux Containers, permet de lancer plusieurs environnements Linux sur une même machine, de manière isolée, comme le fait OpenVZ. Par rapport à des machines virtuelles, les performances sont donc bien meilleures, puisque les différents systèmes fonctionnent directement sur le noyau, sans couche de virtualisation intermédiaire. Cela implique aussi …

read more

Installer Debian Jessie avec debootstrap

ven. 03 mars 2017 by Marmotte

Sur la plupart de mes machines, j'utilise la version stable de Debian, soit Jessie actuellement. J'explique ici la manière dont j'installe un système avec Debootstrap.

Note : Cet article est une mise à jour de celui qui expliquait l'installation de Debian Wheezy.

Pourquoi ne pas utiliser l'installeur Debian ?

L'installeur ajoute …

read more

Le système de fichiers BTRFS

ven. 03 mars 2017 by Marmotte

BTRFS est un système de fichiers, comparable à ZFS, encore en développement très actif, mais déjà intégré au noyau Linux et considéré stable pour un bon nombre de fonctionnalités. Il est cependant conseillé d'avoir un noyau Linux le plus récent possible pour l'utiliser.

Il a un fonctionnement de type Copy-on-Write …

read more

Configuration du pare-feu avec iptables

sam. 28 janv. 2017 by Marmotte

Le paquet iptables fournit une collection de commandes permettant de configurer netfilter, le pare-feu intégré au noyau Linux. Cet article contient toutes les notes que j'ai prises lorsque j'ai voulu savoir réellement configurer le pare-feu sur mes serveurs Debian, autrement qu'en appliquant au hasard des règles en espérant qu'elles conviennent …

read more

Configuration réseau sous Linux

dim. 15 janv. 2017 by Marmotte

Cet article rassemble les notes que j'ai prises sur les différentes manières de paramétrer le réseau sous Linux, lors de mes tests pour l'installation de nouveaux systèmes.

Interfaces et routage : Outils dépréciés

Paquet net-tools

Ce paquet fournit, entre autres, les commandes ifconfig, qui permet d'afficher et modifier la configuration des …

read more

Démarrage : BIOS ou UEFI ? MBR ou GPT ?

sam. 10 sept. 2016 by Marmotte

Après divers tests, je rassemble ici mes notes à propos de la configuration nécessaire pour démarrer un système, selon les différentes combinaisons courantes du micrologiciel de la carte mère (BIOS ou UEFI) et du format de table de partitions (MBR ou GPT) utilisées.

Descriptions

BIOS

Après l'initialisation des différents matériels …

read more