bareos-truenas

Utiliser un disque NVMe/TCP servi par un serveur TrueNAS sur une solution de sauvegarde Bareos

Les outils

  • TrueNAS Scale Community Edition : Un système d'exploitation à part entière basé sur Debian, libre et open source, qui s'appuie sur OpenZFS pour fournir une solution de stockage puissante. Site officiel
  • Bareos : Une solution de sauvegarde libre et open source, certifiée pour SUSE Linux Enterprise, Red Hat Enterprise Linux et Oracle Linux. Multi-plateforme, basée sur un principe de client-serveur, elle repose sur plusieurs composants, le directeur Bareos, un ou plusieurs démons de stockage et les démons de fichiers installés sur les clients à sauvegarder. Site officiel
  • NVMe-oF et NVMe/TCP : NVMe-over-Fabrics permet l'accès à des périphériques de stockage NVMe avec un accès à la mémoire flash via un lien réseau tout en maintenant les caractéristiques de faible latence et de haute performance inhérente à la norme NVMe. Parmi les sous-ensembles du NVMe-OF, NVMe/TCP utilise le protocole standard internet TCP/IP. Il peut fonctionner parallèlement au trafic réseau ethernet existant. Cela en fait naturellement le successeur de l'iSCSI. Documentation Red Hat

Dans ce contexte, il faut savoir que l'on n'utilise pas un partage Samba ou NFS et que le client (initiator) verra un disque "physique" servi par le serveur (target)

Objectifs

  • Mettre en place un subsystem NVMe-oF sur le serveur TrueNAS
  • Connecter le subsystem sur un serveur RHEL 10 pour utiliser un disque NVMe/TCP
  • Installer Bareos sur le serveur RHEL
  • Sécuriser les connexions entre les services et les clients Bareos
  • Installer et sécuriser la WebUI de Bareos
  • Mettre en place une sauvegarde journalisée depuis un serveur Debian vers le disque NVMe/TCP

Contexte

  • Toutes les machines sont connectées à un réseau LAN 192.168.10.0/24 et se situent dans le domaine home.lab
  • 1 serveur TrueNAS 25.10.1 Community Edition avec 2 interfaces réseaux - Hostname = srv-truenas.home.lab - IP = 192.168.10.121
  • 1 pool de stockage dédié sur le serveur TrueNAS
  • 1 serveur RHEL 10 avec 2 interfaces réseaux pour l'installation de Bareos Director, Storage Daemon et File Daemon - Hostname = srv-bareos.home.lab - IP = 192.168.10.222
  • 1 serveur Debian 13 avec un dossier source pour la sauvegarde - Hostname = sambasrv.home.lab - IP = 192.168.10.245

Mise en place de la structure NVMe/TCP

Configuration d'un Lan dédié en /30 pour isoler la connexion NVMe/TCP entre les machines srv-truenas et srv-bareos

Sur le serveur TrueNAS

  • Configurer l'interface réseau dédiée au NVMe-oF

Configuration réseau truenas 1 Configuration réseau truenas 2

Sur le serveur RHEL

  • Installer le dépôt EPEL et mettre le système à jour
sudo -i
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
dnf install ./epel-release-latest-10.noarch.rpm -y
dnf update -y

Redémarrer la machine si nécessaire

  • Configuration du réseau pour la connexion NVMe/TCP
nmcli device status

Identifier l'interface inutilisée

nmcli con add con-name nvme-of type ethernet ifname ens19 ipv4.method manual ipv4.addresses 10.10.10.2/30
nmcli con up nvme-of
  • Installer les outils nvme
dnf install nvme-cli -y
  • Récupérer le nqn de l'hôte et le copier
cat /etc/nvme/hostnqn

Création du subsystem et connexion depuis l'hôte

Sur le serveur TrueNAS

  • Mettre en place le subsystem NVMe-oF avec une sécurisation par clés

Configuration nvme-of truenas 1

Configuration nvme-of truenas 2

Configuration nvme-of truenas 3

Configuration nvme-of truenas 4

Configuration nvme-of truenas 5

Configuration nvme-of truenas 6

Configuration nvme-of truenas 7

Configuration nvme-of truenas 8

Reporter le nqn de l'initiateur et copier les clés qui seront utilisées plus tard dans la configuration de l'hôte

Configuration nvme-of truenas 8bis

Configuration nvme-of truenas 9

Sélectionner l'adresse ip de l'interface dédiée et le numéro de port voulu (4420 par défaut)

Configuration nvme-of truenas 10

Sur le serveur RHEL

Optimisations des performances pour NVMe/TCP
  • Paramètres TCP
sudo -i
vim /etc/sysctl.d/99-nvme-tcp.conf
# Buffer tcp
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# Congestion
net.ipv4.tcp_congestion_control = bbr

# Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 10

# Timeouts
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
sysctl -p /etc/sysctl.d/99-nvme-tcp.conf
  • Modifier la valeur de la MTU
nmcli con mod nvme-of 802-3-ethernet.mtu 9000
nmcli con down nvme-of && nmcli con up nvme-of
  • Il est possible de modifier les valeurs des ring buffers
ethtool -g ens19

Comparer les valeurs maximales et les valeurs courantes puis ajuster avec:

nmcli con mod nvme-of ethtool.ring-rx valeur-maxi
nmcli con mod nvme-of ethtool.ring-tx valeur-maxi
Connecter le subsystem
  • Charger le module nvme-tcp
sudo -i
modprobe nvme-tcp
echo "nvme-tcp" > /etc/modules-load.d/nvmetcp.conf
  • Se connecter au subsystem et récupérer la sortie au format json
nvme connect   --transport=tcp   --traddr=10.10.10.1   --trsvcid=4420   --host-traddr=10.10.10.2   --host-iface=ens19   --hostnqn=nqn.2014-08.org.nvmexpress:uuid:e3b8dde9-d00b-484b-a408-51e82b051053 --nqn=nqn.2011-06.com.truenas:uuid:6468843b-c3ae-466a-8653-5e59b145f8bc:Bareos-Backups --dhchap-secret="DHHC-1:01:e4R562SBhiivYPizPNLtSUovnzTa79vJMLEXwiqMMFmjBq20:" --dhchap-ctrl-secret="DHHC-1:01:qv9hS4Qag8noQFq3Vupov8o8pQC0kTU+36NSpPueGzQUThJ3:" --dump-config

--traddr=10.10.10.1 → ip de l'hôte --trsvcid=4420 → port d'écoute TrueNAS --host-iface=ens19 → l'interface à utiliser pour la connexion --hostnqn → nqn de l'hôte --nqn → nqn du serveur --dhchap-secret → la clé de l'hôte générée plus tôt sur le serveur TrueNAS --dhchap-ctrl-secret → la clé du serveur TrueNAS --dump-config → renvoi un fichier de configuration au format json

Doit renvoyer

connecting to device: nvme0
[
  {
    "hostnqn":"nqn.2014-08.org.nvmexpress:uuid:e3b8dde9-d00b-484b-a408-51e82b051053",
    "hostid":"e3b8dde9-d00b-484b-a408-51e82b051053",
    "dhchap_key":"DHHC-1:01:e4R562SBhiivYPizPNLtSUovnzTa79vJMLEXwiqMMFmjBq20:",
    "subsystems":[
      {
        "nqn":"nqn.2011-06.com.truenas:uuid:6468843b-c3ae-466a-8653-5e59b145f8bc:Bareos-Backups",
        "ports":[
          {
            "transport":"tcp",
            "traddr":"10.10.10.1",
            "host_traddr":"10.10.10.2",
            "host_iface":"ens19",
            "trsvcid":"4420",
            "dhchap_key":"DHHC-1:01:e4R562SBhiivYPizPNLtSUovnzTa79vJMLEXwiqMMFmjBq20:",
            "dhchap_ctrl_key":"DHHC-1:01:qv9hS4Qag8noQFq3Vupov8o8pQC0kTU+36NSpPueGzQUThJ3:"
          }
        ]
      }
    ]
  }
]
  • Créer le fichier de configuration qui sera utilisé par le service systemd
mkdir /etc/nvme/conf.d && vim /etc/nvme/conf.d/conf-truenas.json

Y copier le contenu de la sortie précédente sans la ligne connecting to device: nvme0 Ce fichier contient les clés dhchap, lui affecter des permissions restrictives

chmod 600 /etc/nvme/conf.d/conf-truenas.json
  • Créer un service systemd pour la connexion au subsystem au démarrage de la machine
vim /etc/systemd/system/nvme-truenas.service
[Unit]
Description=Connexion NVMe-oF
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/nvme connect --config=/etc/nvme/conf.d/conf-truenas.json 

[Install]
WantedBy=multi-user.target
systemctl enable nvme-truenas.service
Utilisation du disque
  • Créer une partition sur le disque

Créer une partition utilisant la totalité de l'espace disque, cela peut se faire avec fdisk

lsblk # identifier le disque ajouté
fdisk /dev/nvme0n1

g (table gpt) → n (nouvelle partition) → enter x3 → w (enregistrer)

Puis la formater avec le système de fichier voulu

mkfs.xfs /dev/nvme0n1p1
  • Créer un point de montage avec fstab
mkdir /mnt/backups
blkid | grep nvme0n1p1 | awk '{print $2}'

Copier l'UUID du disque afin de le reporter dans le fichier suivant

vim /etc/fstab

Ajouter cette ligne en adaptant l'UUID

UUID=a2a4bbe3-cca3-455a-bfdf-894af4443771 /mnt/backups xfs defaults,_netdev,x-systemd.requires=nvme-truenas.service 0 0

Redémarrer puis vérifier les logs avec journalctl -b, la présence du disque avec lsblk et le montage avec df

On peut constater que le pool zfs de TrueNAS réserve un petit pourcentage de l'espace disque

Installation de Bareos

  • Installer Postgresql
sudo -i
dnf install postgresql-server -y
postgresql-setup --initdb
systemctl enable --now postgresql
  • Ajouter le dépôt Bareos
wget https://download.bareos.org/current/EL_10/add_bareos_repositories.sh
chmod +x add_bareos_repositories.sh
./add_bareos_repositories.sh
dnf update -y
  • Installer les paquets Bareos
dnf install bareos -y
  • Initialiser la base de données et activer des services
su postgres -c /usr/lib/bareos/scripts/create_bareos_database
su postgres -c /usr/lib/bareos/scripts/make_bareos_tables
su postgres -c /usr/lib/bareos/scripts/grant_bareos_privileges
systemctl enable --now bareos-dir.service bareos-sd.service bareos-fd.service
systemctl status bareos-dir.service bareos-sd.service bareos-fd.service
  • Définir l'utilisateur bareos comme propriétaire du dossier /mnt/backups
chown -R bareos:bareos /mnt/backups
  • Installer bareos-webui
dnf install bareos-webui -y
  • Configuration SELinux
setsebool -P httpd_can_network_connect on
semanage fcontext -a -t httpd_sys_content_t "/usr/share/bareos-webui(/.*)?"
restorecon -Rv /usr/share/bareos-webui/
  • Définir l'utilisateur de la WebUI
bconsole
reload
configure add console name=admin password=admin profile=webui-admin tlsenable=true
quit

Le mot de passe de l'utilisateur admin sera modifié par la suite

  • Persmissions sur les dossiers web
chown -R apache:apache /etc/bareos-webui/
chmod 755 /usr/share/bareos-webui/
  • Activer et redémarrer Apache
systemctl enable httpd
  • Configuration du firewall
firewall-cmd --add-port=8443/tcp --add-port=9101/tcp --add-port=9102/tcp --add-port=9103/tcp --permanent
firewall-cmd --reload

Préparation des connexions sécurisées entre les services et les clients

Sur le serveur RHEL

Génération des certificats

  • Création d'un dossier dédié
sudo -i
mkdir /etc/bareos/tls && cd /etc/bareos/tls
  • L'autoritée de certification
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Normandie
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:homelab
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Bareos-CA
Email Address []:
  • Les certificats et signatures

Pour le serveur

openssl genrsa -out srv-bareos.home.lab.key 2048
openssl req -new -key srv-bareos.home.lab.key -out srv-bareos.home.lab.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Normandie
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:homelab
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:srv-bareos.home.lab
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl x509 -req -in srv-bareos.home.lab.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out srv-bareos.home.lab.crt -days 3650 -sha256
Certificate request self-signature ok
subject=C=FR, ST=Normandie, L=Default City, O=homelab, CN=srv-bareos.home.lab

Pour le client

openssl genrsa -out sambasrv.home.lab.key 2048
openssl req -new -key sambasrv.home.lab.key -out sambasrv.home.lab.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Normandie
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:homelab
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:sambasrv.home.lab
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl x509 -req -in sambasrv.home.lab.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out sambasrv.home.lab.crt -days 3650 -sha256
Certificate request self-signature ok
subject=C=FR, ST=Normandie, L=Default City, O=homelab, CN=sambasrv.home.lab

Pour la WebUI

openssl genrsa -out client.key 4096
openssl req -new -key client.key -out client.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Normandie
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:homelab
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:bareos-webui-client
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256
cat client.crt client.key > client.pem
  • Appliquer les restrictions d'accès sur les dossiers et les fichiers
chown -R bareos:bareos /etc/bareos/tls/
chmod 750 /etc/bareos/tls/
chmod 600 /etc/bareos/tls/*.key
mkdir /etc/bareos-webui/tls
mv /etc/bareos/tls/client.* /etc/bareos-webui/tls/
chown -R apache:apache /etc/bareos-webui/tls/
chmod 600 /etc/bareos-webui/tls/client.key
chmod 640 /etc/bareos-webui/tls/client.pem
  • Configuration de la WebUI
vim /etc/bareos-webui/directors.ini
[bareos-dir]
enabled = "yes"
diraddress = "srv-bareos.home.lab"
dirport = 9101
; Set catalog to explicit value if you have multiple catalogs
;catalog = "MyCatalog"
tls_verify_peer = false
server_can_do_tls = true
server_requires_tls = true
client_can_do_tls = true
client_requires_tls = true
cert_file = "/etc/bareos-webui/tls/client.pem"
ca_file = /etc/bareos-webui/tls/ca.crt
allowed_cns = "srv-bareos.home.lab"

Création des mots de passe

  • Création d'un dossier dédié
mkdir /etc/bareos/secrets && cd /etc/bareos/secrets
  • Création les fichiers contenant les mots de passe

Il est possible de générer des mots de passe aléatoires avec pwgen installable avec dnf install pwgen

pwgen -sy 32
echo '"=c?H888C|WSTVJFShjFr.Rs2[.;-t[0b"' > dir-cons-pass.conf
echo '"p6@{zj?mu;8X;d.oh5\9MMWryOX\3PQ?"' > dir-fd-pass.conf
echo '"KAppsZ?D?\7I8p-v@96@QzE/8]-+v6GB"' > dir-sd-pass.conf
echo '"LfE0EcXU/QoV6OA2QQO4GZpEe+3Ct+YY"' > webui-pass.conf
echo '"3s>Aahb\Ko#__2ddsd7aN&jVsk8D]C_{"' > database-pass.conf
  • Sécurisation du dossier et des fichiers
chown -R bareos:bareos /etc/bareos/secrets/
chmod 750 /etc/bareos/secrets/
chmod 600 /etc/bareos/secrets/*
  • Changer le mot de passe pour l'utilisateur bareos de la base de données Postgresql
sudo -u postgres psql
postgres=# ALTER USER bareos WITH PASSWORD '3s>Aahb\Ko#__2ddsd7aN&jVsk8D]C_{';
postgres=# \q

Sur le client Debian

  • Installation du client Bareos
wget https://download.bareos.org/current/Debian_13/add_bareos_repositories.sh
chmod +x add_bareos_repositories.sh
./add_bareos_repositories.sh
apt update
apt install bareos-client -y
  • Copie des fichiers nécessaires à l'authentification
mkdir /etc/bareos/tls/ && mkdir /etc/bareos/secrets/

Copier les fichiers depuis le serveur vers le client de façon que:

Le dossier /etc/bareos/tls/ contienne ceci

-rw-r----- 1 bareos bareos 2009 Feb  2 21:23 ca.crt
-rw-r----- 1 bareos bareos 1647 Feb  2 21:22 sambasrv.home.lab.crt
-rw------- 1 bareos bareos 1708 Feb  2 21:22 sambasrv.home.lab.key

Le dossier /etc/bareos/secrets/ contienne ceci

-rw------- 1 bareos bareos   33 Feb  2 21:28 dir-fd-pass.conf
  • Configuration du client Bareos
vim /etc/bareos/bareos-fd.d/client/myself.conf
Client {
  Name = sambasrv-fd
  Description = "Serveur Samba - Shares"
  Maximum Concurrent Jobs = 3
  Heartbeat Interval = 60

  # Chiffrement TLS
  TLS Certificate = /etc/bareos/tls/sambasrv.home.lab.crt
  TLS Key = /etc/bareos/tls/sambasrv.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt 
  # Plugins si nécessaire
  Plugin Directory = /usr/lib/bareos/plugins
}
vim /etc/bareos/bareos-fd.d/director/bareos-dir.conf
Director {
  Name = bareos-dir
  Password = @/etc/bareos/secrets/dir-fd-pass.conf

  # Chiffrement TLS
  TLS Enable = yes
  TLS Require = yes
}
systemctl restart bareos-fd

Mise en place d'une configuration sécurisée basique

Sur le serveur RHEL

A partir de ce point, il est préférable d'ouvrir le dossier /etc/bareos du serveur depuis un éditeur de texte (vscode ou alternative) via ssh afin de pouvoir gérer l'édition des fichiers de configuration avec une vue d'ensemble

  • Configuration des paramètres de communications chiffrées entre les services
  • Renseignement des fichiers de mots de passe pour les connexions entre services

/etc/bareos/bareos-dir.d/catalog/MyCatalog.conf

Catalog {
  Name = MyCatalog
  dbname = "bareos"
  dbuser = "bareos"
  dbpassword = @/etc/bareos/secrets/database-pass.conf
}

/etc/bareos/bconsole.conf

#
# Bareos User Agent (or Console) Configuration File
#

Director {
  Name = bareos-dir
  address = localhost
  Password = @/etc/bareos/secrets/dir-cons-pass.conf
  Description = "Bareos Console credentials for local Director"
}

/etc/bareos/bareos-dir.d/director/bareos-dir.conf

Director {                            # define myself
  Name = bareos-dir
  QueryFile = "/usr/lib/bareos/scripts/query.sql"
  Maximum Concurrent Jobs = 10
  Password = @/etc/bareos/secrets/dir-cons-pass.conf
  Messages = Daemon
  Auditing = yes
  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-dir.d/client/bareos-fd.conf

Client {
  Name = bareos-fd
  Description = "Client resource of the Director itself."
  Address = 192.168.10.222
  Password = @/etc/bareos/secrets/dir-fd-pass.conf
  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-dir.d/client/sambasrv-fd.conf

Client {
  Name = sambasrv-fd
  Description = "Client Debian"
  Address = sambasrv.home.lab  # IP ou nom DNS si machine distante
  Catalog = MyCatalog
  Maximum Concurrent Jobs = 5
  Password = @/etc/bareos/secrets/dir-fd-pass.conf
  TLS Enable = yes
  TLS Require = yes
}

/etc/bareos/bareos-dir.d/console/admin.conf

Console {
  Name = "admin"
  Password = @/etc/bareos/secrets/webui-pass.conf
  Profile = webui-admin

  TLS Enable = yes
  TLS Require = yes
}

/etc/bareos/bareos-dir.d/storage/truenas.conf

Storage {
  Name = truenas
  Address = 192.168.10.222
  SDPort = 9103
  Password = @/etc/bareos/secrets/dir-sd-pass.conf
  Device = truenas
  Media Type = truenas
  Maximum Concurrent Jobs = 5

  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-fd.d/client/myself.conf

Client {
  Name = bareos-fd

  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-fd.d/director/bareos-dir.conf

Director {
  Name = bareos-dir
  Password = @/etc/bareos/secrets/dir-fd-pass.conf
  Description = "Allow the configured Director to access this file daemon."
  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-sd.d/director/bareos-dir.conf

Director {
  Name = bareos-dir
  Password = @/etc/bareos/secrets/dir-sd-pass.conf
  Description = "Director, who is permitted to contact this storage daemon."

  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

/etc/bareos/bareos-sd.d/storage/bareos-sd.conf

Storage {
  Name = bareos-sd
  TLS Enable = yes
  TLS Require = yes

  TLS Certificate = /etc/bareos/tls/srv-bareos.home.lab.crt
  TLS Key = /etc/bareos/tls/srv-bareos.home.lab.key
  TLS CA Certificate File = /etc/bareos/tls/ca.crt
}

Mise en place des éléments pour créer un job de sauvegarde

  • Création d'un device, d'un pool et d'un fileset

/etc/bareos/bareos-sd.d/device/truenas.conf

Device {
  Name = truenas
  Media Type = truenas
  Archive Device = /mnt/backups
  LabelMedia = yes
  Random Access = yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 5
}

/etc/bareos/bareos-dir.d/pool/truenas-debian.conf

Pool {
  Name = truenas-debian
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 90 days
  Label Format = "truenas-debian-"
  Storage = truenas

  # Recyclage automatique
  Recycle Oldest Volume = yes
  Recycle Current Volume = yes
}

/etc/bareos/bareos-dir.d/fileset/projet.conf

FileSet {
  Name = "projet"
  Include {
    Options {
      Signature = SHA256
      Compression = LZ4
      OneFS = yes
      IgnoreCase = yes
    }
    File = /srv/projet
      }
  Include {
    Options {
      wildfile = "*.cache"
      Exclude = yes
      }
  }
}
  • Création d'un job pour effectuer une sauvegarde complète tous les dimanche à 22h00 et une sauvegarde incrémentale quotidiennement à 22h00 depuis le client Debian vers le point de montage correspondant au disque NVMe/TCP

/etc/bareos/bareos-dir.d/job/sambasrv-backup.conf

Job {
  Name = "sambasrv-backup"
  Type = Backup
  Level = Incremental
  Client = sambasrv-fd
  FileSet = "projet"
  Schedule = "daily-22h"
  Storage = truenas
  Messages = Standard
  Pool = truenas-debian
  Priority = 10
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
  Maximum Concurrent Jobs = 5
}

/etc/bareos/bareos-dir.d/schedule/daily-22h.conf

Schedule {
  Name = "daily-22h"
  Description = "Tous les jours à 22h00"
  Run = Full 1st sun at 22:00        # Full le 1er dimanche
  Run = Incremental mon-sat at 22:00 # Incrémental du lundi au samedi
}

Redémarrer les services bareos pour recharger la configuration et tester l'accès à la console

systemctl restart bareos-dir bareos-sd bareos-fd
bconsole
*reload
quit

Test du chiffrement des transferts entre les machines

  • Sur le serveur RHEL

    openssl s_client -connect localhost:9101 -servername srv-bareos.home.lab -CAfile /etc/bareos/tls/ca.crt -cert /etc/bareos/tls/srv-bareos.home.lab.crt -key /etc/bareos/tls/srv-bareos.home.lab.key
  • Sur le client Debian

    openssl s_client -connect 192.168.10.222:9101 -servername srv-bareos.home.lab -CAfile /etc/bareos/tls/ca.crt -cert /etc/bareos/tls/sambasrv.home.lab.crt -key /etc/bareos/tls/sambasrv.home.lab.key

Sécurisation des connexions à la WebUI

Sur le serveur RHEL

  • Mise en place d'un vhost pour les connexions SSL/TLS
vim /etc/httpd/conf.d/bareos-webui-ssl.conf
Listen 8443 https

<VirtualHost *:8443>
    ServerName srv-bareos.home.lab

    SSLEngine on
    SSLCertificateFile /etc/bareos/tls/srv-bareos.home.lab.crt
    SSLCertificateKeyFile /etc/bareos/tls/srv-bareos.home.lab.key
    SSLCACertificateFile /etc/bareos/tls/ca.crt

    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite PROFILE=SYSTEM
    SSLHonorCipherOrder on

    <IfModule env_module>
        SetEnv "APPLICATION_ENV" "production"
    </IfModule>

    Alias /bareos-webui  /usr/share/bareos-webui/public

    <Directory /usr/share/bareos-webui/public>
        Options FollowSymLinks
        AllowOverride None

        # Apache 2.2 (compatibilité)
        <IfModule !mod_authz_core.c>
                Order deny,allow
                Allow from all
        </IfModule>

        # Apache 2.4
        <IfModule mod_authz_core.c>
                <IfModule mod_access_compat.c>
                    Order deny,allow
                </IfModule>
                Require all granted
        </IfModule>

        <IfModule mod_rewrite.c>
                RewriteEngine on
                RewriteBase /bareos-webui
                RewriteCond %{REQUEST_FILENAME} -s [OR]
                RewriteCond %{REQUEST_FILENAME} -l [OR]
                RewriteCond %{REQUEST_FILENAME} -d
                RewriteRule ^.*$ - [NC,L]
                RewriteRule ^.*$ index.php [NC,L]
        </IfModule>

        <IfModule mod_php.c>
                php_flag magic_quotes_gpc off
                php_flag register_globals off
        </IfModule>
    </Directory>

    ErrorLog /var/log/httpd/bareos-webui-ssl-error.log
    CustomLog /var/log/httpd/bareos-webui-ssl-access.log combined

</VirtualHost>
  • Désactiver le vhost http
mv /etc/httpd/conf.d/bareos-webui.conf /etc/httpd/conf.d/bareos-webui.conf.disabled
  • Contexte SELinux
setsebool -P httpd_can_network_connect_db on
semanage fcontext -a -t httpd_sys_content_t "/etc/bareos/tls(/.*)?"
restorecon -Rv /etc/bareos/tls/
  • Permissions sur les clés pour l'utilisateur apache
setfacl -m u:apache:r /etc/bareos/tls/*.key
  • Tester la configuration
apachectl configtest

Syntax OK

  • Redémarrer le service httpd
systemctl restart httpd

Test de bon fonctionnement des services et de la sauvegarde

  • Depuis la console, il est possible d'effectuer un test sur un job
bconsole
*estimate
The defined Job resources are:
1: backup-bareos-fd
2: BackupCatalog
3: RestoreFiles
4: sambasrv-backup
Select Job resource (1-4): 4
Using Catalog "MyCatalog"
Connecting to Client sambasrv-fd at sambasrv.home.lab:9102
2000 OK estimate files=3,740 bytes=330,751,059
  • Se connecter à https://192.168.10.222:8443/bareos-webui/

connexion-https

Après acceptation du message d'avertissement (certificat auto-signé) on peut se connecter avec le login et mot de passe définis plus haut

Page-login

On est redirigé automatiquement vers le dashboard

dashboard

Forcer le lancement du job pour vérifier le lancement de la sauvegarde

Job action

  • Revenir à la console
bconsole
*messages
05-Feb 13:38 bareos-dir JobId 1: No prior Full backup Job record found.
05-Feb 13:38 bareos-dir JobId 1: No prior or suitable Full backup found in catalog. Doing FULL backup.
05-Feb 13:38 bareos-dir JobId 1: Version: 25.0.2~pre88.4618b0a10 (03 February 2026) Red Hat Enterprise Linux 10.1 (Coughlan)
05-Feb 13:38 bareos-dir JobId 1: Start Backup JobId 1, Job=sambasrv-backup.2026-02-05_13.38.30_17
05-Feb 13:38 bareos-dir JobId 1: Connected Storage daemon at 192.168.10.222:9103, encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:38 bareos-dir JobId 1:  Encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:38 bareos-dir JobId 1: Probing client protocol... (result will be saved until config reload)
05-Feb 13:38 bareos-dir JobId 1: Connected Client: sambasrv-fd at sambasrv.home.lab:9102, encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:38 bareos-dir JobId 1:    Handshake: Immediate TLS 
05-Feb 13:38 bareos-dir JobId 1:  Encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:38 bareos-sd JobId 1: Using just in time reservation for job 1
05-Feb 13:38 bareos-dir JobId 1: Using Device "JustInTime Device" to write.
05-Feb 13:39 sambasrv-fd JobId 1: Connected Storage daemon at 192.168.10.222:9103, encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:39 sambasrv-fd JobId 1:  Encryption: TLS_AES_256_GCM_SHA384 TLSv1.3
05-Feb 13:38 bareos-sd JobId 1: Version: 25.0.2~pre88.4618b0a10 (03 February 2026) Red Hat Enterprise Linux 10.1 (Coughlan)
05-Feb 13:39 sambasrv-fd JobId 1: Extended attribute support is enabled
05-Feb 13:39 sambasrv-fd JobId 1: ACL support is enabled
05-Feb 13:38 bareos-sd JobId 1: JustInTime Reservation: Finding drive to reserve.
05-Feb 13:39 sambasrv-fd JobId 1: Version: 25.0.2~pre70.eb042fd99 (22 January 2026) Debian GNU/Linux 13 (trixie)
05-Feb 13:38 bareos-dir JobId 1: Created new Volume "truenas-debian-0001" in catalog.
05-Feb 13:38 bareos-sd JobId 1: Using Device "truenas" (/mnt/backups) to write.
05-Feb 13:38 bareos-sd JobId 1: Moving to end of data on volume "truenas-debian-0001"
05-Feb 13:38 bareos-sd JobId 1: Warning: For Volume "truenas-debian-0001":
The sizes do not match! Volume=314283108 Catalog=0
Correcting Catalog
05-Feb 13:38 bareos-sd JobId 1: Releasing device "truenas" (/mnt/backups).
05-Feb 13:38 bareos-sd JobId 1: Elapsed time=00:00:02, Transfer rate=157.0 M Bytes/second
05-Feb 13:38 bareos-dir JobId 1: Insert of attributes batch table with 3740 entries start
05-Feb 13:38 bareos-dir JobId 1: Insert of attributes batch table done
05-Feb 13:38 bareos-dir JobId 1: Bareos bareos-dir 25.0.2~pre88.4618b0a10 (03Feb26):
  OS Information:         Red Hat Enterprise Linux 10.1 (Coughlan)
  JobId:                  1
  Job:                    sambasrv-backup.2026-02-05_13.38.30_17
  Backup Level:           Full (upgraded from Incremental)
  Client:                 "sambasrv-fd" 25.0.2~pre70.eb042fd99 (22Jan26) Debian GNU/Linux 13 (trixie),debian
  FileSet:                "projet" 2026-02-05 13:38:30
  Pool:                   "truenas-debian" (From Job resource)
  Catalog:                "MyCatalog" (From Client resource)
  Storage:                "truenas" (From Pool resource)
  Scheduled time:         05-Feb-2026 13:38:30
  Start time:             05-Feb-2026 13:38:32
  End time:               05-Feb-2026 13:38:34
  Elapsed time:           2 secs
  Priority:               10
  Allow Mixed Priority:   no
  FD Files Written:       3,740
  SD Files Written:       3,740
  FD Bytes Read:          330,751,059 (330.7 MB)
  FD Bytes Written:       313,494,538 (313.4 MB)
  SD Bytes Written:       314,140,223 (314.1 MB)
  Rate:                   156747.3 KB/s
  Software Compression:   5.2 % (lz4)
  VSS:                    no
  Encryption:             no
  Accurate:               no
  Volume name(s):         truenas-debian-0001
  Volume Session Id:      1
  Volume Session Time:    1770294648
  Last Volume Bytes:      628,565,971 (628.5 MB)
  Non-fatal FD errors:    0
  SD Errors:              0
  FD termination status:  OK
  SD termination status:  OK
  Bareos binary info:     Bareos community build (UNSUPPORTED): Get professional support from https://www.bareos.com
  Job triggered by:       User
  Termination:            Backup OK

No prior or suitable Full backup found in catalog. Doing FULL backup. → le director n'a pas trouvé de sauvegarde initiale et procède à une sauvegarde intégrale Encryption: TLS_AES_256_GCM_SHA384 TLSv1.3 → les échanges sont chiffrés

La sauvegarde s'est bien déroulée

Revenir sur le dashboard, à la fin de la sauvegarde l'état du job sera affiché

Dashboard2

Il est possible de parcourir le contenu de la sauvegarde et de restaurer des fichiers à partir de la WebUI

restore-content

Test de restauration

Afin de tester le bon déroulement d'une restauration:

  • Créer un dossier dédié sur le poste client, ici /srv/restor sur la machine Debian
  • Lancer une restauration depuis la sauvegarde vers ce dossier
  • Vérifier la présence et les attributs des éléments ainsi restaurés
Sur le serveur Bareos
  • Création d'un job pour le test de restauration

/etc/bareos/bareos-dir.d/job/test-sambasrv-restor.conf

Job {
  Name = "test-sambasrv-restor"
  Description = "Test de restauration de la sauvegarde sambasrv"
  Type = Restore
  Client = sambasrv-fd
  FileSet = "projet"
  Storage = truenas
  Pool = truenas-debian
  Messages = Standard
  Where = /srv/restor
  Maximum Concurrent Jobs = 10
}
bconsole
*reload job=all
quit
  • Depuis la WebUI de bareos

test-restor-1

Confirmer

test-restor-2

Afficher le rapport

test-restor-2bis

Les informations importantes concernant la restauration sont visibles

test-restor-3

La restauration a été effectuée avec succès

  • Sur le poste client

Comparer un fichier depuis l'emplacement original et depuis le dossier de restauration

cp /srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png /srv/restor/srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png

Ou comparer les checksums

md5sum /srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png

31bd96635c4120abe3e771a423f61cd6 /srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png

md5sum /srv/restor/srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png

31bd96635c4120abe3e771a423f61cd6 /srv/restor/srv/projet/blog/user/pages/01.home/fiches-rhcsa/06.fiche-rhcsa-lvm/lvm.png

  • Vue du dashboard

dashboard-3

La différence de taille entre la sauvegarde et la restauration vient de la compression de la sauvegarde

Conclusion

  • L'infrastructure est composée d'un système de sauvegarde fiable, efficace et configurable à souhaits via un système déclaratif (as code)
  • Les performances offertes par NVMe/TCP, selon le matériel utilisé pour les connexions réseaux, permettent de réduire les temps de transferts et de restaurer rapidement au besoin
  • Le chiffrement des connexions est assuré sur l'intégralité des communications entre les services et les machines
  • Les possibilités offertes par Bareos sont extrêmement larges et nous n'avons vu qu'une infime partie de ce que cet outil peut offrir dans ce lab