Sauvegarde d’un serveur GNU/Linux avec Restic

 

Chez Aukfood, nous prenons la problématique et le besoin de sauvegarde très à cœur. C'est un élément incontournable au bon fonctionnement de tout Système d'Information.

Le constat, et pourquoi Restic ?

La totalité de nos machines sont sous Linux, et il nous faut une solution de backup qui réponde aux besoins suivants :

  • Sauvegarde automatique et périodique (en l'occurence tous les jours) ;
  • Solution open-source (évidemment 😉) ;
  • Sauvegarde déportée sur un datacenter différent, et sur un provider différent (respectant les lois RGPD) ;
  • Performance au rendez-vous, et tracabilité des backups.
  • Chiffrement des données

C'est pour cela que nous avons fait le choix de l'outil Restic, qui répond à tous les critères. Il s'agit d'un logiciel écrit en Go, sous licence BSD-2-Clause et est disponible sous les OS suivants : Linux, macOS, Windows, FreeBSD, OpenBSD.

Restic se veut simple d'utilisation et d'administration. Cette solution permet de faire vos backups sous la forme de snapshots, et les envoie sur une "repository", un espace distant ou non.

Enfin, ces snapshots sont chiffrées, à travers l'algorithme Poly1305-AES, et une clé de déchiffrement (que vous devez conserver, car le cas échéant, vous pourrez dire adieu à vos données ⛔️).

Workflow (ou flux de travail)

Lorsque nous installons une nouvelle machine, nous appliquons le Workflow suivant :

  1. Installation de Restic.
  2. Création d'un conteneur de stockage orienté objet (utilisant le protocole S3) et initialisation via Restic.
  3. Mise en place du script de backup, contenant une rétention de 90 jours, et sauvegardant les répertoires que l'on souhaite, avec une liste d'exclusion si besoin.
  4. Automatisation du lancement de ce script, via une tâche CRON.
  5. Automatisation des mises à jour de Restic.
  6. Restauration, si nécessaire

Installation de Restic

Vous pouvez installer Restic via le gestionnaire de paquets, mais la version est obsolète (0.11 à l'heure où j'écris cet article, la version date de plus de 3 ans !)

Nous procédons de la manière suivante :

wget https://github.com/restic/restic/releases/download/v0.16.0/restic_0.16.0_linux_amd64.bz2 -P /tmp
# Notez qu'il vous faudra le paquet bunzip2 pour décompresser l'archive
bunzip2 /tmp/restic_0.16.0_linux_amd64.bz2
mv /tmp/restic_0.16.0_linux_amd64.bz2 /usr/sbin/restic
chmod +x /usr/sbin/restic

Mise à jour de Restic

Il faudra veiller à mettre à jour Restic régulièrement, ce dernier étant un élément assez sensible de notre infrastructure, il est normal de le tenir à jour :

restic self-update

Initialisation de notre repository

Dans notre cas, nous avons fait le choix d'utiliser le protocole S3 pour le stockage. Il nous faudra alors un accès API à notre provider :

export XYZ_ACCESS_KEY_ID=""
export XYZ_SECRET_ACCESS_KEY=""
export RESTIC_REPOSITORY="s3:URL/restic"

Puis générer un mot de passe très fort (conservez-le bien) :

export RESTIC_PASSWORD='UnMotDePasseFort0123PasCommeCelui-Ci!!!'

Une fois cela fait, initialiser le tout :

restic init

Ce qui nous renvoie l'information suivante :

created restic repository ab96pf4321 at yourhostname.domain.com

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

Mise en place du script de backup

#!/bin/bash
LOG=/var/log/restic_s3-$(date +%F)
source .env

/usr/sbin/restic backup --files-from .include.txt --exclude-file .exclude.txt >> $LOG
#!/bin/bash
LOG=/var/log/restic_s3-$(date +%F)
source .env

echo "Suppression des backups supérieurs à 90" >> $LOG
/usr/sbin/restic forget -l 90 >> $LOG

Le fichier include.txt et exclude.txt se présentent sous la forme d'une liste, ligne par ligne, contenant les répertoires concernés, par exemple :

/tmp
/home
/etc

Crontab

Dans notre exemple, nous réalisons nos sauvegardes à 1h du matin, tous les jours.

# Sauvegarde Restic
00 01 * * * /emplacement/backup/backup.sh

Commandes de base

Lister les snapshots :

source .env
restic snapshots -c
oWo7Ni  2023-08-27 01:00:02  serverA
eeH6ph  2023-08-28 01:00:01  serverA
quei2I  2023-08-29 01:00:02  serverA
uMee7J  2023-08-30 01:00:01  serverA
------------------------------------------------
90 snapshots

Chaque snapshot a son identifiant, c'est ce que vous voyez ci-dessus au niveau de la première colonne.

Restauration :

Lorsque vous souhaitez récupérer un fichier, ou un répertoire, la commande à utiliser sera la suivante :

restic restore <ID> --target /path/of/destination --include /path/of/dir/to/restore

À noter que Restic gère également les permissions de chaque fichier.


Bonus : Restic-Browser, un frontend graphique

Pendant la rédaction de cet article, je suis tombé sur un outil graphique, restic-browser, qui permet de gérer son espace de stockage Restic de façon plus intuitive. Le projet GitHub à l'origine de celui-ci, vous permettra de :

  • Afficher le contenu de chaque snapshot, et de chaque fichier ;
  • Récupérer un élément en local ;
  • Et bien d'autres...

Screenshot

L'outil nécessitera que vous ayez Restic installé sur votre poste, et est compatible avec Linux, macOS et Windows.

Vous pouvez consulter le projet GitHub ici : https://github.com/emuell/restic-browser