Catégorie : Systèmes

1 février 2026 /

Installation et Chiffrement du Centreon Monitoring Agent (CMA) sur Red Hat Enterprise Linux 9

Dans ce tutoriel complet, nous allons explorer l’installation et la configuration du Centreon Monitoring Agent (CMA) sur Red Hat Enterprise Linux 9 (ainsi que ses clones comme AlmaLinux ou Rocky Linux). Nous couvrirons non seulement l’installation de base, mais également la mise en place d’un chiffrement TLS avec Let’s Encrypt, la gestion de SELinux, le renouvellement automatique des certificats, et la création de sondes personnalisées.

CMA représente l’évolution moderne de la supervision Centreon. Contrairement à NRPE, il fonctionne en mode passif : l’agent envoie activement les données de supervision au collecteur (poller), offrant ainsi une meilleure sécurité et des performances accrues. Le protocole utilisé est OTLP (OpenTelemetry Protocol) sur gRPC, garantissant une communication efficace et sécurisée.

Note importante : Ce tutoriel est basé sur Centreon 24.10. L’utilisation de CMA nécessite une licence IT-100 active dans votre plateforme Centreon. Toutes les commandes sont adaptées pour RHEL 9 et utilisent le gestionnaire de paquets dnf.

Ce tutoriel est principalement validé sur Centreon 24.10 LTS. Pour 25.10+, consultez la doc officielle pour les évolutions (encryption « full », etc.).

Différences entre versions :

  • Centreon 24.10 : Utilise "encryption": true ou false
  • Centreon 25.10+ : Utilise "encryption": "full", "insecure" ou false
  • Token d’authentification : Fortement recommandé en 24.10, obligatoire en 25.10+ avec chiffrement
  • Le champ ca_name a été renommé en ca_common_name depuis la version 24.10

Prérequis

  • Un serveur Centreon 24.10+ installé sur RHEL 9 (serveur central et poller)
  • Un ou plusieurs hôtes à superviser sous RHEL 9
  • Accès root (ou sudo) sur toutes les machines
  • Licence IT-100 intégrée dans Centreon (via Administration > Licences)
  • Un nom de domaine valide pointant vers votre poller (pour Let’s Encrypt)
  • Port 80/TCP et 443/TCP ouverts temporairement pour la validation Let’s Encrypt
  • Port 4317/TCP ouvert sur le poller pour la communication OTLP
  • Connexion Internet sur le poller et les agents

Étape 1 : Configuration Initiale du Serveur Centreon (Interface Web)

Ces opérations se réalisent depuis l’interface web de Centreon.

1.1 Installation du Connecteur de Supervision

  1. Connectez-vous à l’interface web de Centreon
  2. Naviguez vers Configuration > Packs de plugins > Gestionnaire
  3. Dans la barre de recherche, tapez Linux Centreon Monitoring Agent
  4. Cliquez sur le pack OS-Linux-Centreon-Monitoring-Agent
  5. Cliquez sur Installer puis confirmez

1.2 Configuration de la Communication Collecteur/Agent

  1. Allez dans Configuration > Collecteurs > Configurations d’agent
  2. Cliquez sur + Ajouter
  3. Nommez la configuration (par exemple : CMA-Default)
  4. Pour l’instant, laissez le chiffrement désactivé (nous l’activerons plus tard)
  5. Cliquez sur Sauvegarder

1.3 Ajout des Modèles de Services

  1. Rendez-vous dans Configuration > Commandes > Connecteurs
  2. Sélectionnez Centreon Monitoring Agent dans le menu déroulant
  3. Dans le filtre, recherchez OS-Linux-Centreon-Monitoring-Agent
  4. Sélectionnez tous les modèles proposés (CPU, Memory, Disk, etc.)
  5. Cliquez sur Sauvegarder

1.4 Création de l’Hôte Supervisé

  1. Allez dans Configuration > Hôtes > Hôtes
  2. Cliquez sur Ajouter
  3. Remplissez les informations :
    • Nom : Le nom de votre serveur (ex: srv-web-01)
    • Alias : Description de l’hôte
    • Adresse IP/DNS : L’IP ou le FQDN de l’hôte
    • Modèles : Sélectionnez OS-Linux-Centreon-Monitoring-Agent-custom
    • Collecteur : Choisissez votre poller
  4. Cliquez sur Sauvegarder

1.5 Export de la Configuration

  1. Allez dans Configuration > Collecteurs > Collecteurs
  2. Sélectionnez votre poller
  3. Cochez toutes les options d’export
  4. Cliquez sur Exporter
  5. Attendez la fin de l’export

Étape 2 : Installation de l’Agent sur l’Hôte Supervisé

Connectez-vous en SSH sur l’hôte à superviser avec les privilèges root.

2.1 Mise à Jour du Système

dnf update -y

2.2 Installation des Prérequis

dnf install -y dnf-plugins-core ca-certificates curl gpg wget

2.3 Ajout des Repositories Centreon

dnf config-manager --add-repo https://packages.centreon.com/rpm-standard/24.10/el9/centreon-24.10.repo
dnf config-manager --add-repo https://packages.centreon.com/rpm-plugins/24.10/el9/centreon-plugins-24.10.repo

2.4 Import de la Clé GPG Centreon

rpm --import https://packages.centreon.com/centreon.gpg

Note : La clé GPG peut également être référencée automatiquement via le fichier .repo (ligne gpgkey=). La commande ci-dessus force l’import manuel.

2.5 Installation de l’Agent CMA

dnf clean all
dnf update
dnf install -y centreon-monitoring-agent centreon-plugin-operatingsystems-linux-local

2.6 Activation et Démarrage du Service

systemctl enable centagent
systemctl start centagent
systemctl status centagent

Étape 3 : Configuration de Base de l’Agent

3.1 Configuration du Fichier centagent.json

Éditez le fichier de configuration de l’agent :

vi /etc/centreon-monitoring-agent/centagent.json

Remplacez le contenu par :

{
  "log_file": "/var/log/centreon-monitoring-agent/centagent.log",
  "log_level": "info",
  "log_type": "file",
  "log_max_file_size": 10,
  "log_max_files": 3,
  "endpoint": "<IP_DU_POLLER>:4317",
  "encryption": false,
  "token": "",
  "public_cert": "",
  "private_key": "",
  "ca": "",
  "ca_common_name": "",
  "host": "<NOM_HOTE_DANS_CENTREON>",
  "reversed_grpc_streaming": false
}

Attention : Remplacez :

  • <IP_DU_POLLER> par l’adresse IP ou le FQDN de votre poller
  • <NOM_HOTE_DANS_CENTREON> par le nom exact de l’hôte créé dans Centreon (respectez la casse)

Note : Le champ token est laissé vide pour cette configuration initiale sans chiffrement. Il sera renseigné plus tard lors de l’activation du TLS.

3.2 Redémarrage de l’Agent

systemctl restart centagent

3.3 Vérification des Logs

tail -f /var/log/centreon-monitoring-agent/centagent.log

Vous devriez voir des messages indiquant que l’agent tente de se connecter au poller.

Étape 4 : Configuration du Pare-feu

4.1 Sur le Poller

Ouvrez le port OTLP (4317/TCP) :

firewall-cmd --permanent --add-port=4317/tcp
firewall-cmd --reload
firewall-cmd --list-ports

4.2 Sur l’Agent (Sortant)

Normalement, aucune configuration n’est nécessaire pour les connexions sortantes. Si vous avez un pare-feu restrictif :

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="<IP_DU_POLLER>" port port="4317" protocol="tcp" accept'
firewall-cmd --reload

Étape 5 : Installation et Configuration de Let’s Encrypt

Nous allons maintenant sécuriser la communication entre l’agent et le poller avec un certificat Let’s Encrypt.

5.1 Installation de Certbot sur le Poller

dnf install -y certbot

5.2 Génération du Certificat Let’s Encrypt

Méthode 1 : Standalone (si aucun serveur web n’écoute sur le port 80)

certbot certonly --standalone -d <FQDN_DU_POLLER> --email <VOTRE_EMAIL> --agree-tos --non-interactive

Méthode 2 : Webroot (si Apache ou Nginx est déjà installé)

certbot certonly --webroot -w /var/www/html -d <FQDN_DU_POLLER> --email <VOTRE_EMAIL> --agree-tos --non-interactive

Remplacez <FQDN_DU_POLLER> par le nom de domaine complet de votre poller (ex: poller.example.com).

5.3 Création de la Structure de Répertoires

mkdir -p /etc/pki/centreon
chown root:root /etc/pki/centreon
chmod 755 /etc/pki/centreon

5.4 Copie des Certificats

cp /etc/letsencrypt/live/<FQDN_DU_POLLER>/privkey.pem /etc/pki/centreon/private_key.key
cp /etc/letsencrypt/live/<FQDN_DU_POLLER>/fullchain.pem /etc/pki/centreon/public_cert.crt

5.5 Attribution des Droits

chown centreon-engine:centreon-engine /etc/pki/centreon/public_cert.crt
chown centreon-engine:centreon-engine /etc/pki/centreon/private_key.key
chmod 644 /etc/pki/centreon/public_cert.crt
chmod 600 /etc/pki/centreon/private_key.key

Note : Dans les versions récentes (24.10+ et 25.10), c’est le module OpenTelemetry intégré à Centreon Engine qui lit ces certificats. Le propriétaire attendu est centreon-engine:centreon-engine. Vous pouvez vérifier quel processus écoute sur le port 4317 avec : ss -tulnp | grep 4317

5.6 Configuration du Chiffrement dans Centreon

  1. Retournez dans Configuration > Collecteurs > Configurations d’agent
  2. Éditez votre configuration CMA
  3. Activez Chiffrement
  4. Renseignez les chemins :
    • Certificat public : /etc/pki/centreon/public_cert.crt
    • Clé privée : /etc/pki/centreon/private_key.key
  5. Sauvegardez
  6. Exportez à nouveau la configuration du collecteur

5.7 Redémarrage du Service Engine

systemctl restart centengine

Étape 6 : Configuration du Chiffrement sur l’Agent

6.1 Installation des Certificats Racine

Sur l’hôte supervisé :

dnf install -y ca-certificates
update-ca-trust

6.2 Modification de la Configuration de l’Agent

Éditez le fichier /etc/centreon-monitoring-agent/centagent.json :

vi /etc/centreon-monitoring-agent/centagent.json

Modifiez les paramètres suivants :

{
  "log_file": "/var/log/centreon-monitoring-agent/centagent.log",
  "log_level": "info",
  "log_type": "file",
  "log_max_file_size": 10,
  "log_max_files": 3,
  "endpoint": "<FQDN_DU_POLLER>:4317",
  "encryption": true,
  "public_cert": "",
  "private_key": "",
  "ca": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem",
  "ca_common_name": "<FQDN_DU_POLLER>",
  "host": "<NOM_HOTE_DANS_CENTREON>",
  "reversed_grpc_streaming": false
}

Points importants :

  • encryption doit être à true (pour Centreon 24.10)
  • Pour Centreon 25.10+ : utiliser "encryption": "full" au lieu de true
  • endpoint doit utiliser le FQDN (pas l’IP) pour la validation du certificat
  • ca_common_name doit correspondre au CN du certificat (généralement le FQDN du poller)
  • Avec Let’s Encrypt, le champ ca_common_name est souvent optionnel car le certificat est déjà dans le trust store du système. Vous pouvez le laisser vide ("") ou l’omettre complètement.

Version 25.10+ : Le paramètre encryption accepte désormais les valeurs : "full" (TLS complet avec vérification), "insecure" (TLS sans vérification – déconseillé), ou false (pas de chiffrement). Préférez toujours "full".

6.3 Configuration du Token d’Authentification

Important : À partir de Centreon 24.10, et obligatoire en 25.10, l’utilisation d’un token d’authentification est fortement recommandée pour sécuriser la communication.

6.3.1 Génération du Token dans Centreon

  1. Dans Centreon, Allez dans Administration > Authentication tokens, créez un token de type Centreon Monitoring Agent (choisissez une expiration ou aucune), copiez-le.
  2. Dans Configuration > Collecteurs > Configurations d’agent, éditez votre config CMA, activez le chiffrement, collez le token dans le champ Authentication token si l’UI le demande, sauvegardez et exportez.
  3. Copiez ce token (il ressemble à : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  4. Sauvegardez

6.3.2 Ajout du Token dans centagent.json

Ajoutez le champ token dans votre fichier de configuration :

{
  "log_file": "/var/log/centreon-monitoring-agent/centagent.log",
  "log_level": "info",
  "log_type": "file",
  "log_max_file_size": 10,
  "log_max_files": 3,
  "endpoint": "<FQDN_DU_POLLER>:4317",
  "encryption": true,
  "token": "<VOTRE_TOKEN_GENERE>",
  "public_cert": "",
  "private_key": "",
  "ca": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem",
  "ca_common_name": "",
  "host": "<NOM_HOTE_DANS_CENTREON>",
  "reversed_grpc_streaming": false
}

Note : Le token est obligatoire dès que le chiffrement est activé sur le poller. Sans token valide, l’agent ne pourra pas s’authentifier.

6.4 Redémarrage de l’Agent

systemctl restart centagent
systemctl status centagent

6.5 Vérification de la Connexion Chiffrée

tail -f /var/log/centreon-monitoring-agent/centagent.log

Vous devriez voir des messages confirmant la connexion TLS réussie.

Étape 7 : Renouvellement Automatique des Certificats Let’s Encrypt

Let’s Encrypt génère des certificats valables 90 jours. Il est crucial de mettre en place un renouvellement automatique.

7.1 Test du Renouvellement

certbot renew --dry-run

Cette commande simule le renouvellement. Si tout fonctionne, vous verrez un message de succès.

7.2 Création d’un Script de Post-Renouvellement

Créez le script suivant pour copier automatiquement les certificats après renouvellement :

vi /etc/letsencrypt/renewal-hooks/post/centreon-cert-update.sh

Ajoutez le contenu suivant :

#!/bin/bash

DOMAIN="<FQDN_DU_POLLER>"
CERT_DIR="/etc/pki/centreon"

# Copie des nouveaux certificats
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $CERT_DIR/private_key.key
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $CERT_DIR/public_cert.crt

# Attribution des droits
chown centreon-engine:centreon-engine $CERT_DIR/public_cert.crt
chown centreon-engine:centreon-engine $CERT_DIR/private_key.key
chmod 644 $CERT_DIR/public_cert.crt
chmod 600 $CERT_DIR/private_key.key

# Redémarrage de Centreon Engine
# Note: Sur certaines versions récentes, un reload suffit
# systemctl reload centengine
systemctl restart centengine

# Optionnel: Redémarrage du broker si nécessaire
# systemctl restart cbd

# Log
echo "$(date): Certificats Centreon mis à jour et service redémarré" >> /var/log/centreon-cert-renewal.log

Restart vs Reload : Sur les versions 25.10+, un simple reload peut suffire pour recharger les certificats sans interruption de service. Testez d’abord avec reload, et si cela ne fonctionne pas, utilisez restart. Le restart provoque une courte interruption de la collecte.

Rendez le script exécutable :

chmod +x /etc/letsencrypt/renewal-hooks/post/centreon-cert-update.sh

7.3 Configuration du Timer Systemd (Vérification)

Certbot installe automatiquement un timer systemd. Vérifiez qu’il est actif :

systemctl list-timers | grep certbot

Si le timer n’est pas présent, créez-le manuellement :

systemctl enable certbot-renew.timer
systemctl start certbot-renew.timer

7.4 Test Complet du Renouvellement

certbot renew --force-renewal

Attention : Cette commande force le renouvellement même si le certificat n’a pas expiré. À utiliser uniquement pour tester.

Vérifiez ensuite que les certificats ont bien été copiés et que le service a redémarré :

ls -l /etc/pki/centreon/
systemctl status centengine
cat /var/log/centreon-cert-renewal.log

Étape 8 : Gestion de SELinux

SELinux (Security-Enhanced Linux) est un module de sécurité du noyau Linux. Bien qu’il soit souvent désactivé en production, il est important de savoir le configurer correctement.

8.1 Vérification de l’État de SELinux

getenforce

Résultats possibles :

  • Enforcing : SELinux est actif et applique les règles
  • Permissive : SELinux est actif mais ne fait que journaliser les violations
  • Disabled : SELinux est désactivé

8.2 Configuration pour CMA avec SELinux Actif

Si SELinux est en mode Enforcing ou Permissive, vous devrez autoriser certaines opérations.

8.2.1 Sur le Poller

Autorisez Centreon Engine à lire les certificats :

semanage fcontext -a -t cert_t "/etc/pki/centreon(/.*)?"
restorecon -Rv /etc/pki/centreon

Si semanage n’est pas installé :

dnf install -y policycoreutils-python-utils

Autorisez Centreon Engine à écouter sur le port 4317 :

semanage port -a -t centreon_engine_port_t -p tcp 4317

8.2.2 Sur l’Agent

Autorisez l’agent à se connecter au port 4317 distant :

setsebool -P nis_enabled 1

Ou de manière plus spécifique :

semanage port -a -t http_port_t -p tcp 4317

8.2.3 Vérification des Violations SELinux

Si vous rencontrez des problèmes, consultez les logs SELinux :

ausearch -m avc -ts recent
grep "denied" /var/log/audit/audit.log | tail -20

Pour générer automatiquement une règle à partir des violations :

ausearch -m avc -ts recent | audit2allow -M centreon_cma
semodule -i centreon_cma.pp

8.3 Désactivation de SELinux (Non Recommandé)

Si vous souhaitez désactiver SELinux (déconseillé en production) :

vi /etc/selinux/config

Modifiez la ligne :

SELINUX=disabled

Puis redémarrez le serveur :

reboot

Alternative temporaire (sans redémarrage) :

setenforce 0

Cette commande passe SELinux en mode Permissive jusqu’au prochain redémarrage.

Étape 9 : Création d’une Sonde Personnalisée

Les sondes personnalisées vous permettent d’étendre les capacités de supervision de CMA selon vos besoins spécifiques.

9.1 Création de la Structure de Répertoires

Sur l’hôte supervisé, créez le répertoire pour les sondes :

mkdir -p /opt/centreon/sondes
chown root:root /opt/centreon/sondes
chmod 755 /opt/centreon/sondes

9.2 Exemple de Sonde : Vérification de l’Espace Disque

Créez le script de sonde :

vi /opt/centreon/sondes/check_disk_custom.sh

Ajoutez le contenu suivant :

#!/bin/bash
# Sonde personnalisée pour vérifier l'espace disque disponible
# Format de sortie Centreon : STATUS NomService - MESSAGE | PERFDATA

# Variables d'entrée
PARTITION="${1:-/}"           # Si $1 n’est pas défini c'est /
SEUIL_WARNING="${2:-20}"      # Si $2 n’est pas défini c'est 20 en Go
SEUIL_CRITIQUE="${3:-10}"     # Si $3 n’est pas défini c'est 10 en Go

# Récupération de l'espace disponible en Go
ESPACE_DISPONIBLE=$(df -BG "$PARTITION" | tail -1 | awk '{print $4}' | sed 's/G//')

# Récupération de l'utilisation en pourcentage
UTILISATION_PCT=$(df "$PARTITION" | tail -1 | awk '{print $5}' | sed 's/%//')

# Logique de vérification
if [ "$ESPACE_DISPONIBLE" -lt "$SEUIL_CRITIQUE" ]; then
    echo "2 Disque_Custom - CRITICAL - Espace disponible: ${ESPACE_DISPONIBLE}Go (${UTILISATION_PCT}% utilisé) sur $PARTITION | libre=${ESPACE_DISPONIBLE}G;${SEUIL_WARNING};${SEUIL_CRITIQUE};0 utilisation=${UTILISATION_PCT}%;80;90;0;100"
    exit 2
elif [ "$ESPACE_DISPONIBLE" -lt "$SEUIL_WARNING" ]; then
    echo "1 Disque_Custom - WARNING - Espace disponible: ${ESPACE_DISPONIBLE}Go (${UTILISATION_PCT}% utilisé) sur $PARTITION | libre=${ESPACE_DISPONIBLE}G;${SEUIL_WARNING};${SEUIL_CRITIQUE};0 utilisation=${UTILISATION_PCT}%;80;90;0;100"
    exit 1
else
    echo "0 Disque_Custom - OK - Espace disponible: ${ESPACE_DISPONIBLE}Go (${UTILISATION_PCT}% utilisé) sur $PARTITION | libre=${ESPACE_DISPONIBLE}G;${SEUIL_WARNING};${SEUIL_CRITIQUE};0 utilisation=${UTILISATION_PCT}%;80;90;0;100"
    exit 0
fi

Rendez le script exécutable :

chmod +x /opt/centreon/sondes/check_disk_custom.sh

9.3 Test Manuel de la Sonde

/opt/centreon/sondes/check_disk_custom.sh / 20 10

Vous devriez voir une sortie du type :

0 Disk_Custom - OK - Espace disponible: 45Go (35% utilisé) sur / | libre=45G;20;10;0 usage=35%;80;90;0;100

9.4 Autre Exemple : Vérification d’un Processus

vi /opt/centreon/sondes/check_process_httpd.sh
#!/bin/bash
# Sonde personnalisée pour vérifier l'existence d'un processus
# Format de sortie Centreon : STATUS ServiceName - MESSAGE | PERFDATA

# Nom du processus à vérifier
# Si $1 n'est pas défini, la valeur par défaut est 'httpd'
NOM_PROCESSUS="${1:-httpd}"

# Nombre d'instances du processus en cours d'exécution
NOMBRE_INSTANCES=$(pgrep -c "$NOM_PROCESSUS")

# Seuils pour les alertes (optionnel : ici exemple fixe)
SEUIL_WARNING=2
SEUIL_CRITIQUE=1

# Logique de vérification
if [ "$NOMBRE_INSTANCES" -eq 0 ]; then
    echo "Processus HTTPD - CRITICAL - Processus '$NOM_PROCESSUS' non trouvé | count=0;$SEUIL_WARNING;$SEUIL_CRITIQUE;0"
    exit 2
elif [ "$NOMBRE_INSTANCES" -lt "$SEUIL_WARNING" ]; then
    echo "Processus HTTPD - WARNING - Seulement $NOMBRE_INSTANCES instance(s) de '$NOM_PROCESSUS' | count=$NOMBRE_INSTANCES;$SEUIL_WARNING;$SEUIL_CRITIQUE;0"
    exit 1
else
    echo "Processus HTTPD - OK - $NOMBRE_INSTANCES instance(s) de '$NOM_PROCESSUS' en cours d'exécution | count=$NOMBRE_INSTANCES;$SEUIL_WARNING;$SEUIL_CRITIQUE;0"
    exit 0
fi
chmod +x /opt/centreon/sondes/check_process_httpd.sh

9.5 Ajout de la Sonde dans Centreon

9.5.1 Création de la Commande

  1. Dans Centreon, allez dans Configuration > Commandes > Connecteurs
  2. Cliquez sur Ajouter
  3. Remplissez :
    • Nom de la commande : check_disk_custom
    • Type de commande : Centreon Monitoring Agent
    • Ligne de commande : /opt/centreon/sondes/check_disk_custom.sh $ARG1$ $ARG2$ $ARG3$
  4. Ajoutez les macros (optionnel) :
    • $ARG1$ : Partition (ex: /)
    • $ARG2$ : Seuil WARNING (ex: 20)
    • $ARG3$ : Seuil CRITICAL (ex: 10)
  5. Cliquez sur Sauvegarder

9.5.2 Ajout à la Whitelist du Poller

Sur le serveur poller, créez ou éditez le fichier de whitelist :

vi /etc/centreon-engine-whitelist/custom-commands.yml

Ajoutez :

whitelist:
  regex:
    - ^/opt/centreon/sondes/check_disk_custom\.sh.*
    - ^/opt/centreon/sondes/check_process_httpd\.sh.*

Redémarrez Centreon Engine :

systemctl restart centengine

9.5.3 Création du Service

  1. Dans Centreon, allez dans Configuration > Services > Services par hôte
  2. Cliquez sur Ajouter
  3. Remplissez :
    • Hôte : Sélectionnez votre hôte
    • Description : Disk-Custom-Root
    • Modèle : Generic-Service (ou créez un modèle spécifique)
    • Commande de vérification : check_disk_custom
    • Arguments : !/!20!10
  4. Configurez les seuils et intervalles selon vos besoins
  5. Cliquez sur Sauvegarder

9.5.4 Export de la Configuration

  1. Allez dans Configuration > Collecteurs
  2. Sélectionnez votre poller
  3. Exportez la configuration

9.6 Configuration SELinux pour les Sondes Personnalisées

Si SELinux est actif, autorisez l’exécution des sondes :

semanage fcontext -a -t bin_t "/opt/centreon/sondes(/.*)?"
restorecon -Rv /opt/centreon/sondes

Étape 10 : Tests et Vérification Finale

10.1 Vérification dans l’Interface Centreon

  1. Allez dans Supervision > Statut des ressources
  2. Recherchez votre hôte
  3. Vérifiez que les services passent de Pending à OK, WARNING ou CRITICAL
  4. Consultez les graphiques de performance

10.2 Vérification des Logs de l’Agent

Sur l’hôte supervisé :

tail -f /var/log/centreon-monitoring-agent/centagent.log

Vous devriez voir des messages indiquant l’envoi régulier des métriques.

10.3 Vérification de la Connexion TLS

Vérifiez que la communication est bien chiffrée :

ss -tunlp | grep 4317

Sur le poller, vous pouvez utiliser tcpdump pour analyser le trafic :

tcpdump -i any port 4317 -X | head -50

Avec TLS, le contenu doit être illisible (chiffré).

10.4 Test de Failover

Arrêtez l’agent et vérifiez que Centreon détecte l’interruption :

systemctl stop centagent

Attendez quelques minutes et vérifiez dans Centreon que l’hôte passe en DOWN ou UNREACHABLE.

Redémarrez ensuite l’agent :

systemctl start centagent

10.5 Vérification des Performances

Consultez les graphiques dans Centreon pour vérifier que les données de performance sont bien collectées et affichées.

Dépannage

Problème : L’agent ne se connecte pas au poller

Solutions :

  • Vérifiez que le port 4317/TCP est bien ouvert sur le poller
  • Contrôlez l’adresse IP/FQDN dans centagent.json
  • Vérifiez les logs : tail -f /var/log/centreon-monitoring-agent/centagent.log
  • Testez la connectivité : telnet <IP_POLLER> 4317
  • Vérifiez le token : Si le chiffrement est activé sur le poller, le token est obligatoire

Problème : Erreur d’authentification / Token invalide

Messages d’erreur typiques :

  • authentication failed
  • invalid token
  • unauthorized

Solutions :

  • Vérifiez que le token dans centagent.json correspond exactement à celui généré dans Centreon
  • Pas d’espaces avant/après le token
  • Régénérez un nouveau token dans Configuration > Collecteurs > Configurations d’agent
  • Exportez la configuration du collecteur après modification du token
  • Redémarrez l’agent : systemctl restart centagent

Problème : Erreur de certificat TLS

Solutions :

  • Vérifiez que ca_common_name correspond au CN du certificat (si le champ est renseigné)
  • Assurez-vous que le FQDN est utilisé dans endpoint, pas l’IP
  • Vérifiez que les certificats racine sont à jour : update-ca-trust
  • Testez manuellement : openssl s_client -connect <FQDN>:4317 -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • Avec Let’s Encrypt, essayez de laisser ca_common_name vide ou de l’omettre complètement
  • Vérifiez que le certificat du poller est valide : openssl x509 -in /etc/pki/centreon/public_cert.crt -noout -dates

Problème : Les services restent en Pending

Solutions :

  • Vérifiez que le nom de l’hôte dans centagent.json correspond exactement à celui dans Centreon
  • Exportez à nouveau la configuration du collecteur
  • Redémarrez centengine sur le poller
  • Vérifiez les logs du poller : tail -f /var/log/centreon-engine/centengine.log

Problème : Les sondes personnalisées ne fonctionnent pas

Solutions :

  • Vérifiez que le script est exécutable : chmod +x /opt/centreon/sondes/votresonde.sh
  • Testez le script manuellement sur l’hôte
  • Vérifiez la whitelist sur le poller : /etc/centreon-engine-whitelist/custom-commands.yml
  • Redémarrez centengine après modification de la whitelist
  • Vérifiez les permissions SELinux si activé

Problème : SELinux bloque l’agent

Solutions :

  • Consultez les logs : ausearch -m avc -ts recent
  • Générez une politique : ausearch -m avc -ts recent | audit2allow -M ma_politique
  • Installez la politique : semodule -i ma_politique.pp
  • En dernier recours : setenforce 0 (mode permissif)

Bonnes Pratiques

  • Sauvegardez vos configurations avant toute modification importante
  • Documentez vos sondes personnalisées avec des commentaires dans les scripts
  • Surveillez l’expiration des certificats même avec le renouvellement automatique
  • Utilisez toujours un token d’authentification avec le chiffrement TLS activé
  • Conservez vos tokens en lieu sûr et ne les partagez jamais publiquement
  • Utilisez des variables dans vos scripts pour faciliter la maintenance
  • Testez en préproduction avant de déployer en production
  • Centralisez vos sondes dans un dépôt Git pour versionning
  • Activez SELinux en mode Permissive d’abord, puis en Enforcing une fois les règles validées
  • Surveillez les logs régulièrement pour détecter les anomalies
  • Créez des alertes sur l’expiration des certificats (60 jours avant)
  • Préférez « encryption »: « full » sur Centreon 25.10+ au lieu de l’ancien booléen true
  • Vérifiez la version de votre Centreon pour adapter les paramètres de configuration

Conclusion

Vous disposez maintenant d’une installation complète et sécurisée de Centreon Monitoring Agent sur RHEL 9, avec :

  • Un chiffrement TLS via Let’s Encrypt pour sécuriser les communications
  • Une authentification par token pour garantir que seuls les agents autorisés peuvent se connecter
  • Un renouvellement automatique des certificats pour éviter les interruptions de service
  • Une configuration SELinux adaptée pour maintenir un niveau de sécurité élevé
  • Des sondes personnalisées organisées dans /opt/centreon/sondes pour étendre les capacités de supervision

CMA représente une évolution majeure par rapport à NRPE, offrant de meilleures performances, une sécurité renforcée et une architecture moderne basée sur OpenTelemetry. Cette solution est parfaitement adaptée aux environnements de production exigeants.

Points clés à retenir :

  • Adaptez les paramètres encryption selon votre version de Centreon (24.10 vs 25.10+)
  • Le token d’authentification est indispensable avec le chiffrement activé
  • Utilisez ca_common_name (et non ca_name) dans vos fichiers de configuration
  • Le champ ca_common_name peut être omis avec Let’s Encrypt
  • Privilégiez reload sur restart pour les versions récentes lors du renouvellement des certificats

N’hésitez pas à adapter ce tutoriel à vos besoins spécifiques et à créer vos propres sondes pour superviser des aspects métier de votre infrastructure.

Ressources utiles :

  • Documentation officielle Centreon : https://docs.centreon.com
  • Let’s Encrypt : https://letsencrypt.org
  • SELinux Project : https://selinuxproject.org
  • OpenTelemetry : https://opentelemetry.io

Bon monitoring avec Centreon CMA !

26 décembre 2025 /

Fonctionnalités du script

Système de base:

  • ✅ LVM /home (UUID, backup, montage auto)
  • ✅ DNS Google (8.8.8.8, 8.8.4.4)
  • ✅ GRUB dual-boot (10s timeout)
  • ✅ Vim éditeur par défaut

Stockage et partages:

  • ✅ 14 partages NAS (fstab + automount)
  • ✅ Credentials sécurisés (chmod 600)
  • ✅ Signets Nautilus avec emojis
  • ✅ Redirection XDG intelligente

Environnement développement:

  • ✅ Docker Engine (dépôt officiel)
  • ✅ Docker Compose V2
  • ✅ KVM/libvirt/virt-manager
  • ✅ Ansible
  • ✅ scanmem, default-jdk

Applications:

  • ✅ Google Chrome (dépôt auto)
  • ✅ Steam (dépôt officiel)
  • ✅ VirtualBox + Guest Additions ISO
  • ✅ Discord, VLC (Flatpak)
  • ✅ Suite bureautique complète

Optimisations:

  • ✅ Historique Bash 500K lignes
  • ✅ Sudo sans mot de passe
  • ✅ Veille désactivée
  • ✅ UFW désactivé
  • ✅ Journal systemd limité (500M)

Automatisations:

  • ✅ Nettoyage hebdomadaire (dimanche 3h)
  • ✅ MAJ quotidiennes (APT + Snap + Flatpak)
  • ✅ Docker cleanup (sans volumes)
  • ✅ Logs détaillés

Interface:

  • ✅ GSConnect (KDE Connect Android)
  • ✅ Nautilus optimisé
  • ✅ Extensions GNOME détectées
  • ✅ Signets personnalisés

Commande d’exécution :

sudo bash post-install.sh 2>&1 | tee post-install.log

#!/bin/bash
################################################################################
# Script de post-installation Ubuntu 24.04 LTS
#
# Description : Configure automatiquement un système Ubuntu fraîchement installé
# avec montage /home sur LVM (via UUID), montage NAS via fstab,
# optimisations système, et automatisations
#
# Auteur : Romain J.
# Version : 5.9
# Date : 2025
#
# Utilisation : sudo bash post-install.sh 2>&1 | tee post-install.log
################################################################################

set -e # Arrêter le script en cas d’erreur critique

################################################################################
# VARIABLES DE CONFIGURATION
################################################################################

UTILISATEUR= »starmate »
BASHRC_USER= »/home/$UTILISATEUR/.bashrc »

# Configuration NAS
NAS_IP= »IP_DU_NAS » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PASSWORD= »VOTRE_MOT_DE_PASSE_ICI » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PARTAGES=(animation documents downloads films Imprimante jeux livres musique perso photographie sauvegarde seriestv surveillance Technique)
NAS_CREDENTIALS= »/root/.smbcredentials »

# Montage /home sur LVM
LVM_HOME_DEVICE= »/dev/home-vg/home_lv »

################################################################################
# VÉRIFICATIONS PRÉALABLES
################################################################################

echo « ========================================== »
echo  » POST-INSTALLATION UBUNTU 24.04 LTS »
echo « ========================================== »
echo «  »
echo « Vérifications préalables… »

if [ « $EUID » -ne 0 ]; then
echo « ❌ Erreur : Ce script doit être exécuté en root (sudo) »
exit 1
fi

if ! id « $UTILISATEUR » &>/dev/null; then
echo « ❌ Erreur : L’utilisateur $UTILISATEUR n’existe pas »
exit 1
fi

USER_UID=$(id -u « $UTILISATEUR »)
USER_GID=$(id -g « $UTILISATEUR »)
echo « ✓ Utilisateur détecté : $UTILISATEUR (UID: $USER_UID, GID: $USER_GID) »

if [ « $NAS_PASSWORD » = « VOTRE_MOT_DE_PASSE_ICI » ]; then
echo « ❌ Erreur : Veuillez modifier le mot de passe NAS dans le script avant de l’exécuter »
exit 1
fi

CONNEXION_NET=$(nmcli -t -f NAME,DEVICE connection show –active | grep -E ‘enp|eth’ | cut -d: -f1 | head -n1)
if [ -z « $CONNEXION_NET » ]; then
echo « ❌ Erreur : Aucune connexion réseau filaire active détectée »
exit 1
fi
echo « ✓ Connexion réseau active : $CONNEXION_NET »
echo «  »

################################################################################
# 1. CONFIGURATION DU MONTAGE DE /HOME SUR LVM VIA UUID (EN PREMIER !)
################################################################################

echo « [1/23] Configuration du montage de /home sur LVM (via UUID)… »
echo « ——————————————————- »

# Récupération de l’UUID du volume LVM
HOME_UUID=$(blkid -s UUID -o value « $LVM_HOME_DEVICE » 2>/dev/null || true)

if [ -z « $HOME_UUID » ]; then
echo « ⚠ Impossible de récupérer l’UUID de $LVM_HOME_DEVICE »
echo  » Utilisation du nom de device (moins fiable) : $LVM_HOME_DEVICE »
LVM_ENTRY= »$LVM_HOME_DEVICE /home ext4 defaults 0 2″
else
echo « ✓ UUID trouvé pour /home : $HOME_UUID »
LVM_ENTRY= »UUID=$HOME_UUID /home ext4 defaults 0 2″
fi

if grep -q « /home[[:space:]] » /etc/fstab | grep -q -v « ^# » && ! grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ⚠ Une entrée /home existe déjà dans fstab, mais pas avec le bon UUID/device LVM »
echo  » Sauvegarde et remplacement… »
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
sed -i « \|^[^#].*/home[[:space:]]|d » /etc/fstab # Supprime l’ancienne entrée /home
fi

if grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ✓ L’entrée LVM (UUID) pour /home est déjà présente dans /etc/fstab »
else
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/fstab créée »

echo «  » >> /etc/fstab
echo « # Partition /home sur LVM (via UUID) » >> /etc/fstab
echo « $LVM_ENTRY » >> /etc/fstab
echo « ✓ Entrée LVM pour /home ajoutée à /etc/fstab »

echo  » Tentative de montage immédiat de /home… »
if mount -a 2>/dev/null; then
echo « ✓ /home (LVM) monté avec succès ! Vos données sont maintenant accessibles. »
else
echo « ⚠ Montage immédiat échoué. Redémarrage nécessaire pour activer le vrai /home (LVM). »
fi
fi
echo «  »

################################################################################
# 2. MISE À JOUR, REPO DOCKER, PAQUETS ET GOOGLE CHROME
################################################################################

echo « [2/23] Mise à jour système, repo Docker, paquets et Google Chrome… »
echo « ——————————————————- »

apt update
apt upgrade -y

# Repo Docker officiel
apt install -y ca-certificates curl gnupg lsb-release

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg –dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
« deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable » | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update

# Ajout du dépôt officiel Steam pour installation complète
echo  » Ajout du dépôt officiel Steam… »
curl -s http://repo.steampowered.com/steam/archive/stable/steam.gpg | gpg –dearmor -o /usr/share/keyrings/steam.gpg
echo « deb [arch=amd64 signed-by=/usr/share/keyrings/steam.gpg] http://repo.steampowered.com/steam/ stable steam » | tee /etc/apt/sources.list.d/steam.list > /dev/null
apt update

apt install -y steam
echo « ✓ Steam installé depuis le dépôt officiel (prêt à lancer) »

# Installation des paquets
apt install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
torbrowser-launcher filezilla transmission \
software-properties-common wget gnupg \
virtualbox virtualbox-guest-additions-iso \
gnome-software gnome-software-plugin-flatpak \
audacity calibre cdrdao dia musescore3 gimp gnome-tweaks \
gparted hplip imagemagick inkscape keepassxc manpages-fr \
nautilus-image-converter net-tools okular p7zip-full p7zip-rar rar \
pdfsam printer-driver-cups-pdf sharutils synaptic thunderbird \
timidity tintii ubuntu-restricted-extras unace unrar uudeview \
vlc whois xsane gnome-shell-extensions cifs-utils vim htop \
glances iotop unattended-upgrades flatpak rsync gdebi libfuse2 \
ansible qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager \
gnome-shell-extension-gsconnect default-jdk scanmem git python3 python3-venv python3-pip

# Installation de Google Chrome
echo  » Téléchargement et installation de Google Chrome… »
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O /tmp/google-chrome.deb
apt install -y /tmp/google-chrome.deb
rm -f /tmp/google-chrome.deb
echo « ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »

echo « ✓ Tous les paquets installés avec succès »
echo «  »

################################################################################
# 3. CONFIGURATION DOCKER, KVM ET GROUPES UTILISATEUR
################################################################################

echo « [3/23] Configuration Docker, KVM et groupes utilisateur… »
echo « ——————————————————- »

usermod -aG docker $UTILISATEUR
usermod -aG libvirt $UTILISATEUR
usermod -aG kvm $UTILISATEUR
echo « ✓ Utilisateur $UTILISATEUR ajouté aux groupes : docker, libvirt, kvm »

systemctl enable docker
systemctl start docker
echo « ✓ Service Docker activé et démarré »

systemctl enable libvirtd
systemctl start libvirtd
echo « ✓ Service libvirtd activé et démarré »

set +e
virsh net-autostart default && echo « ✓ Réseau libvirt ‘default’ en autostart » || echo  » ⚠ Réseau ‘default’ déjà en autostart ou indisponible »
virsh net-start default && echo « ✓ Réseau libvirt ‘default’ démarré » || echo  » ⚠ Réseau ‘default’ déjà démarré ou indisponible »
set -e

echo «  »

################################################################################
# 4. CONFIGURATION DNS
################################################################################

echo « [4/23] Configuration des serveurs DNS… »
echo « ——————————————————- »

nmcli connection modify « $CONNEXION_NET » ipv4.dns « 8.8.8.8 8.8.4.4 »
nmcli connection modify « $CONNEXION_NET » ipv4.ignore-auto-dns yes
echo « ✓ DNS configurés : 8.8.8.8, 8.8.4.4 »

set +e
nmcli connection down « $CONNEXION_NET » && echo  » Connexion arrêtée » || echo  » ⚠ Impossible d’arrêter (déjà down ?) »
nmcli connection up « $CONNEXION_NET » && echo « ✓ Connexion redémarrée » || echo  » ⚠ Échec redémarrage (réseau temporairement indisponible ?) »
set -e

echo «  »

################################################################################
# 5. MONTAGE NAS VIA FSTAB
################################################################################

echo « [5/23] Configuration des montages NAS via /etc/fstab… »
echo « ——————————————————- »

# Création du fichier credentials
cat <<EOF > « $NAS_CREDENTIALS »
username=$UTILISATEUR
password=$NAS_PASSWORD
EOF
chmod 600 « $NAS_CREDENTIALS »
echo « ✓ Fichier credentials créé et sécurisé »

# Désactivation temporaire de set -e pour la boucle NAS (évite les crashes sur echo ou mkdir)
set +e

added_count=0
for dossier in « ${NAS_PARTAGES[@]} »; do
MOUNT_LINE= »//${NAS_IP}/${dossier} /mnt/nas/${dossier} cifs credentials=${NAS_CREDENTIALS},iocharset=utf8,vers=3.1.1,uid=${USER_UID},gid=${USER_GID},_netdev,nofail,x-systemd.automount,x-systemd.mount-timeout=5 0 0″

if ! grep -q « ^//${NAS_IP}/${dossier}[[:space:]] » /etc/fstab; then
#mkdir -p « /mnt/nas/${dossier} »
echo « $MOUNT_LINE » >> /etc/fstab
echo  » ✓ Ligne ajoutée pour $dossier »
added_count=$((added_count + 1)) # CORRECTION ICI
else
echo  » ⚠ Ligne déjà présente pour $dossier »
fi
done

# Réactivation de set -e
set -e

if [ $added_count -gt 0 ]; then
echo « ✓ $added_count lignes NAS ajoutées à /etc/fstab »
echo  » Tentative de montage immédiat… »
mount -a 2>/dev/null && echo « ✓ Montages NAS effectués immédiatement » || echo « ⚠ Certains montages ont échoué (réseau/NAS indisponible ? → automount actif) »
else
echo « ✓ Toutes les lignes NAS déjà présentes dans /etc/fstab »
fi
echo «  »

################################################################################
# 6. CONFIGURATION GRUB POUR DUAL-BOOT
################################################################################

echo « [6/23] Configuration GRUB pour dual-boot… »
echo « ——————————————————- »

cp /etc/default/grub /etc/default/grub.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/default/grub créée »

sed -i ‘s/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT_STYLE=menu’ >> /etc/default/grub
sed -i ‘s/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT=10’ >> /etc/default/grub
sed -i ‘s/^GRUB_DISABLE_OS_PROBER=.*/GRUB_DISABLE_OS_PROBER=false/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_DISABLE_OS_PROBER=false’ >> /etc/default/grub

update-grub
echo « ✓ GRUB configuré pour dual-boot (timeout: 10s) »
echo «  »

################################################################################
# 7. CONFIGURATION DE L’ÉDITEUR PAR DÉFAUT
################################################################################

echo « [7/23] Configuration de l’éditeur par défaut… »
echo « ——————————————————- »

update-alternatives –set editor /usr/bin/vim.basic
echo « ✓ Éditeur par défaut : Vim »
echo «  »

################################################################################
# 8. OPTIMISATION DE L’HISTORIQUE BASH
################################################################################

echo « [8/23] Optimisation de l’historique Bash… »
echo « ——————————————————- »

cp $BASHRC_USER ${BASHRC_USER}.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de .bashrc créée »

sed -i ‘/^HISTSIZE=/d’ $BASHRC_USER
sed -i ‘/^HISTFILESIZE=/d’ $BASHRC_USER
sed -i ‘/^shopt -s histappend/d’ $BASHRC_USER
sed -i ‘/^HISTTIMEFORMAT=/d’ $BASHRC_USER
sed -i ‘/^HISTCONTROL=/d’ $BASHRC_USER
sed -i ‘/^HISTIGNORE=/d’ $BASHRC_USER
sed -i ‘/^PROMPT_COMMAND=/d’ $BASHRC_USER
sed -i ‘/^alias update=/d’ $BASHRC_USER
sed -i ‘/^# ==== HISTORIQUE BASH OPTIMISÉ ====/d’ $BASHRC_USER

cat <<‘EOF’ >> $BASHRC_USER

# ==== HISTORIQUE BASH OPTIMISÉ ====
HISTSIZE=500000
HISTFILESIZE=1000000
shopt -s histappend
export HISTTIMEFORMAT= »%F %T  »
export HISTCONTROL=ignoreboth:erasedups
export HISTIGNORE= »ls:ll:la:pwd:cd:cd -:exit:clear »
PROMPT_COMMAND= »history -a; history -c; history -r »

# Alias mise à jour complète
alias update=’sudo apt update && sudo apt upgrade -y && sudo snap refresh 2>/dev/null || true && flatpak update -y 2>/dev/null || true’
EOF

chown $UTILISATEUR:$UTILISATEUR $BASHRC_USER
echo « ✓ Historique Bash optimisé »
echo «  »

################################################################################
# 9. CONFIGURATION SUDO SANS MOT DE PASSE
################################################################################

echo « [9/23] Configuration sudo sans mot de passe… »
echo « ——————————————————- »

echo « $UTILISATEUR ALL=(ALL) NOPASSWD:ALL » > /etc/sudoers.d/90-$UTILISATEUR
chmod 440 /etc/sudoers.d/90-$UTILISATEUR
echo « ✓ Sudo sans mot de passe activé pour $UTILISATEUR (assumé pour PC perso) »
echo «  »

################################################################################
# 10. INSTALLATION FLATPAK ET APPLICATIONS
################################################################################

echo « [10/23] Installation Flatpak et applications… »
echo « ——————————————————- »

flatpak remote-add –if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub com.discordapp.Discord org.videolan.VLC
echo « ✓ Flatpak configuré avec Discord et VLC »
echo «  »

################################################################################
# 11. CONFIGURATION DES MISES À JOUR AUTOMATIQUES
################################################################################

echo « [11/23] Configuration des mises à jour automatiques… »
echo « ——————————————————- »

dpkg-reconfigure -plow unattended-upgrades
echo « ✓ Mises à jour automatiques de sécurité activées »
echo «  »

################################################################################
# 12. NETTOYAGE DES PAQUETS OBSOLÈTES
################################################################################

echo « [12/23] Nettoyage des paquets obsolètes… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Paquets obsolètes supprimés »
echo «  »

################################################################################
# 13. LIMITATION DU JOURNAL SYSTEMD
################################################################################

echo « [13/23] Limitation du journal systemd… »
echo « ——————————————————- »

grep -qxF ‘SystemMaxUse=500M’ /etc/systemd/journald.conf || echo ‘SystemMaxUse=500M’ >> /etc/systemd/journald.conf
systemctl restart systemd-journald
echo « ✓ Journal systemd limité à 500 Mo »
echo «  »

################################################################################
# 14. CONFIGURATION NAUTILUS ET GNOME (avec activation GSConnect)
################################################################################

echo « [14/23] Configuration Nautilus et GNOME… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-hidden-files true
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences default-folder-viewer ‘list-view’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.default-applications.terminal exec ‘gnome-terminal’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.thumbnailers disable-all false
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-image-thumbnails ‘always’

echo « ✓ Nautilus configuré (fichiers cachés, vue liste, miniatures) »

EXTENSIONS_DISPONIBLES=$(sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions list 2>/dev/null || echo «  »)

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « dash-to-dock@micxgx.gmail.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable dash-to-dock@micxgx.gmail.com
echo  » ✓ dash-to-dock activé »
else
echo  » ✗ dash-to-dock non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « gsconnect@andyholmes.github.io »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable gsconnect@andyholmes.github.io
echo  » ✓ GSConnect activé (prêt pour KDE Connect sur Android) »
else
echo  » ✗ GSConnect non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « clipboard-indicator@tudmotu.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable clipboard-indicator@tudmotu.com
echo  » ✓ clipboard-indicator activé »
else
echo  » ✗ clipboard-indicator non installé »
fi
else
echo « ⚠ gsettings non disponible, configuration GNOME ignorée »
fi
echo «  »

################################################################################
# 15. DÉSactivation DE LA VEILLE AUTOMATIQUE
################################################################################

echo « [15/23] Désactivation de la veille automatique et extinction écran… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.session idle-delay 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power idle-dim false

echo « ✓ Veille automatique, extinction écran et assombrissement désactivés »
else
echo « ⚠ gsettings non disponible, désactivation de la veille ignorée »
fi
echo «  »

################################################################################
# 16. DÉSactivation DU FIREWALL UFW
################################################################################

echo « [16/23] Désactivation du firewall UFW… »
echo « ——————————————————- »

ufw disable
echo « ✓ UFW désactivé (comme demandé) »
echo «  »

################################################################################
# 17. CRÉATION DU SCRIPT DE NETTOYAGE AUTOMATIQUE
################################################################################

echo « [17/23] Création du script de nettoyage automatique… »
echo « ——————————————————- »

cat <<EOF > /usr/local/bin/cleanup.sh
#!/bin/bash
echo « Début nettoyage système : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log

echo « === Nettoyage APT === » >> /var/log/cleanup.log
apt autoremove -y >> /var/log/cleanup.log 2>&1
apt autoclean -y >> /var/log/cleanup.log 2>&1

echo « === Nettoyage Snap === » >> /var/log/cleanup.log
snap set system refresh.retain=2
snap list –all | awk ‘/disabled/{print \$1″ –revision « \$3}’ | xargs -r snap remove >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Flatpak === » >> /var/log/cleanup.log
flatpak uninstall –unused -y >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Docker === » >> /var/log/cleanup.log
docker system prune -f >> /var/log/cleanup.log 2>&1 || true # Sans –volumes pour préserver les données Docker
docker builder prune -f –keep-storage 10GB >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage fichiers temporaires === » >> /var/log/cleanup.log
find /tmp -type f -atime +7 -delete 2>/dev/null || true
find /var/tmp -type f -atime +7 -delete 2>/dev/null || true

echo « === Nettoyage cache miniatures === » >> /var/log/cleanup.log
find /home/$UTILISATEUR/.cache/thumbnails -type f -atime +30 -delete 2>/dev/null || true

echo « === Nettoyage logs anciens === » >> /var/log/cleanup.log
find /var/log -type f -name « *.log.* » -mtime +30 -delete 2>/dev/null || true

echo « Nettoyage terminé : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log
EOF

chmod +x /usr/local/bin/cleanup.sh

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.service
[Unit]
Description=Nettoyage automatique du système

[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.timer
[Unit]
Description=Timer hebdomadaire pour nettoyage automatique

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now cleanup-system.timer
echo « ✓ Nettoyage automatique planifié (dimanche 3h, incl. Docker) »
echo «  »

################################################################################
# 18. CRÉATION DU SCRIPT DE MISE À JOUR AUTOMATIQUE
################################################################################

echo « [18/23] Création du script de mise à jour automatique… »
echo « ——————————————————- »

cat <<‘EOF’ > /usr/local/bin/update-system.sh
#!/bin/bash
echo « ======================================== » >> /var/log/update-system.log
echo « Début mise à jour système : $(date) » >> /var/log/update-system.log

echo « === Mise à jour APT === » >> /var/log/update-system.log
apt update >> /var/log/update-system.log 2>&1
apt upgrade -y >> /var/log/update-system.log 2>&1

echo « === Mise à jour Snap === » >> /var/log/update-system.log
snap refresh >> /var/log/update-system.log 2>&1 || true

echo « === Mise à jour Flatpak === » >> /var/log/update-system.log
flatpak update -y >> /var/log/update-system.log 2>&1 || true

echo « Fin mise à jour système : $(date) » >> /var/log/update-system.log
echo « ======================================== » >> /var/log/update-system.log
echo «  » >> /var/log/update-system.log
EOF

chmod +x /usr/local/bin/update-system.sh

cat <<‘EOF’ > /etc/systemd/system/update-system.service
[Unit]
Description=Mise à jour automatique APT + Snap + Flatpak

[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-system.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/update-system.timer
[Unit]
Description=Timer quotidien pour mise à jour automatique

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now update-system.timer
echo « ✓ Mises à jour automatiques planifiées (quotidien) »
echo «  »

################################################################################
# 19. REDIRECTION DES DOSSIERS STANDARDS VERS LE NAS + SIGNETS PERSONNALISÉS
################################################################################

echo « [19/23] Redirection des dossiers standards vers le NAS et signets personnalisés… »
echo « ——————————————————- »

USER_DIRS_FILE= »/home/$UTILISATEUR/.config/user-dirs.dirs »
USER_DIRS_CONF= »/home/$UTILISATEUR/.config/user-dirs.conf » # ← AJOUT CRITIQUE

# Sauvegarde du fichier actuel
if [ -f « $USER_DIRS_FILE » ]; then
cp « $USER_DIRS_FILE » « ${USER_DIRS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo « + Sauvegarde de user-dirs.dirs créée »
fi

# Suppression définitive des dossiers locaux concernés (Documents, Musique, Images)
# Cela empêche xdg-user-dirs-update de les recréer au login
echo « + Suppression définitive des dossiers locaux redirigés… »
sudo -u $UTILISATEUR rmdir « $HOME/Documents » « $HOME/Musique » « $HOME/Images » 2>/dev/null || true

# Réécriture du fichier user-dirs.dirs
cat <<EOF > « $USER_DIRS_FILE »
XDG_DESKTOP_DIR= »\$HOME/Bureau »
XDG_DOWNLOAD_DIR= »\$HOME/Téléchargements »
XDG_TEMPLATES_DIR= »\$HOME/Modèles »
XDG_PUBLICSHARE_DIR= »\$HOME/Public »
XDG_DOCUMENTS_DIR= »/mnt/nas/documents »
XDG_MUSIC_DIR= »/mnt/nas/musique »
XDG_PICTURES_DIR= »/mnt/nas/photographie »
XDG_VIDEOS_DIR= »\$HOME/ » # Désactivé visuellement (pas de sous-dossier = pas affiché dans Nautilus)
EOF

# CRITIQUE : Désactiver xdg-user-dirs-update pour empêcher l’écrasement
cat <<EOF > « $USER_DIRS_CONF »
enabled=False
EOF

chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_FILE »
chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_CONF »
chmod 644 « $USER_DIRS_CONF »

# Redémarrage Nautilus pour prise en compte immédiate
sudo -u $UTILISATEUR nautilus -q 2>/dev/null || true

echo « + Dossiers redirigés : »
echo  » – Documents → /mnt/nas/documents »
echo  » – Musique → /mnt/nas/musique »
echo  » – Images → /mnt/nas/photographie »
echo  » – Téléchargements reste local (comme souhaité) »
echo  » – Vidéos retiré du menu »
echo «  »

# Configuration des signets Nautilus
BOOKMARKS_FILE= »/home/$UTILISATEUR/.config/gtk-3.0/bookmarks »
mkdir -p « $(dirname « $BOOKMARKS_FILE ») »
touch « $BOOKMARKS_FILE »

# Sauvegarde APRÈS création du fichier (s’il contient des données)
if [ -s « $BOOKMARKS_FILE » ]; then
cp « $BOOKMARKS_FILE » « ${BOOKMARKS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo  » ✓ Sauvegarde de bookmarks créée »
fi

declare -A NOM_SIGNET
NOM_SIGNET[animation]= »🎬 Animation »
NOM_SIGNET[documents]= »📄 Documents »
NOM_SIGNET[downloads]= »⬇️ Téléchargements »
NOM_SIGNET[films]= »🎥 Films »
NOM_SIGNET[Imprimante]= »🖨️ Imprimante »
NOM_SIGNET[jeux]= »🎮 Jeux »
NOM_SIGNET[livres]= »📚 Livres »
NOM_SIGNET[musique]= »🎵 Musique »
NOM_SIGNET[perso]= »👤 Perso »
NOM_SIGNET[photographie]= »📸 Photographie »
NOM_SIGNET[sauvegarde]= »💾 Sauvegarde »
NOM_SIGNET[seriestv]= »📺 Séries TV »
NOM_SIGNET[surveillance]= »📹 Surveillance »
NOM_SIGNET[Technique]= »🔧 Technique »

for dossier in « ${NAS_PARTAGES[@]} »; do
CHEMIN= »file:///mnt/nas/$dossier »
NOM= »${NOM_SIGNET[$dossier]:-$dossier} »
if ! grep -q « ^${CHEMIN} » « $BOOKMARKS_FILE » 2>/dev/null; then
echo « $CHEMIN $NOM » >> « $BOOKMARKS_FILE »
echo  » ✓ Signet ajouté : $NOM »
else
echo  » ⚠ Signet déjà présent : $NOM »
fi
done

chown $UTILISATEUR:$UTILISATEUR « $BOOKMARKS_FILE »
chmod 644 « $BOOKMARKS_FILE »
echo « ✓ ${#NAS_PARTAGES[@]} signets NAS ajoutés dans Nautilus »
echo «  »

################################################################################
# 20. VÉRIFICATIONS FINALES DES SERVICES
################################################################################

echo « [20/23] Vérification des services Docker et KVM… »
echo « ——————————————————- »

set +e

if systemctl is-active –quiet docker; then
DOCKER_VERSION=$(docker –version 2>/dev/null | awk ‘{print $3}’ | tr -d ‘,’)
COMPOSE_VERSION=$(docker compose version 2>/dev/null | awk ‘{print $4}’)
echo  » ✓ Docker actif : version $DOCKER_VERSION | Compose : $COMPOSE_VERSION »
else
echo  » ✗ Docker inactif ou non installé »
fi

if systemctl is-active –quiet libvirtd; then
LIBVIRT_VERSION=$(virsh –version 2>/dev/null)
echo  » ✓ libvirtd actif (version $LIBVIRT_VERSION) »
else
echo  » ✗ libvirtd inactif »
fi

if command -v ansible &> /dev/null; then
ANSIBLE_VERSION=$(ansible –version 2>/dev/null | head -n1 | awk ‘{print $2}’)
echo  » ✓ Ansible installé (version $ANSIBLE_VERSION) »
else
echo  » ✗ Ansible non installé »
fi

set -e
echo «  »

################################################################################
# 21. NETTOYAGE FINAL
################################################################################

echo « [21/23] Nettoyage final… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Nettoyage final effectué »
echo «  »

################################################################################
# 22. RÉSUMÉ FINAL
################################################################################

echo « [22/23] RÉSUMÉ FINAL »
echo « ========================================== »
echo  » POST-INSTALLATION TERMINÉE AVEC SUCCÈS ! »
echo « ========================================== »
echo «  »
echo « 📋 RÉSUMÉ DES ACTIONS : »
echo  » ✓ /home configuré sur LVM (via UUID) »
echo  » ✓ virtualbox-guest-additions-iso installé (Guest Additions prêtes pour VMs) »
echo  » ✓ GSConnect installé et activé (KDE Connect Android prêt) »
echo  » ✓ UFW désactivé »
echo  » ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »
echo  » ✓ Docker officiel + Compose V2 + KVM configurés »
echo  » ✓ Steam installé depuis le dépôt officiel »
echo  » ✓ Veille automatique et extinction écran désactivées »
echo  » ✓ Système mis à jour et paquets installés »
echo  » ✓ DNS Google configurés »
echo  » ✓ ${#NAS_PARTAGES[@]} partages NAS montés via fstab + signets Nautilus »
echo  » ✓ GRUB dual-boot, Bash optimisé, sudo NOPASSWD »
echo  » ✓ Flatpak, nettoyage (incl. Docker) et MAJ automatiques »
echo  » ✓ Nautilus/GNOME configuré »
echo «  »
echo « 🔧 COMMANDES UTILES APRÈS REBOOT : »
echo  » • Dans une VM VirtualBox → Périphériques > Insérer l’image des Additions Invité… »
echo  » • GSConnect : icône téléphone dans la barre supérieure »
echo  » • Installer KDE Connect sur Android et appairer »
echo  » • google-chrome, docker compose up, virt-manager… »
echo  » ✓ Dossiers Documents/Musique/Images redirigés vers NAS »
echo «  »
echo « Le système va redémarrer dans 30 secondes pour appliquer toutes les modifications. »
echo « Appuyez sur Ctrl+C pour annuler. »
echo «  »

################################################################################
# 23. REDÉMARRAGE AUTOMATIQUE
################################################################################

echo « [23/23] Redémarrage du système… »
echo « ——————————————————- »

for i in {30..1}; do
printf « Redémarrage dans %2d secondes… (Ctrl+C pour annuler) \r » « $i »
sleep 1
done

echo «  »
echo « Redémarrage en cours… »
sync
reboot

17 septembre 2020 /
Lorsque vous essayez d'annuler une transaction yum via yum history undo <id> ou yum history rollback qui inclut systemd dans la liste des paquet, yum va échouer avec cette erreur:
Error: Trying to remove "systemd", which is protected
Pour pouvoir faire la transaction yum , on peut renommer ou supprimer(le fichier sera normalement recréer) /etc/yum/protected.d/systemd.conf et puis de relancer la commande. 

Remarque: ces rétrogradations ne sont pas officiellement prises en charge par Redhat. Pensez aux sauvegardes.
28 juillet 2020 /

On commence par placer nos documents à chiffrer dans une archive, nommée par exemple repertoire.tar.

Puis pour chiffrer l’archive on tape la commande suivante:

openssl aes-256-cbc -salt -pbkdf2 -in repertoire.tar -out repertoire.tar.enc

Cela va chiffrer l’archive avec openssl en AES-256.
Un mot de passe sera demandé.

Pour effectuer l’opération inverse :

openssl aes-256-cbc -d -salt -pbkdf2 -in repertoire.tar.enc -out repertoire.tar
28 janvier 2020 /
lsof | grep -e "[[digit:]]\+w"