Borg Backup
BorgBackup est une solution de sauvegarde élégante qui supporte à la fois la déduplication, la compression et le chiffrement…
BorgBackup est un outil en CLI écrit en python simple d’utilisation. Il fonctionne de manière incrémentale en découpant chaque fichier en morceau ( chunck ). Entre deux sauvegardes, seuls les nouveaux chunks sont copiés sur le dépôt ( repository ) en préservant ainsi l’espace disque et la bande passante. Borg conserve un cache coté client ( par défaut: ~/.cache/borg/ ) qui contient les checksums de tous les chunks déjà sauvegardés.
Les fonctionnalités:
- compression: LZ4, ZSTD, ZLIB et LZMA
- chiffrement coté client: AES256
- SSH pour les sauvegardes distantes
- multi plateformes: Linux, macOS, BSD
- contrôles d’intégrités (checksum)
- dépot accessible via FUSE
Installation
BorgBackup est disponible sur la plupart des distributions ou directement sous forme d’un binaire
Mise en oeuvre
Dans cet exemple, on part du principe que le client ( client.domain.tld ) peut accéder en SSH au serveur de backup ( backup.domain.tld ). Sur celui-ci, on utilise un user
et un reposotory
dédié pour chaque serveur client. Ce n’est pas forcément optimal pour la déduplication entre serveurs (à étudier si vous sauvegardez des images disques de VMs par exemple) mais ça évite de mettre tous ses oeufs dans le même panier en cas de corruption du repository et ça rend l’exploitation plus simple au quotidien.
- sur le serveur de backup, on crée un utilisateur dédié pour chaque client ( borg-<hostname_du_client ). On en profite pour créer un répertoire idoine dans
/srv
(prévoir un système de fichier dédié si possible)
1[root@backup ~]# useradd borg-client
2[root@backup ~]# passwd borg-client
3[root@backup ~]# mkdir /srv/borg-client
4[root@backup ~]# chown borg-client:borg-client /srv/borg-client
5[root@backup ~]# chmod 750 /srv/borg-client
- sur le client, on configure un accès SSH authentifié par clé public
1[root@client ~]# ssh-keygen -t rsa -b 4096 -C "borg-client@client.domain.tld"
2[root@client ~]# ssh-copy-id borg-client@backup.domain.tld
la cible des commandes ( client ou backup ) est identifiée par le prompt…
-
sur le serveur de sauvegarde, on modifie le fichier
authorized_keys
pour limiter les actions possibles en SSH et éviter ainsi la suppression des backups en cas de compromission du client
1[root@backup ~]# cat /home/borg-client/.ssh/authorized_keys
2 command="borg serve --append-only --restrict-to-path /srv/client",restrict ssh-rsa <votre-clé-publique>
Initialisation du repository Borg
Dans cette exemple, on n’utilise pas le chiffrement des données sur le serveur de backup situé en interne ( à conseiller avec un prestataire externe )
1[root@client ~]# borg init --encryption none borg-client@backup.domain.tld:/srv/client
on lance une première sauvegarde (dans un TMUX si la volumétrie est conséquente):
1[root@client ~]# borg create -s --progress borg-client@backup.domain.tld:/srv/client::{now:%Y-%m-%d} /path/to/save
et enfin, on modifie la crontab pour automatiser l’opération:
105 01 * * * root borg create borg-client@backup.domain.tld:/srv/client::{now:%Y-%m-%d} /path/to/save
Commandes utiles
Sur le serveur de sauvegarde :
- Afficher la liste des jobs:
1[root@backup ~]# borg list /srv/client
22020-08-15 Tue, 2020-08-15 15:21:37 [5f0ffc068654b43b27d1b42d7ddc03f13901fbbfb8a34786627c75c80f98b022]
32020-08-22 Tue, 2020-08-22 08:51:35 [07ac0ef9334d48d8f47d75075926e39631763820e50b270e58fc22c89ef50354]
- Obtenir le détail d’un job:
1[root@backup ~]# borg info /srv/client/::2020-08-15
2Utilization of maximum supported archive size: 1%
3------------------------------------------------------------------------------
4 Original size Compressed size Deduplicated size
5This archive: 41.39 TB 34.97 TB 53.63 MB
6All archives: 109.73 TB 91.73 TB 33.81 TB
7
8 Unique chunks Total chunks
9Chunk index: 15152267 41411566
- Monter une sauvegarde:
1[root@backup ~]# borg mount /srv/client/::2020-08-15 /mnt/restore/
2[root@backup ~]# borg umount /mnt/restore
- Contrôler l’intégrité d’une sauvegarde:
1[root@backup ~]# borg check -v --progress /srv/client
Restaurer les données
La sécurité apportée par la limitation des commandes en SSH ne permet de lancer une restauration directement depuis le client. Pour contourner le problème, il existe 2 solutions:
- modifier le fichier authorized_keys pour lever la limitation
1[root@client ~]# borg mount borg-client@backup.domain.tld:/srv/client::2020-08-15
- monter de repository sur le serveur de backup et faire un rsync over ssh pour restaurer les données sur le client.
Purger les données hors période de rétention
Là encore la limitation SSH impose d’utiliser la commande borg prune en crontab du coté serveur de sauvegarde
1# Keep 7 end of day and 4 additional end of week archives.
2# Do a dry-run without actually deleting anything.
305 05 * * * root borg prune --keep-daily=7 --keep-weekly=4 /srv/client
Dernier point …pensez à décaler les jobs de sauvegardes et de purges entre les differents serveurs pour éviter un bottleneck au niveau réseau ou I/O disque