URL: https://linuxfr.org/news/installer-borgbackup-sur-un-nas Title: Installer BorgBackup sur un NAS Authors: Cyril Chaboisseau ZeroHeure, palm123, theojouedubanjo, Xavier Teyssier, Davy Defaud, Ysabeau đ§¶ et bubarđŠ„ Date: 2020ćčŽ02æ08æ„T21:49:34+01:00 License: CC By-SA Tags: nas, wiki, tutoriel, sauvegarde, borg, installer et borgbackup Score: 40 Borg est un outil de sauvegardes pour les systĂšmes UNIX/Linux, Ă©crit en Python et activement dĂ©veloppĂ© (Borg est un _fork_ dâ[Attic](https://attic-backup.org/) qui nâĂ©volue plus). Borg cherche Ă fournir une solution efficace et sĂ©curisĂ©e : la dĂ©duplication et la compression des blocs de donnĂ©es rĂ©duisent la place occupĂ©e par la sauvegarde, et le chiffrement protĂšge et authentifie les donnĂ©es. La restauration est rĂ©alisable facilement et ne nĂ©cessite pas dâavoir les droits administrateur (montage de la sauvegarde par un utilisateur via [FUSE](https://borgbackup.readthedocs.io/en/stable/usage/mount.html)).  Cet article est une prĂ©sentation de Borg autour dâun cas pratique. Il explique pasâĂ âpas comment installer et configurer le logiciel Borg sur un [[NAS]] pour effectuer des sauvegardes en mode clientâserveur via SSH. Lâexemple donnĂ© se base sur un NAS Synology, mais est facilement transposable Ă nâimporte quel autre serveur de stockage rĂ©seau. ---- [Site officiel de BorgBackup](https://www.borgbackup.org/) [Documentation de BorgBackup](https://borgbackup.readthedocs.io/) [BorgBackup : avantages, mĂ©mo et liens (SebSauvage)](https://sebsauvage.net/wiki/doku.php?id=borgbackup) [Ressources de la communautĂ© Borg](https://github.com/borgbackup/community) ---- # Introduction Inutile dâinsister sur lâimportance de rĂ©aliser des sauvegardes : que ce soit pour se prĂ©munir de la perte accidentelle de fichiers (destruction, Ă©crasement), dâacte de malveillance (rançongiciel) ou plus pragmatiquement pour retrouver une ancienne version dâun document. Comme le dit lâadage : « il y a deux types dâutilisateurs : ceux qui ont dĂ©jĂ perdu des donnĂ©es, et ceux qui vont en perdre ». Le cas de figure typique auquel rĂ©pond ce tutoriel est vaste : offrir pour soiâmĂȘme, mais aussi pour des amis ou la famille un espace de stockage permettant une sauvegarde rĂ©guliĂšre et sĂ©curisĂ©e dâun ordinateur quelconque. On sauvegarde un rĂ©pertoire, un point de montage ou tout un disque. En effet, la dĂ©mocratisation de la fibre permet de mettre Ă disposition une telle ressource, et par consĂ©quent de rĂ©aliser des sauvegardes hors site (ce qui protĂšge contre le vol ou les incendies...) en passant par Internet, sans que ça prenne des heures.> Dans mon cas, jâai pu rĂ©aliser une sauvegarde initiale dâun dossier de 7 Go en moins de quatre minutes (une fois les donnĂ©es compressĂ©es et dĂ©dupliquĂ©es il nây avait plus que 4,73 Go), sachant que les sauvegardes suivantes du mĂȘme rĂ©pertoire ne prennent gĂ©nĂ©ralement que trente secondes (350 Mo dĂ©dupliquĂ©s). Au niveau local, le client Borg suffit pour dĂ©poser les sauvegardes Ă travers un serveur de fichiers rĂ©seau tels que CIFS ou NFS. Mais dĂšs que lâon veut le faire sur une machine hors rĂ©seau local, on est obligĂ© de passer par le protocole SSH, par exemple en [SSHFS] (https://blog.m0le.net/2018/04/01/backup-avec-borg-via-sshfs-sur-synology/) ou encore [SFTP](https://www.memoiresecondaire.fr/?p=859). Une bien meilleure approche consiste Ă utiliser BorgBackup Ă travers SSH en installant la partie serveur sur une machine distante, ce qui offre lâavantage dâavoir un contrĂŽle plus fin Ă travers les options de `borg serve` : gestion des quotas, mode en Ă©criture seule (`--append-only`) interdisant les destructions/_prune_ des anciennes sauvegardes, restriction Ă un dĂ©pĂŽt unique ou Ă un rĂ©pertoire, et plus gĂ©nĂ©ralement le fait que lâon nâa pas besoin de mettre Ă disposition un accĂšs complet Ă un partage comme on le ferait via SSHFS. Un autre bĂ©nĂ©fice du mode clientâserveur, câest de permettre une opĂ©ration de vĂ©rification de lâintĂ©gritĂ© des sauvegardes ([`borg check`](https://borgbackup.readthedocs.io/en/stable/usage/check.html)) directement par le serveur, ce qui Ă©vite un fort trafic rĂ©seau si la vĂ©rification des blocs de donnĂ©es chiffrĂ©s devait se faire par le client qui est le seul Ă connaĂźtre la clĂ© de chiffrement des donnĂ©es. Il faut cependant avoir Ă lâesprit que les performances sont moindres lorsque lâon utilise le protocole SSH (66 % en moyenne dâaprĂšs un test avec [`borg benchmark`](https://borgbackup.readthedocs.io/en/stable/usage/benchmark.html) par rapport Ă un montage NFS v4). Les avantages de BorgBackup sont multiples : - les sauvegardes sont **sĂ©curisĂ©es** en ce sens oĂč les donnĂ©es sont authentifiĂ©es et chiffrĂ©es (on peut se permettre de stocker ses sauvegardes chez un hĂ©bergeur en qui lâon nâa pas nĂ©cessairement confiance, une personne qui accĂ©derait aux fichiers sauvegardĂ©s ne pourra rien en faire, dĂšs lors quâon a choisi un mot de passe solide) ; - la sauvegarde Ă travers le rĂ©seau utilise le protocole SSH, lui aussi rĂ©putĂ© comme Ă©tant trĂšs sĂ»r et sĂ©curisĂ© en plus dâĂȘtre largement rĂ©pandu ; - la place prise par la sauvegarde est optimisĂ©e : les donnĂ©es sont **compressĂ©es** (si on le dĂ©sire) avec un [algorithme plus ou moins efficace](https://borgbackup.readthedocs.io/en/stable/usage/create.html) selon quâon privilĂ©gie la rapiditĂ© de la compression sur le gain de place â pour autant que les donnĂ©es le permettent. Pour les blocs de donnĂ©es identiques, une **dĂ©duplication** va se faire, ce qui permet encore un gain de place, mais surtout lors de sauvegardes rĂ©guliĂšres qui sont _de facto_ incrĂ©mentales. # Installation et configuration Le but de ce tutoriel est dâinstaller le serveur de Borg sur un NAS Synology afin dây dĂ©poser des sauvegardes depuis Internet ou le rĂ©seau local. Il faut bien sĂ»r possĂ©der un serveur de stockage (NAS) sur lequel on a les droits dâadministrateur et le NAS doit ĂȘtre accessible en SSH. Dans lâexplication qui suit, on fait rĂ©fĂ©rence Ă deux machines : - _NAS_ : câest le serveur de stockage qui va hĂ©berger toutes les sauvegardes ; - _Client_ : câest une machine Ă partir de laquelle on va effectuer les sauvegardes, ça peut ĂȘtre un ordinateur sous GNU/Linux, FreeBSD ou encore sous macOS (voir les diffĂ©rentes façons de lâ[installer](https://borgbackup.readthedocs.io/en/stable/installation.html)). ## Installation sur _NAS_ Pour cet article, on utilise un NAS Synology. Il faut activer les paquets « CommunautĂ© » (section _Community_) depuis le centre de paquets, pour ensuite installer le paquet [`Borg`](https://repology.org/project/borgbackup/versions), ce qui permet dâavoir le binaire du serveur qui tourne sur le NAS. Enfin, il faut crĂ©er un compte et un groupe dĂ©diĂ©s pour faire tourner la partie serveur de Borg (par exemple `borg-backup`). Il faut aussi crĂ©er un rĂ©pertoire `NetBackup` pour les sauvegardes, auquel on donne Ă lâutilisateur et au groupe dĂ©diĂ©s un accĂšs total (lecture et Ă©criture). Afin de pouvoir se connecter via SSH Ă ce compte, il est nĂ©cessaire sur un NAS Synology de lâaffecter au groupe « _administrators_ » :  AprĂšs tout cela, on se connecte au compte nouvellement créé sur le serveur de stockage et on sâassure que Borg est bien installĂ© (on notera que, contrairement aux paquets fournis par lâĂ©diteur, les paquets « Communautaires » (SynoCommunity) sont installĂ©s dans `/usr/local/bin` au lieu de `/usr/bin`) : ```bash borg-backup@nas:~$ which borg /usr/local/bin/borg ``` ## Installation sur _Client_ Borg est disponible pour [la plupart des distributions et sur les divers BSD](https://borgbackup.readthedocs.io/en/stable/installation.html#distribution-package). Faites cependant attention dâutiliser la mĂȘme version cĂŽtĂ© _Client_ et cĂŽtĂ© _NAS_. Au besoin, tĂ©lĂ©chargez des [binaires prĂȘts Ă lâemploi](https://borgbackup.readthedocs.io/en/stable/installation.html#pyinstaller-binary) ou bien installez via [`pip`](https://borgbackup.readthedocs.io/en/stable/installation.html#using-pip). ## CrĂ©er une clĂ© SSH sur _Client_ On va avoir besoin de crĂ©er une clĂ© SSH depuis un compte `root` si lâon a besoin de sauvegarder des fichiers nĂ©cessitants des droits administrateur, ou bien depuis un compte utilisateur standard si câest seulement son propre compte que lâon veut sauvegarder. Prenons le cas oĂč câest lâutilisateur `root` qui fait une sauvegarde de plusieurs rĂ©pertoires comme `/etc` et `/home`. On gĂ©nĂšre la clĂ© SSH (on part du principe que le rĂ©pertoire `/root/.ssh` existe sinon il faut le crĂ©er et positionner les droits Ă `0700`) : ```bash ssh-keygen -t ed25519 -f ~/.ssh/id_borg-backup ``` La commande ciâdessus a pour effet de crĂ©er une paire de clĂ©s publique et privĂ©e spĂ©cifique avec lâalgorithme [Ed25519](https://fr.wikipedia.org/wiki/EdDSA) permettant de se connecter au serveur de stockage. Si votre NAS ne gĂšre pas lâEd25519, vous pouvez choisir nâimporte quel autre type de clĂ© (RSA, ECDSA), la sĂ©curisation de la session SSH nâĂ©tant pas cruciale du fait que Borg gĂšre lâauthentification et le chiffrement des sauvegardes. Voici la configuration que jâai dĂ» rajouter pour que lâutilisateur _root_ depuis la machine _Client_ puisse accĂ©der au serveur de stockage _NAS_ (`nas.local`) avec la clĂ© nouvellement créée : ```bash client:~# cat ~/.ssh/config Host nas.local User borg-backup IdentityFile ~/.ssh/id_borg-backup # on fait tourner ssh sur un port diffĂ©rent Port 2222 # on gagne un peu de performances en dĂ©sactivant la compression Compression no # https://borgbackup.readthedocs.io/en/stable/usage/serve.html ServerAliveInterval 10 ServerAliveCountMax 30 ``` Comme on a spĂ©cifiĂ© le nom du compte Ă utiliser et le port dans le fichier de configuration SSH, lâURL du dĂ©pĂŽt sâĂ©crit `nas.local:/chemin/vers/le/dĂ©pĂŽt`. Si lâon prĂ©fĂšre spĂ©cifier les paramĂštres de connexion dans lâURL, on Ă©crit : `borg-backup@nas.local:2222/chemin/vers/le/dĂ©pĂŽt`. Il ne reste plus quâĂ copier la clĂ© publique de lâutilisateur _root_ sur le serveur : ```bash client:~# ssh-copy-id -i ~/.ssh/id_borg-backup.pub nas.local ``` Une fois la clĂ© copiĂ©e, il est possible de se connecter sans avoir besoin de taper le mot de passe. # Mise en Ćuvre sur _NAS_ : configurer ssh en mode restreint Le chemin dâaccĂšs Ă Borg est `/usr/local/bin` sur _NAS_, alors que le binaire se trouve gĂ©nĂ©ralement sous `/usr/bin`. En se connectant via un accĂšs SSH non restreint, le client borg va tenter de lancer un `borg serve` avec un chemin dâaccĂšs diffĂ©rent, ce qui va renvoyer lâerreur suivante : > `Remote: sh: borg: command not found Connection closed by remote host. Is borg working on the server?` PlutĂŽt que de chercher Ă avoir deux chemins dâaccĂšs identiques ([certains sites](https://serverfault.com/questions/973995/borg-backup-remotely-gives-error) vont proposer de contourner le problĂšme en crĂ©ant un lien symbolique), la bonne pratique est de spĂ©cifier le paramĂštre `command` du cĂŽtĂ© serveur dans le fichier `authorized_keys`, ce qui aura comme avantage supplĂ©mentaire de limiter la session SSH Ă la partie serveur (RPC) de Borg. Se connecter en tant que `borg-backup` pour configurer le cĂŽtĂ© serveur en Ă©coute dâOpenSSH, sur lequel le client va se connecter : ```bash borg-backup@nas:~$ mkdir .ssh borg-backup@nas:~$ chmod 700 .ssh borg-backup@nas:~$ vi ~/.ssh/authorized_keys ``` Si la clĂ© publique (`~/.ssh/id_borg-backup.pub`) nâest pas dĂ©jĂ prĂ©sente, il faut la rajouter ; la clĂ© doit ressembler Ă : ```bash ssh-ed25519 AAAAC3Nza...P0S27t root@client ``` (il faut bien sĂ»r copier la clĂ© publique gĂ©nĂ©rĂ©e depuis le poste client) DerniĂšre Ă©tape, sĂ©curiser les accĂšs SSH de lâutilisateur _root_ (sur _Client_) en leur restreignant les accĂšs sur le serveur de stockage. Cette opĂ©ration a pour objectif que les utilisateurs effectuant les sauvegardes et ayant un compte sur _nas.local_ puissent uniquement faire des sauvegardes Borg Ă travers leur accĂšs SSH. Voici Ă quoi ressemble le fichier `authorized_keys` une fois les modifications effectuĂ©es : ```bash borg-backup@nas:~$ cat .ssh/authorized_keys ssh-ed25519 AAAAC3Nza...BW09/R7Bm cyril@client command="/usr/local/bin/borg serve --restrict-to-path /volume1/NetBackup/chezmoi/",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc ssh-ed25519 AAAAC3Nza...P0S27t root@client command="/usr/local/bin/borg serve --restrict-to-repository /volume1/NetBackup/copain/ --storage-quota 128G",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc ssh-ed25519 AAAAC3Nza...SRW55E user@client2 ``` Quelques explications sâimposent : - la premiĂšre ligne, qui contient uniquement la clĂ© `cyril@client`, permet de se connecter sur le NAS depuis un compte utilisateur pour effectuer la configuration ; - la partie `command="..."` que lâon rajoute sur les deux lignes suivantes permet de limiter la session SSH Ă une commande `borg serve` qui interagira avec la partie cliente lancĂ©e depuis les postes Ă sauvegarder ; - les options de restriction SSH aprĂšs la commande `no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc` sont pour Ă©viter des redirections de ports/X11 ou dâagent au sein de la session SSH (normalement on nâa pas tout ça sur le serveur de stockage, mais câest une bonne pratique de sĂ©curitĂ© de limiter les fonctionnalitĂ©s dâOpenSSH Ă uniquement la communication clientâserveur du logiciel Borg) ; - il faut indiquer le chemin complet pour la commande `borg serve` ; - lâoption `--restrict-to-path` permet Ă lâutilisateur _root_ sur _Client_ de crĂ©er plusieurs sauvegardes sous le dĂ©pĂŽt qui lui est attribuĂ©, tandis que `--restrict-to-repository` limite lâutilisateur `user@client2` Ă ne pouvoir faire la sauvegarde que dans le dĂ©pĂŽt/rĂ©pertoire spĂ©cifiĂ© et pas les sousârĂ©pertoires ; - lâoption `--storage-quota` impose un quota disque (câest aussi possible dâavoir une limitation Ă lâinitialisation, mais vu que câest lâutilisateur distant qui effectue la crĂ©ation du dĂ©pĂŽt, câest plus sĂ»r de le forcer sur le serveur de stockage). N. B. â Il y avait [un bogue](https://github.com/borgbackup/borg/issues/4093), corrigĂ© avec la version 1.1.8 (la version installĂ©e par dĂ©faut sur Synology et QNAP Ă lâheure oĂč ces lignes sont Ă©crites est la 1.1.7), qui permettait Ă un client de contourner le quota supposĂ© ĂȘtre imposĂ© par le serveur. # Mise en Ćuvre sur _Client_ On stocke le mot de passe en clair dans le fichier `~/.borg/passphrase` : ```bash umask 077 mkdir ~/.borg vi ~/.borg/passphrase [crĂ©ation dâune clĂ© secrĂšte si possible de façon totalement alĂ©atoire] ``` Puis, on dĂ©finit une variable dâenvironnement pour ne pas avoir Ă retaper le mot de passe : ```bash export BORG_PASSPHRASE="`cat ~/.borg/passphrase`" ``` **Afin de pouvoir accĂ©der et dĂ©chiffrer les sauvegardes sur le serveur, il faut sâassurer de copier la clĂ© (mot de passe Borg) autre part que sur lâordinateur qui dĂ©clenche les sauvegardes en cas de perte ou dysfonctionnement de ce dernier (la copier dans un endroit sĂ©curisĂ©)**. On initialise avec le mode `repokey-blake2` qui permet dâavoir une sauvegarde [chiffrĂ©e et authentifiĂ©e avec AES](https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-modes) : ``` borg init --encryption=repokey-blake2 'nas.local:/volume1/NetBackup/chezmoi/{hostname}' ``` Et pour vĂ©rifier que le dĂ©pĂŽt est créé : `borg info 'nas.local:/volume1/NetBackup/chezmoi/{hostname}'` ## Cas dâun _Client_ distant Lorsque lâon fait une sauvegarde depuis Internet, Ă moins de rajouter une entrĂ©e dans le fichier `/etc/hosts`, on ne peut pas utiliser _nas.local_ car câest le nom pleinement qualifiĂ© ([[FQDN]]) de la machine qui hĂ©berge le dĂ©pĂŽt qui doit ĂȘtre utilisĂ©. Petit mĂ©mo : - refaire la configuration client SSH ; - rĂ©gĂ©nĂ©rer la clĂ© depuis le compte utilisateur ; - la copier sur _NAS_ comme prĂ©cĂ©demment ; - ne pas oublier de changer le fichier `~/.ssh/config` sur _NAS_ ; - initialiser `borg init --encryption=repokey-blake2 'nas.example.com:/volume1/NetBackup/chezmoi/{hostname}'`. # Exemples Voici un exemple de script qui sauvegarde rĂ©guliĂšrement les rĂ©pertoires `/etc`, `/var` et `/home` : ```sh #!/usr/bin/env bash set -e LOG_PATH=/var/log/borg-backup.log export BORG_PASSPHRASE="`cat ~root/.borg/passphrase`" BORG_REPOSITORY="nas.local:/volume1/NetBackup/chezmoi/{hostname}" BORG_ARCHIVE=${BORG_REPOSITORY}::{now:%Y-%m-%d} borg create \ --verbose --stats \ $BORG_ARCHIVE \ /etc /var /home \ --exclude-caches \ --exclude-nodump \ --exclude /home/cyril/tmp \ --noatime \>> ${LOG_PATH} 2>&1 # Nettoyage des anciennes sauvegardes # On conserve : # - une archive par jour les 7 derniers jours ; # - une archive par semaine pour les 6 derniĂšres semaines ; # - une archive par mois pour les 8 derniers mois. borg prune --verbose \ $BORG_REPOSITORY \ --keep-daily=7 \ --keep-weekly=6 \ --keep-monthly=8 \>> ${LOG_PATH} 2>&1 ``` Il ne vous reste plus quâĂ lancer vos sauvegardes rĂ©guliĂšrement en copiant le script dans le rĂ©pertoire `/etc/cron.daily/` puis attendre dâen avoir besoin, en ayant cependant pris soin de les avoir testĂ©es pour sâassurer que lâon est en mesure de rĂ©cupĂ©rer les donnĂ©es depuis un nouvel ordinateur (**copiez la clĂ© dans un endroit sĂ»r !** ;-)). La rĂ©cupĂ©ration peut se faire depuis nâimporte quelle machine, y compris depuis un compte utilisateur normal, pourvu quâil possĂšde ces deux Ă©lĂ©ments : - une clĂ© SSH permettant de se connecter au NAS (au processus `borg serve`) ; - la clĂ© de chiffrement (ici `repokey-blake2`) pour sâauthentifier et dĂ©chiffrer les donnĂ©es sauvegardĂ©es. Si les deux conditions sont rĂ©unies, voici comment on peut monter un dĂ©pĂŽt Borg distant sur un rĂ©pertoire quelconque : ```bash $ export BORG_PASSPHRASE="`cat ~/.borg/passphrase`" $ borg list nas.local:/volume1/NetBackup/chezmoi/client | tail -n 2 2020ćčŽ04æ16æ„ Thu, 2020ćčŽ04æ16æ„ 06:58:43 [2f3824...f6e] 2020ćčŽ04æ17æ„ Fri, 2020ćčŽ04æ17æ„ 07:39:03 [ed3b98...c79] $ mkdir /tmp/localborg/ $ borg mount nas.local:/volume1/NetBackup/chezmoi/client::2020ćčŽ04æ16æ„ /tmp/localborg $ cat /tmp/localborg/etc/issue.net Debian GNU/Linux bullseye/sid $ umount /tmp/localborg ```