====== Gentiane — Installation Debian, stockage chiffré ZFS et réception Borg ======
Cette page décrit l’installation et la mise en service du serveur de sauvegarde. Les valeurs spécifiques au site (adresses IP, clés publiques, UUID, mots de passe et noms de clients) doivent être remplacées par des valeurs locales.
===== Architecture =====
NVMe
└── Debian : /, /boot/efi, swap
Disque SATA dédié aux sauvegardes
└── LUKS2 : crypt-backup
└── zpool ZFS : backup
└── dataset : backup/borg
└── monté sur /srv/borg
└── dépôts Borg chiffrés côté clients
Le disque de sauvegarde est chiffré par LUKS. Le pool ZFS est créé au-dessus du volume déchiffré. Borg chiffre en plus chaque dépôt côté client.
===== Installation de Debian =====
Installer Debian par netinstall.
* Installer le système sur le NVMe.
* Créer un point de montage ''/srv'' sur le disque SATA pendant l’installation si souhaité.
* Activer SSH pendant l’installation.
* Créer un utilisateur administrateur, puis lui donner accès à ''sudo''.
su -
apt update
apt install sudo
adduser NOM_UTILISATEUR sudo
Se déconnecter puis se reconnecter pour prendre en compte le groupe ''sudo''.
Vérification essentielle :
id
sudo whoami
===== Activer les dépôts nécessaires =====
ZFS est distribué dans le composant APT ''contrib''.
Éditer le fichier de sources Debian, généralement :
sudo nano /etc/apt/sources.list
Vérifier que chaque ligne Components: main contrib non-free-firmware
Mettre à jour les index et installer les outils :
sudo apt update
sudo apt install linux-headers-$(uname -r) cryptsetup zfs-dkms zfsutils-linux zfs-zed smartmontools systemd-cryptsetup
Vérifications :
sudo modprobe zfs
zpool --version
sudo /usr/sbin/dkms status
===== Identifier le disque de sauvegarde =====
Avant toute commande destructive, identifier formellement le disque SATA destiné aux sauvegardes.
sudo lsblk -o NAME,SIZE,MODEL,SERIAL,TYPE,FSTYPE,UUID,MOUNTPOINTS
sudo findmnt /srv
Les commandes suivantes détruisent définitivement le contenu du disque SATA ciblé. Vérifier le modèle, la taille et le numéro de série. Ne jamais viser le NVMe système.
===== Créer LUKS2 sur le disque SATA =====
Supprimer l’ancien montage ''/srv'' du fichier ''/etc/fstab'', puis démonter le volume.
sudo cp -a /etc/fstab /etc/fstab.before-zfs
sudo nano /etc/fstab
sudo umount /srv
Dans ''/etc/fstab'', commenter ou supprimer uniquement la ligne correspondant à l’ancien montage ''/srv'' sur le SATA.
Effacer les signatures existantes. Remplacer ''/dev/sdX'' par le disque SATA réellement identifié.
sudo wipefs -a /dev/sdX
sudo lsblk -f /dev/sdX
Créer le conteneur LUKS2 :
sudo cryptsetup luksFormat \
--type luks2 \
--pbkdf argon2id \
/dev/sdX
Ouvrir le volume sous le nom ''crypt-backup'' :
sudo cryptsetup open /dev/sdX crypt-backup
Vérification :
sudo cryptsetup status crypt-backup
===== Créer le pool ZFS =====
Créer le pool ZFS sur le périphérique déchiffré, jamais directement sur le disque LUKS.
sudo zpool create \
-o ashift=12 \
-O mountpoint=none \
-O compression=zstd \
-O atime=off \
-O xattr=sa \
-O acltype=posixacl \
backup /dev/mapper/crypt-backup
Créer le dataset destiné aux dépôts Borg :
sudo zfs create \
-o mountpoint=/srv/borg \
backup/borg
Vérifications :
sudo zpool status backup
sudo zfs list
findmnt /srv/borg
Résultat attendu : pool ''backup'' en état ''ONLINE'' et dataset ''backup/borg'' monté sur ''/srv/borg''.
===== Configuration de démarrage manuel =====
Le système Debian est installé sur le NVMe et doit démarrer même si le disque de sauvegarde chiffré est fermé. Le volume LUKS est donc marqué ''noauto'' dans ''crypttab''.
Récupérer l’UUID LUKS :
sudo cryptsetup luksUUID /dev/sdX
Ajouter dans ''/etc/crypttab'' :
sudo cp -a /etc/crypttab /etc/crypttab.before-backup
sudo nano /etc/crypttab
crypt-backup UUID=UUID_LUKS_REEL none luks,noauto
Recharger systemd :
sudo systemctl daemon-reload
Configurer le cache et les services ZFS :
sudo zpool set cachefile=/etc/zfs/zpool.cache backup
sudo systemctl enable zfs-import-cache.service
sudo systemctl enable zfs-mount.service
sudo systemctl enable zfs-zed.service
Le chemin ''/srv/borg'' ne doit pas être ajouté à ''/etc/fstab'' : ZFS gère le montage du dataset.
===== Script de déverrouillage =====
Créer le script ''/usr/local/sbin/unlock-backup'' :
sudo nano /usr/local/sbin/unlock-backup
#!/bin/sh
set -eu
MAPPER=crypt-backup
POOL=backup
DEVICE=/dev/disk/by-uuid/UUID_LUKS_REEL
if ! cryptsetup status "$MAPPER" >/dev/null 2>&1; then
cryptsetup open "$DEVICE" "$MAPPER"
fi
if ! zpool list -H -o name 2>/dev/null | grep -Fxq "$POOL"; then
zpool import "$POOL"
fi
zpool status "$POOL"
findmnt /srv/borg
Remplacer ''UUID_LUKS_REEL'' par l’UUID retourné par ''cryptsetup luksUUID''.
Appliquer les permissions :
sudo chown root:root /usr/local/sbin/unlock-backup
sudo chmod 0750 /usr/local/sbin/unlock-backup
Après chaque démarrage, se connecter en SSH puis déverrouiller le stockage :
sudo /usr/local/sbin/unlock-backup
Le script demande la passphrase LUKS dans la session SSH, importe le pool ZFS, puis le dataset est monté automatiquement sur ''/srv/borg''.
Vérifications :
sudo zpool status backup
findmnt /srv/borg
===== Installation de Borg =====
Déverrouiller le stockage avant toute opération Borg :
sudo /usr/local/sbin/unlock-backup
Installer Borg :
sudo apt update
sudo apt install borgbackup
borg --version
Créer le compte de service :
sudo adduser \
--system \
--group \
--home /srv/borg \
--shell /usr/sbin/nologin \
borg
sudo chown borg:borg /srv/borg
sudo chmod 0750 /srv/borg
sudo install -d -o borg -g borg -m 0700 /srv/borg/.ssh
sudo install -o borg -g borg -m 0600 /dev/null /srv/borg/.ssh/authorized_keys
Créer un répertoire par client :
sudo install -d -o borg -g borg -m 0700 /srv/borg/NOM_CLIENT
===== Autoriser un client Borg =====
Sur le client, créer une clé SSH dédiée :
sudo install -d -m 0700 /root/.ssh
sudo ssh-keygen \
-t ed25519 \
-f /root/.ssh/id_ed25519_borg_gentiane \
-C "borg-NOM_CLIENT-vers-gentiane"
sudo cat /root/.ssh/id_ed25519_borg_gentiane.pub
Sur le serveur, ajouter la clé publique du client dans ''/srv/borg/.ssh/authorized_keys'' avec une commande forcée. Adapter le chemin de Borg affiché par ''command -v borg''.
command -v borg
sudo nano /srv/borg/.ssh/authorized_keys
Exemple sans mode append-only :
command="/usr/bin/borg serve --restrict-to-path /srv/borg/NOM_CLIENT",restrict ssh-ed25519 CLE_PUBLIQUE_CLIENT commentaire
Exemple en mode append-only :
command="/usr/bin/borg serve --append-only --restrict-to-path /srv/borg/NOM_CLIENT",restrict ssh-ed25519 CLE_PUBLIQUE_CLIENT commentaire
Appliquer les permissions :
sudo chown borg:borg /srv/borg/.ssh/authorized_keys
sudo chmod 0600 /srv/borg/.ssh/authorized_keys
===== Initialiser un dépôt depuis le client =====
Créer une configuration SSH dédiée sur le client :
sudo nano /root/.ssh/config
Host borg-gentiane
HostName ADRESSE_DU_SERVEUR
User borg
IdentityFile /root/.ssh/id_ed25519_borg_gentiane
IdentitiesOnly yes
Puis protéger ce fichier :
sudo chmod 0600 /root/.ssh/config
Avec Borg 1.x, initialiser le dépôt chiffré depuis le client :
sudo borg init \
--encryption=repokey-blake2 \
ssh://borg-gentiane/./NOM_CLIENT
Créer une première archive :
sudo borg create \
--verbose \
--stats \
--compression zstd,6 \
--exclude-caches \
ssh://borg-gentiane/./NOM_CLIENT::'{hostname}-{now:%Y-%m-%d_%H-%M}' \
/etc /home
Vérifications sur le client :
sudo borg list ssh://borg-gentiane/./NOM_CLIENT
sudo borg check ssh://borg-gentiane/./NOM_CLIENT
===== Installer Wiregard =====
sudo apt install wireguard
== Création des clés publique et privé ==
wg genkey | sudo tee /etc/wireguard/wg-private.key | wg pubkey | sudo tee /etc/wireguard/wg-public.key
La valeur retournée suite à cette commande est la clé publique de VOTRE serveur à envoyer à support@ilico.org
== Configuration Wireguard ==
Pour la visualiser :
sudo cat /etc/wireguard/wg-private.key
Puis l'inscrire dans :
sudo nano /etc/wireguard/wg0.conf
[Interface]
# Adresse IP du client à l'intérieur du VPN
Address = ,
# Clef privée du client
PrivateKey =
DNS = 80.67.180.1, 9.9.9.9
# === Configuration liée au serveur ===
[Peer]
# Clef publique du du serveur
PublicKey =
# Adresse et port du serveur
Endpoint = 80.67.180.4:37448
# Range d'adresses IP qui doivent être routées à travers le VPN
AllowedIPs = 0.0.0.0/0, ::/0
# Et pour finir, le keepalive pour éviter d'avoir des soucis
# si le client se trouve derrière un routeur NAT
PersistentKeepalive = 25
== Utilisation ==
Pour lancer wireguard :
sudo wg-quick up wg0
Pour vérifier l'existence de l'interface wg0
ip a
Pour afficher la configuration de l'interface "wg0"
sudo wg show wg0
Pour activer le lancement de wireguard au démarrage
sudo systemctl enable wg-quick@wg0.service
===== Maintenance =====
Vérifier l’état ZFS :
sudo zpool status backup
Lancer périodiquement un scrub ZFS :
sudo zpool scrub backup
sudo zpool status backup
Vérifier l’état SMART du disque SATA :
sudo smartctl -a /dev/sdX
Fermer proprement le stockage si nécessaire, hors période de sauvegarde :
cd ~
sudo zfs unmount backup/borg
sudo zpool export backup
sudo cryptsetup close crypt-backup
===== Notes de sécurité =====
* Le chiffrement Borg doit être activé à la création de chaque dépôt.
* Utiliser une clé SSH distincte par client Borg.
* Restreindre chaque clé SSH à son seul chemin de dépôt avec ''borg serve --restrict-to-path''.
* Le mode ''--append-only'' protège mieux les archives existantes contre un client compromis, mais empêche les suppressions et la maintenance habituelles depuis ce client.
* Un pool ZFS à un seul disque détecte les corruptions, mais ne peut pas les réparer automatiquement.