Cet article fait partie d’une sĂ©rie :
- Sauvegardes #1 â Introduction et serveur de sauvegarde đŸ
- Sauvegardes #2 â Sauvegardes de serveurs avec Restic đ
- Sauvegardes #3 â Sauvegardes de PC avec Restic đ»
- Sauvegardes #4 â Sauvegardes de bases MySQL/MariaDB avec Restic đïž
- Sauvegardes #5 â Sauvegardes d’annuaire OpenLDAP avec Restic đïž
- Sauvegardes #6 â Sauvegardes de bases PostgreSQL avec Restic đïž
Introduction
Suite au premier article de cette sĂ©rie dĂ©crivant le choix de la solution Restic et la mise en place du serveur de sauvegarde, cette 2Ăšme partie traitera de la mise en place de la sauvegarde d’un serveur Debian Buster/10.
Créer un utilisateur dédié
Afin d’Ă©viter de rĂ©aliser les sauvegardes avec le compte root, un utilisateur dĂ©diĂ© Ă la rĂ©alisation de ces taches doit ĂȘtre créé :
$ sudo useradd -m restic -s /bin/bash
Installation de Restic
Restic sera installĂ© dans le home de l’utilisateur prĂ©cĂ©demment créé, avec des permissions spĂ©cifiques afin d’accĂ©der Ă des fichiers systĂšmes1.
- CrĂ©ation d’un rĂ©pertoire
bindans le home :
$ sudo -u restic mkdir ~restic/bin
- DĂ©ploiement de Restic (pensez Ă adapter l’URL Ă la derniĂšre version de Restic) :
$ sudo -u restic sh -c 'curl -L https://github.com/restic/restic/releases/download/v0.12.1/restic_0.12.1_linux_amd64.bz2 | bunzip2 > ~restic/bin/restic'
- Ajustement de la propriĂ©tĂ© et des permissions sur le binaire, afin que seuls les utilisateurs root et restic puissent lâexĂ©cuter :
$ sudo chown root:restic ~restic/bin/restic
$ sudo chmod 750 ~restic/bin/restic
- Il faut enfin ajouter un attribut étendu au binaire pour étendre ses capacités2 à chaque exécution :
cap_dac_read_search: donne un accĂšs complet en lecture au systĂšme, en contournant les restrictions d’accĂšs en lecture aux fichiers et l’ouverture des rĂ©pertoires. Cela permet Ă un utilisateur Ă faible privilĂšge (restic) dâexĂ©cuter une sauvegarde sur l’ensemble du serveur.+: ajoute la capacitĂ©e: Effective - active la capacitĂ©p: Permitted - autorise la capacitĂ©
$ sudo setcap cap_dac_read_search=+ep ~restic/bin/restic
Il est prĂ©fĂ©rable d’ouvrir une nouvelle session afin de s’assurer que les changements ont bien Ă©tĂ© pris en compte.
Configurer SSH cÎté serveur à sauvegarder
CrĂ©er le rĂ©pertoire de configuration SSH de l’utilisateur restic et son fichier de configuration :
$ sudo -u restic mkdir ~restic/.ssh
$ sudo -u restic vim ~restic/.ssh/config
Ăditer ce fichier de configuration et ajouter les lignes suivantes :
Host <alias du serveur de sauvegarde>
HostName <nom de domaine ou IP du serveur de sauvegarde>
User restic
Port <port SSH>
IdentityFile /home/restic/.ssh/restic_id_rsa
Initialiser le dépÎt des sauvegardes
$ sudo -u restic /home/restic/bin/restic -r sftp:<alias du serveur de sauvegarde>:restic/<nom du dépÎt>/ init
sudo -u restic: lance la commande sous l’utilisateur restic/home/restic/bin/restic: chemin vers le binaire Restic-r sftp:<alias du serveur de sauvegarde>:restic/<nom du dĂ©pĂŽt>-r: pour indiquer l’adresse du dĂ©pĂŽt (repository)sftp: le protocole utilisĂ©<alias du serveur de sauvegarde>: l’alias indiquĂ© dans la configuration SSH ci-dessusrestic/<nom du dĂ©pĂŽt>: chemin du dĂ©pĂŽt sur le serveur de sauvegarde (en lâoccurrence dans un rĂ©pertoireresticqui contiendra les sauvegardes selon le nom du serveur sauvegardĂ©. Il est Ă©galement possible de nommer le dĂ©pĂŽt directement avec le nom de la machine Ă sauvegarder si cela fait du sens)init: fonction pour initialiser le dĂ©pĂŽt
Automatisation des sauvegardes
Afin d’assurer l’automatisation des sauvegardes, il sera nĂ©cessaire de crĂ©er des fichiers de configurations et des services systemd :
- 1 fichier de configuration contenant les paramĂštres de sauvegarde,
- 1 fichier d’exclusion (pour exclure des rĂ©pertoires ou fichiers au sein des arborescences sĂ©lectionnĂ©es pour la sauvegarde),
- 2 services
oneshot,- lancement des sauvegardes, qui sera exécuté quotidiennement à 1h du matin pour réaliser la sauvegarde et supprimer les snapshots en fonction de la politique de rétention (voir fichier de configuration),
- nettoyage des sauvegardes, qui sera exĂ©cutĂ©e mensuellement pour effectivement supprimer les donnĂ©es liĂ©es aux snapshots supprimĂ©s (cette opĂ©ration Ă©tant plus lourde, il n’est pas nĂ©cessaire de la lancer trop souvent),
- 2 timers pour planifier lâexĂ©cution de ces services.
Les configurations
Les Ă©tapes suivantes sont rĂ©alisĂ©es par l’utilisateur restic, depuis son home. Sinon les permissions seront Ă corriger.
- Créer le répertoire pour stocker les configurations :
$ sudo -u restic mkdir -p ~restic/.config/restic
-
Créer le fichier de configuration
~restic/.config/resitc/restic-backup.conf, avec les paramĂštres suivants :BACKUP_PATHS: les chemins des rĂ©pertoires Ă sauvegarder, sĂ©parĂ© par des espaces.BACKUP_EXCLUDES: le chemin du fichier d’exclusion. Laisser le champ vide s’il n’est pas nĂ©cessaire d’exclure des fichiers.RETENTION_DAYS: le nombre de snapshots journalier Ă garder.RETENTION_WEEKS: le nombre de snapshots hebdomadaire Ă garder.RETENTION_MONTHS: le nombre de snapshots mensuel Ă garder.RETENTION_YEARS: le nombre de snapshots annuel Ă garder.RESTIC_REPOSITORY: l’adresse du dĂ©pĂŽt.RESTIC_PASSWORD: le mot de passe du dĂ©pĂŽt.
Exemple :
BACKUP_PATHS="/etc /home"
BACKUP_EXCLUDES="--exclude-file /home/restic/.config/restic/restic-excludes.conf"
RETENTION_DAYS=7
RETENTION_WEEKS=4
RETENTION_MONTHS=6
RETENTION_YEARS=3
RESTIC_REPOSITORY=sftp:<alias du serveur de sauvegarde>:restic/<nom du dépÎt>/
RESTIC_PASSWORD=
- CrĂ©er le fichier d’exclusion
~/.config/restic/restic-excludes.conf, et y lister les chemins de fichiers ou répertoires à exclure. Par exemple :
/home/restic/tmp
/home/restic/somefile
Services avec instance utilisateur de systemd
PrĂ©parer l’environement Ă executer des services systemd sans avoir de session ouverte.
- Activer les instances utilisateurs systemd au dĂ©marrage (et non Ă l’ouverture de session) :
$ sudo loginctl enable-linger restic
- Ajouter les lignes suivantes pour afecter les variables
XDG_RUNTIME_DIRetDBUS_SESSION_BUS_ADDRESSmanuellement dans le .bashrc de restic (normalement elles le sont automatiquement Ă l’ouverture de session) :
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
Les Ă©tapes suivantes sont rĂ©alisĂ©es par l’utilisateur restic, depuis son home. Sinon les permissions seront Ă corriger.
- Créer le répertoire pour les services systemd :
$ sudo -u restic mkdir -p ~/.config/systemd/user/
- Créer le service pour les sauvegardes
~/.config/systemd/user/restic-backup.service:
[Unit]
Description=Restic backup service
[Service]
Type=oneshot
ExecStart=%h/bin/restic backup --verbose --one-file-system --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
ExecStartPost=%h/bin/restic forget --verbose --tag systemd.timer --group-by "paths,tags" --keep-daily $RETENTION_DAYS --keep-weekly $RETENTION_WEEKS --keep-monthly $RETENTION_MONTHS --keep-yearly $RETENTION_YEARS
EnvironmentFile=%h/.config/restic/restic-backup.conf
- Créer le timer pour les sauvegardes
~/.config/systemd/user/restic-backup.timer:
[Unit]
Description=Backup with restic daily
[Timer]
OnCalendar=*-*-* 1:00:00
Persistent=true
[Install]
WantedBy=timers.target
- Créer le service pour le nettoyage des sauvegardes
~/.config/systemd/user/restic-prune.service:
[Unit]
Description=Restic backup service (data pruning)
[Service]
Type=oneshot
ExecStart=%h/bin/restic prune
EnvironmentFile=%h/.config/restic/restic-backup.conf
- Créer le timer pour le nettoyage
~/.config/systemd/user/restic-prune.timer:
[Unit]
Description=Prune data from the restic repository monthly
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target
- Recharger la liste des services :
$ systemctl --user daemon-reload
- Activer les timers :
$ systemctl --user enable --now restic-backup.timer
$ systemctl --user enable --now restic-prune.timer
Il est également possible de lancer manuellement les services avec les commandes suivantes :
$ systemctl --user start restic-backup
$ systemctl --user start restic-prune.service
Services sans instance utilisateur de systemd
Les étapes suivantes sont réalisées par un utilisateur pouvant utiliser la commande sudo.
- Créer le service pour les sauvegardes
/etc/systemd/system/restic-backup.service:
[Unit]
Description=Restic backup service
[Service]
User=restic
Type=oneshot
ExecStart=/home/restic/bin/restic backup --verbose --one-file-system --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
ExecStartPost=/home/restic/bin/restic forget --verbose --tag systemd.timer --group-by "paths,tags" --keep-daily $RETENTION_DAYS --keep-weekly $RETENTION_WEEKS --keep-monthly $RETENTION_MONTHS --keep-yearly $RETENTION_YEARS
EnvironmentFile=/home/restic/.config/restic-backup.conf
- Créer le timer pour les sauvegardes
/etc/systemd/system/restic-backup.timer:
[Unit]
Description=Backup with restic daily
[Timer]
OnCalendar=*-*-* 1:00:00
Persistent=true
[Install]
WantedBy=timers.target
- Créer le service pour le nettoyage des sauvegardes
/etc/systemd/system/restic-prune.service:
[Unit]
Description=Restic backup service (data pruning)
[Service]
User=restic
Type=oneshot
ExecStart=/home/restic/bin/restic prune
EnvironmentFile=/home/restic/.config/restic-backup.conf
- Créer le timer pour le nettoyage
/etc/systemd/system/restic-prune.timer:
[Unit]
Description=Prune data from the restic repository monthly
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target
- Recharger la liste des services :
$ sudo systemctl daemon-reload
- Activer les timers :
$ sudo systemctl enable --now restic-backup.timer
$ sudo systemctl enable --now restic-prune.timer
Il est également possible de lancement manuellement les services avec les commandes suivantes :
$ sudo systemctl start restic-backup
$ sudo systemctl start restic-prune.service
Manipuler les sauvegardes
Lister les snapshots
$ sudo -u restic /home/restic/bin/restic -r sftp:<alias du serveur de sauvegarde>:restic/<nom du dépÎt>/ snapshots
Restorer un snapshot
$ mkdir $HOME/tmp
$ sudo -u restic /home/restic/bin/restic -r sftp:<alias du serveur de sauvegarde>:restic/<nom du dépÎt>/ restore latest --target /home/brice/tmp/<nom du serveur>-restore
Monter un snapshot
Restic utilise (fuse)[https://github.com/libfuse/libfuse] pour monter la sauvegarder comme un systĂšme de fichier local.
Il est donc nĂ©cessaire de l’installer prĂ©alablement :
$ sudo apt install fuse3
Puis créer un répertoire et monter le snapshot :
$ mkdir -p $HOME/mnt/restic
$ sudo -u restic /home/restic/bin/restic -r sftp:<alias du serveur de sauvegarde>:restic/<nom du dépÎt>/ mount ~/mnt/restic/
Bonus â mise Ă jour de Restic
Si Restic a été installé manuellement, comme décrit dans cet article, le gestionnaire de paquet ne pourra pas gérer sa mise à jour.
Il faudra la réaliser manuellement également. Pour cela il faut un utilisateur pouvant utiliser la commande sudo.
- Lancer restic avec la commande
self-update:
$ sudo ./home/restic/bin/restic self-update
writing restic to /home/restic/bin/restic
find latest release of restic at GitHub
latest version is 0.11.0
download SHA256SUMS
download SHA256SUMS.asc
GPG signature verification succeeded
download restic_0.11.0_linux_amd64.bz2
downloaded restic_0.11.0_linux_amd64.bz2
saved 19128320 bytes in /home/restic/bin/restic
successfully updated restic to version 0.11.0
- Corriger la propriété, les permissions et la capacité (voir plus haut pour les explications) :
$ sudo chown root:restic /home/restic/bin/restic
$ sudo chmod 750 /home/restic/bin/restic
$ sudo setcap cap_dac_read_search=+ep /home/restic/bin/restic
Sources
- https://www.server-world.info/en/note?os=Debian_9&p=ssh&f=5
- https://www.techrepublic.com/article/how-to-set-up-an-sftp-server-on-linux/
- https://unix.stackexchange.com/questions/422790/can-i-ssh-via-public-key-if-there-is-no-home-directory-on-the-remote-system
- https://fedoramagazine.org/automate-backups-with-restic-and-systemd/
- https://wiki.archlinux.org/index.php/Systemd/User#Automatic_start-up_of_systemd_user_instances