Cet article fait partie d’une sĂ©rie :

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.

  1. CrĂ©ation d’un rĂ©pertoire bin dans le home :
$ sudo -u restic mkdir ~restic/bin
  1. 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'
  1. 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
  1. 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

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 :

Les configurations

Les Ă©tapes suivantes sont rĂ©alisĂ©es par l’utilisateur restic, depuis son home. Sinon les permissions seront Ă  corriger.

  1. Créer le répertoire pour stocker les configurations :
$ sudo -u restic mkdir -p ~restic/.config/restic
  1. 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=
  1. 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.

  1. Activer les instances utilisateurs systemd au dĂ©marrage (et non Ă  l’ouverture de session) :
$ sudo loginctl enable-linger restic
  1. Ajouter les lignes suivantes pour afecter les variables XDG_RUNTIME_DIR et DBUS_SESSION_BUS_ADDRESS manuellement 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.

  1. Créer le répertoire pour les services systemd :
$ sudo -u restic mkdir -p ~/.config/systemd/user/
  1. 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
  1. 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
  1. 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
  1. 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
  1. Recharger la liste des services :
$ systemctl --user daemon-reload
  1. 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.

  1. 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
  1. 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
  1. 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
  1. 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
  1. Recharger la liste des services :
$ sudo systemctl daemon-reload
  1. 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.

  1. 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
  1. 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