Aller au contenu principal

Proxmox Backup Server - Instances locale et distante sécurisées

Proxmox Backup Server (PBS) est la solution de sauvegarde dédiée pour les environnements Proxmox VE. L'infrastructure du homelab utilise une architecture 3-2-1 avec deux instances PBS :

  • PBS local : Sauvegarde primaire des VMs sur stockage NFS
  • PBS distant (VPS) : Sauvegarde secondaire offsite pour la redondance

Cette architecture garantit la disponibilité des sauvegardes même en cas de sinistre majeur affectant le homelab.

Architecture globale​

Principe de fonctionnement​

┌─────────────────────────────────────────────────────────────────┐
│ HOMELAB │
│ ┌──────────────┐ Backup ┌─────────────────┐ │
│ │ Proxmox VE │──────────────▶│ PBS Local │ │
│ │ (Hyperviseur)│ Toutes les │ (192.168.100.40)│ │
│ │ │ 6 heures │ │ │
│ └──────────────┘ │ Datastore: │ │
│ │ nfs-storage │ │
│ └────────┬────────┘ │
│ │ │
│ Sync │ Pull │
│ (Dimanche 1h) │
└──────────────────────────────────────────┼──────────────────────┘
│
WireGuard Tunnel
(10.200.0.0/24)
│
┌──────────────────────────────────────────┼──────────────────────┐
│ VPS │
│ ┌───────▼─────────┐ │
│ │ PBS Distant │ │
│ │ (TellPBS) │ │
│ │ │ │
│ │ Datastore: │ │
│ │ remote-backup │ │
│ │ │ │
│ │ Rétention: │ │
│ │ 26 semaines │ │
│ └─────────────────┘ │
└──────────────────────────────────────────────────────────────────┘

Caractéristiques de sécurité​

  • Chiffrement end-to-end : Les sauvegardes sont chiffrées côté client (PVE) avant envoi au PBS
  • Tunnel WireGuard : Toute communication inter-sites transite par un tunnel VPN chiffré
  • Principe du moindre privilège : Le VPS peut uniquement accéder au port 8007 du PBS local pour tirer les sauvegardes
  • Protection contre compromission : Le homelab ne peut pas accéder au PBS distant, empêchant un attaquant de modifier ou détruire les sauvegardes offsite
  • Pare-feu strict : Seul le trafic nécessaire est autorisé sur le tunnel (port 8007 depuis VPS vers PBS local, ICMP bidirectionnel)

Instance locale PBS​

Contexte​

Le PBS local est la cible primaire des sauvegardes Proxmox VE. Il stocke les sauvegardes sur un datastore NFS monté, offrant capacité et performance adaptées à des sauvegardes fréquentes.

Création des utilisateurs​

Le PBS local nécessite deux utilisateurs distincts avec des permissions différentes :

Création utilisateur backup

Utilisateur backup@pbs :

  • User name : backup
  • Realm : Proxmox Backup authentication server
  • Rôle : Utilisé par Proxmox VE pour écrire les sauvegardes

Utilisateur remote@pbs :

  • User name : remote
  • Realm : Proxmox Backup authentication server
  • Rôle : Utilisé par le PBS distant pour lire les sauvegardes

Attribution des permissions​

Permissions utilisateurs

Configuration des permissions :

UtilisateurPathRôleUsage
backup@pbs/datastore/nfs-storageDatastoreBackupÉcriture des sauvegardes depuis Proxmox VE
backup@pbs/datastore/nfs-storageDatastoreReaderLecture des sauvegardes
remote@pbs/datastore/nfs-storageDatastoreReaderLecture des sauvegardes par le PBS distant

Cette séparation des privilèges garantit que :

  • Proxmox VE peut écrire ses sauvegardes (DatastoreBackup) et les lire (DatastoreReader)
  • Le PBS distant peut uniquement lire (DatastoreReader), pas écrire, modifier ou supprimer

Configuration Proxmox VE​

Ajout du backend de stockage PBS​

Configuration stockage PVE - Général

Paramètres :

  • ID : PBS
  • Server : 192.168.100.40 (IP du PBS local)
  • Username : backup@pbs
  • Datastore : nfs-storage

Proxmox VE peut maintenant sauvegarder directement vers le PBS local.

Activation du chiffrement​

Configuration chiffrement

Option choisie : Auto-generate a client encryption key

Importance critique : Le chiffrement côté client garantit que :

  • Les données sont chiffrées avant de quitter l'hyperviseur
  • Le PBS local et distant ne peuvent pas déchiffrer les données sans la clé
  • La clé de chiffrement reste uniquement sur Proxmox VE

Cette configuration est requise par la politique de sécurité du Sync Job distant (Encrypted Only).

Configuration du Backup Job​

Backup Job PVE

Paramètres :

  • Storage : PBS
  • Schedule : 00/6:00 (toutes les 6 heures)
  • Mode : Snapshot
  • Compression : ZSTD

Les VMs sont sauvegardées automatiquement 4 fois par jour, garantissant un RPO (Recovery Point Objective) de 6 heures maximum.

Notifications PVE​

Configuration des cibles​

Cibles de notification

Proxmox VE envoie les notifications vers Gotify pour les notifications push mobiles.

Règle d'alerte backup​

Règle notification échec backup

Matcher : Backup-Failures

Configuration :

  • Match severity : error
  • Match field : type=vzdump

Une alerte est envoyée immédiatement en cas d'échec d'une tâche de sauvegarde vzdump.

Types de notifications disponibles

Proxmox offre des types de notifications pour divers événements système : mises à jour, réplication, fencing, etc.

Instance distante PBS (VPS)​

Prérequis​

Un VPS Debian 13 (Trixie) avec :

  • Accès root SSH par clé publique uniquement
  • Au moins 100 GB d'espace disque pour les sauvegardes
  • IP publique fixe

Installation de Proxmox Backup Server​

Ajout du dépôt PBS​

Créer le fichier /etc/apt/sources.list.d/pbs-no-subscription.sources :

Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg

Installation​

apt update
apt install proxmox-backup-server

Configuration initiale​

# Changer le mot de passe root
passwd

À ce stade, PBS est accessible sur le port 8007 depuis n'importe quelle IP. Il faut sécuriser l'accès immédiatement.

Sécurisation du VPS​

Installation du pare-feu​

apt install iptables-persistent -y

Configuration des règles iptables​

# Nettoyage
iptables -F
iptables -X
iptables -Z

# Politique par défaut (DROP tout ce qui veut rentrer)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback (pour tunnel SSH :8007)
iptables -A INPUT -i lo -j ACCEPT

# Connexions établies
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Anti-bruteforce SSH
iptables -N SSH_CHECK
iptables -A INPUT -p tcp --dport 22 -j SSH_CHECK
iptables -A SSH_CHECK -m recent --set --name SSH
iptables -A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
iptables -A SSH_CHECK -j ACCEPT

# WireGuard
iptables -A INPUT -p udp --dport 51820 -j ACCEPT

# Trafic interne WireGuard (Accès PBS via 10.x.x.x)
iptables -A INPUT -i wg0 -j ACCEPT

# ICMP (ping et traceroute)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Sauvegarder
netfilter-persistent save

Explications :

  • SSH_CHECK : Limite à 4 tentatives SSH par minute par IP
  • WireGuard port 51820 : Requis pour le tunnel VPN
  • wg0 accept : Règle temporaire, sera verrouillée plus tard
  • Loopback : Permet l'accès à PBS via tunnel SSH

Redémarrer le VPS pour valider la configuration :

reboot

Accès via tunnel SSH​

Maintenant que le port 8007 n'est plus exposé publiquement, l'accès se fait via tunnel SSH :

ssh -L 8007:localhost:8007 root@<IP_VPS>

L'interface PBS est accessible sur https://localhost:8007

Dashboard PBS distant

Le dashboard montre l'instance PBS nommée TellPBS, accessible via le tunnel SSH.

Configuration WireGuard​

WireGuard établit un tunnel VPN chiffré entre le PBS local et le VPS, permettant au VPS de tirer les sauvegardes de manière sécurisée.

Topologie réseau​

  • Réseau WireGuard : 10.200.0.0/24
  • VPS (serveur) : 10.200.0.1/24
  • PBS homelab (client) : 10.200.0.2/24

Le VPS est le serveur WireGuard, le PBS local est le client qui initie la connexion.

Installation​

Sur les deux nœuds :

apt update
apt install wireguard -y

Configuration sur le VPS​

Génération des clés :

cd /etc/wireguard
umask 077
wg genkey | tee vps-private.key | wg pubkey > vps-public.key

echo "Private key VPS:"
cat vps-private.key
echo "Public key VPS:"
cat vps-public.key

Créer /etc/wireguard/wg0.conf :

[Interface]
Address = 10.200.0.1/24
PrivateKey = <CLE_PRIVEE_VPS>
ListenPort = 51820

[Peer]
PublicKey = <CLE_PUBLIQUE_PBS_LOCAL>
AllowedIPs = 10.200.0.2/32
PersistentKeepalive = 10

Configuration sur le PBS local​

Génération des clés :

cd /etc/wireguard
umask 077
wg genkey | tee pbs-private.key | wg pubkey > pbs-public.key

echo "Private key PBS:"
cat pbs-private.key
echo "Public key PBS:"
cat pbs-public.key

Créer /etc/wireguard/wg0.conf :

[Interface]
Address = 10.200.0.2/24
PrivateKey = <CLE_PRIVEE_PBS_LOCAL>

[Peer]
PublicKey = <CLE_PUBLIQUE_VPS>
Endpoint = <IP_PUBLIQUE_VPS>:51820
AllowedIPs = 10.200.0.1/32
PersistentKeepalive = 10

Activation du tunnel​

Sur le VPS :

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0
wg show

Sur le PBS local :

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0
wg show

Tests de connectivité​

Depuis le PBS local :

ping 10.200.0.1
curl -k https://10.200.0.1:8007

Résultat attendu : Ping réussi (~97ms de latence), réponse HTTP du PBS distant.

Depuis le VPS :

ping 10.200.0.2
curl -k https://10.200.0.2:8007

Résultat attendu : Ping réussi, réponse HTTP du PBS local.

Si les deux tests fonctionnent, le tunnel WireGuard est opérationnel.

Verrouillage du tunnel WireGuard​

Par défaut, la règle iptables -A INPUT -i wg0 -j ACCEPT autorise tout le trafic sur le tunnel. Il faut appliquer le principe du moindre privilège.

Flux réseau nécessaires​

C'est le PBS du VPS qui pull les sauvegardes, donc seul le trafic initié par le VPS est nécessaire :

  • VPS → PBS local : Port 8007/TCP (pull des backups)
  • Bidirectionnel : ICMP (ping/debug)
  • Bidirectionnel : Connexions établies (réponses aux requêtes initiées)

Le PBS local ne doit pas pouvoir accéder au PBS distant : si le homelab est compromis, l'attaquant ne pourra pas modifier ou détruire les sauvegardes offsite.

Pare-feu sur le VPS​

# Supprimer la règle générique wg0
iptables -D INPUT -i wg0 -j ACCEPT

# Connexions établies
iptables -A INPUT -i wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# ICMP ping uniquement
iptables -A INPUT -i wg0 -s 10.200.0.2 -p icmp --icmp-type echo-request -j ACCEPT

# Bloquer tout le reste sur wg0
iptables -A INPUT -i wg0 -j DROP

# Sauvegarder
netfilter-persistent save

Pare-feu sur le PBS local (nftables)​

Créer /etc/nftables.conf :

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
chain input {
type filter hook input priority filter; policy drop;

# Loopback
iif lo accept

# Connexions établies
ct state established,related accept

# Rejeter paquets invalides
ct state invalid drop

# Administration depuis homelab
ip saddr { 192.168.100.0/24, 192.168.10.0/24 } tcp dport { 22, 8007 } accept

# WireGuard : VPS peut accéder au port 8007
iifname "wg0" ip saddr 10.200.0.1 tcp dport 8007 accept
iifname "wg0" ip saddr 10.200.0.1 icmp type echo-request accept

# Bloquer le reste sur wg0
iifname "wg0" drop
}

chain forward {
type filter hook forward priority filter; policy drop;
}

chain output {
type filter hook output priority filter; policy accept;
}
}

Appliquer la configuration :

systemctl enable nftables
systemctl start nftables

Validation de la sécurité​

Test depuis le VPS (doit fonctionner) :

ping 10.200.0.2 # ✅ Succès
curl -k https://10.200.0.2:8007 # ✅ Succès

Test depuis le PBS local (doit échouer) :

ping 10.200.0.1 # ✅ Succès (ICMP autorisé)
curl -k https://10.200.0.1:8007 # ❌ Timeout (aucune réponse)

Résultat attendu : Le PBS local peut ping le VPS, mais ne peut pas accéder à l'interface web. C'est le comportement voulu : si le homelab est compromis, l'attaquant ne peut pas accéder au PBS distant.

Configuration PBS distant​

Création de l'utilisateur local​

Création utilisateur et permissions

Configuration :

  • Utilisateur : remote@pbs
  • Chemin : /datastore/remote-backup
  • Rôle : DatastoreBackup

Cet utilisateur gérera les sauvegardes synchronisées depuis le homelab.

Création du Datastore​

Création datastore

Paramètres :

  • Name : remote-backup
  • Backing Path : /mnt/hdd
  • GC Schedule : Mon 03:00 (Garbage Collection le lundi à 3h)
  • Prune Schedule : none (géré par un Prune Job séparé)

Le datastore stocke les sauvegardes synchronisées.

Ajout du Remote​

Ajout remote homelab

Menu : Configuration → Remote → Add

Paramètres :

  • Remote ID : homelab-pbs
  • Host : 10.200.0.2 (IP WireGuard du PBS local)
  • Auth ID : remote@pbs
  • Password : Mot de passe de remote@pbs
  • Fingerprint : Fingerprint du certificat SSL du PBS local

Le Remote définit la source depuis laquelle tirer les sauvegardes. L'utilisateur remote@pbs a le rôle DatastoreReader sur le PBS local, suffisant pour lire les sauvegardes sans pouvoir les modifier.

Configuration du Sync Job​

Sync Job - Options

Menu : Configuration → Sync Jobs → Add

Paramètres obligatoires :

  • Local Datastore : remote-backup
  • Local Namespace : Root
  • Local Owner : remote@pbs
  • Source Remote : homelab-pbs
  • Source Datastore : nfs-storage
  • Source Namespace : Root
  • Sync Schedule : Sun 01:00 (dimanche à 1h du matin)
  • Remove Vanished : ✅ Coché (supprime les backups supprimés sur la source)

Sync Job - Sécurité

Paramètres de sécurité (CRITIQUES) :

  • Transfer Last : 1 (ne transfère que la dernière sauvegarde par VM)
  • Encrypted Only : ✅ Coché (refuse les sauvegardes non chiffrées)
  • Verified Only : ✅ Coché (refuse les sauvegardes non vérifiées)
  • Re-sync Corrupt : ✅ Coché (re-synchronise automatiquement si corruption détectée)

Ces paramètres garantissent que :

  • Seules les sauvegardes chiffrées sont acceptées (pas de confiance envers le VPS pour la confidentialité)
  • Seules les sauvegardes vérifiées sont acceptées (garantie d'intégrité)
  • La synchronisation est limitée à la dernière sauvegarde (économie de bande passante)

Configuration du Prune Job​

Prune Job

Menu : Datastore → remote-backup → Prune & GC → Add

Paramètres :

  • Schedule : Mon 02:00 (lundi à 2h, après le sync du dimanche)
  • Keep Weekly : 26 (garde 26 sauvegardes hebdomadaires ≈ 6 mois)
  • Namespace : /

Commentaire : "Garde une backup par semaine sur les 6 derniers mois"

Le Garbage Collector nettoie automatiquement l'espace à Mon 03:00.

Configuration du Verify Job​

Verify Job

Menu : Datastore → remote-backup → Verify Jobs → Add

Paramètres :

  • Datastore : remote-backup
  • Schedule : Tue 02:00 (tous les mardis à 2h)
  • Skip Verified : ❌ Désactivé (vérifie toutes les sauvegardes à chaque fois)

Le Verify Job garantit l'intégrité des sauvegardes en recalculant les checksums.

Configuration des notifications​

Notification échec Sync​

Notification échec sync

Configuration :

  • Match severity : error
  • Match field : type=sync

Alerte immédiate en cas d'échec de synchronisation.

Notification échec Verify​

Notification échec verify

Configuration :

  • Match severity : error
  • Match field : type=verify

Alerte immédiate en cas d'échec de vérification (corruption de données).

Test de la synchronisation​

Test Sync Job

Menu : Configuration → Sync Jobs → Sélectionner le job → Run Now

Le premier sync prendra du temps (transfert complet), mais grâce à la déduplication de PBS, les prochaines synchronisations seront beaucoup plus rapides.

Le log indique une synchronisation réussie.

Supervision Zabbix​

Configuration Zabbix

Pour surveiller le PBS distant, un agent Zabbix est configuré en mode actif.

Configuration de l'agent (/etc/zabbix/zabbix_agent2.conf) :

Hostname=PBS-remote
ServerActive=141.253.114.252:10051
ListenIP=127.0.0.1
# Server= est commenté (désactivé)

Configuration dans Zabbix :

  • Host name : PBS-remote
  • Template : Linux by Zabbix agent active
  • IP : 127.0.0.1
  • Port : 10050

L'agent contacte le serveur Zabbix via le tunnel WireGuard et remonte les métriques système (CPU, RAM, disque, etc.).

Flux de sauvegarde complet​

Timeline hebdomadaire​

Toutes les 6 heures :

  • Proxmox VE sauvegarde les VMs vers PBS local (chiffrement client)

Dimanche 01:00 :

  • PBS distant tire (pull) la dernière sauvegarde de chaque VM via WireGuard

Lundi 02:00 :

  • Prune Job supprime les anciennes sauvegardes (garde 26 semaines)

Lundi 03:00 :

  • Garbage Collector récupère l'espace disque libéré

Mardi 02:00 :

  • Verify Job vérifie l'intégrité de toutes les sauvegardes

Chaîne de sécurité​

  1. Chiffrement à la source : La clé de chiffrement ne quitte jamais Proxmox VE
  2. Transit sécurisé : WireGuard chiffre le tunnel entre PBS local et distant
  3. Lecture seule depuis le VPS : Le VPS peut uniquement lire les sauvegardes, jamais les modifier à la source
  4. Principe du moindre privilège : Seul le port 8007 du PBS local est accessible depuis le VPS
  5. Isolation réseau : Le homelab ne peut pas accéder au PBS distant

Avantages de cette architecture​

Résilience​

  • Sauvegarde locale : Restauration rapide des VMs (haute disponibilité)
  • Sauvegarde offsite : Protection contre sinistre majeur (incendie, vol, inondation)
  • Rétention longue : 6 mois d'historique sur le VPS

Sécurité​

  • Chiffrement end-to-end : Aucune confiance envers le VPS pour la confidentialité
  • Protection contre compromission : Le homelab ne peut pas accéder au PBS distant, empêchant la destruction des sauvegardes offsite
  • Accès en lecture seule : Le VPS peut lire mais pas modifier les sauvegardes sources
  • Pare-feu strict : Surface d'attaque minimale sur le tunnel WireGuard
  • Vérification automatique : Détection précoce de la corruption

Automatisation​

  • Sauvegardes automatiques : 4 fois par jour
  • Synchronisation hebdomadaire : Bande passante économisée
  • Purge automatique : Gestion de l'espace disque
  • Notifications : Alertes en cas de problème

Ressources​