Icinga LogoIcinga est une application de supervision Open Source qui permet de surveiller vos systèmes et vos réseaux. Elle surveille les hôtes et les services spécifiés et envoie des alertes lorsque les systèmes présentent des dysfonctionnements et quand ils repassent en mode normal.

Si vous n’utilisez pas ce genre de surveillance pour vos serveurs, c’est que ce sont probablement vos utilisateurs qui font ce travail. Ils vous alertent par téléphone et – le cas échéant – vous engueulent par mail ou sur Twitter si l’une de vos machines a rendu l’âme ou si l’un des services que vous avez configurés (site web, serveur mail, stockage réseau, serveur de messagerie, etc.) est dur de la feuille ou ne fonctionne plus du tout.

D’où l’intérêt d’un outil de supervision comme Icinga. Il vous permet de mettre en place une surveillance précise de toutes vos machines critiques. Les informations que vous récolterez ainsi vous permettront alors une gestion proactive de tous les problèmes qui peuvent apparaître.

Icinga est un programme modulaire qui se décompose en trois parties :

  • le moteur de l’application qui vient ordonnancer les tâches de supervision
  • l’interface web qui permet d’avoir une vue d’ensemble du système d’information et des possibles anomalies
  • les sondes (ou plugins), une multitude de mini-programmes que chacun peut installer en fonction de ses besoins et qui permettent de superviser chaque service et chaque ressource disponible entre ciel et terre

AstuceIcinga est un fork du célèbre outil de supervision Nagios créé en 2009 lorsque ce projet commençait à battre de l’aile. Si vous aviez l’habitude d’utiliser Nagios, la migration vers Icinga se fera très facilement. Icinga est d’ailleurs compatible avec l’ensemble des plugins Nagios.

Dans cette petite série d’articles, je vais décrire la mise en place de A à Z d’un serveur de supervision Icinga sur un serveur dédié. L’objectif de cette installation consiste à superviser mon parc de serveurs Linux, qui peuvent être rangés grosso modo dans deux catégories :

  • serveurs publics avec une ouverture frontale sur Internet
  • serveurs locaux coincés derrière un routeur

Documentation

Read The Fucking ManualLa documentation d’Icinga (en anglais) est assez bien faite dans l’ensemble, et je l’ai trouvée exemplaire pour toute la partie qui concerne l’installation. En revanche, certains chapitres peuvent vous submerger de détails. En lisant la partie concernant la supervision à proprement parler, j’avais l’impression de rechercher une simple recette de sauce bolognaise et de me retrouver plongé dans des études de biochimie alimentaire.

Cette complexité s’explique par la nature de l’objet, étant donné qu’Icinga est une véritable usine à gaz constituée d’une multitude de composants, et capable de superviser des installations aux dimensions bibliques.

Cet article cherche donc avant tout à combler ce déficit de pédagogie, en proposant de plonger les mains dans le cambouis et de configurer pas à pas « quelque chose qui marche ».

Prérequis

Mon serveur de supervision sera installé sur un serveur dédié de chez Online/Scaleway tournant sous Rocky Linux 8. Mon point de départ, c’est un serveur de base configuré « aux petits oignons » comme c’est décrit en détail dans cet article.

AstuceUn serveur d’entrée de gamme (Start-2-S-SATA ou Start-2-S-SSD) fait largement l’affaire pour ce genre de configuration. Notons toutefois que la machine sera dédiée exclusivement à cette tâche.

Le dépôt de paquets du projet fournit des paquets logiciels pour les distributions les plus courantes. Le dépôt pour Red Hat Enterprise Linux 8 et Rocky Linux 8 dépend du dépôt tiers EPEL (Extra Packages for Enterprise Linux). Si vous avez suivi mes instructions détaillées pour la configuration post-installation du serveur, ces deux dépôts sont déjà configurés :

# dnf repolist | grep icinga
icinga                                  Icinga
# dnf repolist | grep epel
epel                                    EPEL
epel-modular                            EPEL Modular

Pour les paquets PHP, je me sers du dépôt tiers de Remi Collet :

# dnf repolist | grep remi
remi-modular                            Remi Modular
remi-safe                               Remi Safe
# dnf module -y reset php
# dnf module -y enable php:remi-7.4

Installer Icinga

Pour commencer, nous allons installer les paquets de base de l’application :

# dnf install -y icinga2 icinga2-selinux vim-icinga2
  • icinga2 fournit le moteur de supervision à proprement parler.
  • icinga2-selinux contient les règles SELinux d’Icinga.
  • vim-icinga2 permet la coloration syntaxique des fichiers de configuration d’Icinga si vous utilisez l’éditeur Vim.

Nous pouvons d’ores et déjà activer et démarrer le service :

# systemctl enable icinga2 --now

Les sondes Nagios (ou plugins) permettent à Icinga de garder l’œil sur des services externes. Pour une première configuration, nous allons installer une sélection réduite de plugins nécessaires pour faire fonctionner la configuration par défaut :

# dnf install -y nagios-plugins-{ping,ssh,http,disk,load,procs,swap,users}

AstuceLa documentation officielle – ainsi que la plupart des tutos que l’on peut glaner sur le web – préconisent l’installation du métapaquet nagios-plugins-all. Nous évitons de faire cela pour ne pas encombrer notre installation de tout un fatras de dépendances.

Icinga est une application modulaire, ce qui signifie que nous pouvons activer une série de modules ou fonctionnalités (features). Nous utiliserons la fonctionnalité IDO Database (Icinga Data Out Database) qui enregistre les données d’Icinga dans une base de données MySQL :

# dnf install -y mariadb-server
# systemctl enable mariadb --now
# mysql_secure_installation

Nous allons créer deux bases de données :

  • une base icinga qui enregistre l’ensemble des données récoltées et gérées par l’application
  • une base icingaweb qui sera utilisée pour stocker les données de l’interface graphique
# mysql -u root -p
Enter password: **********
Welcome to the MariaDB monitor.

MariaDB [(none)]> create database icinga;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on icinga.* to icinga@localhost
    -> identified by '**********';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> create database icingaweb;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on icingaweb.* to icingaweb@localhost
    -> identified by '**********';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.007 sec)

MariaDB [(none)]> quit;
Bye

Installer le paquet icinga2-ido-mysql qui permet de faire la liaison entre Icinga et MySQL :

# dnf install -y icinga2-ido-mysql

Importer le schéma IDO dans la base de données icinga :

# mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/mysql.sql
# mysqlshow -u root -p icinga
Database: icinga
+----------------------------------------+
|                 Tables                 |
+----------------------------------------+
| icinga_acknowledgements                |
| icinga_commands                        |
| icinga_commenthistory                  |
| icinga_comments                        |
| icinga_configfiles                     |
| icinga_configfilevariables             |
| icinga_conninfo                        |
| ...                                    |
+----------------------------------------+

Le paquet icinga2-ido-mysql fournit un fichier de configuration ido-mysql.conf qu’il faudra éditer pour renseigner l’accès à la base de données :

// /etc/icinga2/features-available/ido-mysql.conf

object IdoMysqlConnection "ido-mysql" {
  user = "icinga"
  password = "**********"
  host = "localhost"
  database = "icinga"
}

Il ne nous reste plus qu’à activer la fonctionnalité IDO Database :

# icinga2 feature enable ido-mysql
Enabling feature ido-mysql. 
Make sure to restart Icinga 2 for these changes to take effect.
# systemctl restart icinga2

Installer Icinga Web

Icinga Web, c’est l’interface graphique qui permet aux utilisateurs d’interagir avec Icinga. La documentation officielle préconise l’utilisation d’Apache en combinaison avec PHP-FPM :

# dnf install -y httpd
# systemctl enable httpd --now

Nous allons partir du bon pied et autoriser les connexions sécurisées dans le pare-feu :

# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload
# firewall-cmd --list-services
http https ssh

ImportantLa documentation d’Icinga préconise l’ouverture du seul port 443 pour les connexions. Or, nous devons également songer à ouvrir le port 80 qui sera utilisé par Certbot pour la génération et le renouvellement des certificats SSL.

Icinga Web a recours à l’API REST pour envoyer des commandes et des requêtes. La commande icinga2 api setup active la fonctionnalité API et crée les certificats ainsi qu’un utilisateur API root avec un mot de passe auto-généré dans le fichier de configuration api-users.conf :

# icinga2 api setup
information/cli: Generating new CA.
information/base: Writing private key to '/var/lib/icinga2/ca//ca.key'.
information/base: Writing X509 certificate to '/var/lib/icinga2/ca//ca.crt'.
...
Done.
Now restart your Icinga 2 daemon to finish the installation!

Éditer le fichier api-users.conf en remplaçant l’utilisateur root par autre chose, par exemple icingaweb2 pour reprendre l’exemple fourni par la documentation officielle :

// /etc/icinga2/conf.d/api-users.conf

object ApiUser "icingaweb2" {
  password = "236e22b5f25c8c18"
  permissions = [ "status/query", "actions/*", "objects/modify/*",
  "objects/query/*" ]
}
  • On peut très bien conserver le mot de passe auto-généré.
  • Les permissions définies ici correspondent au minimum syndical requis par Icinga Web.

Relancer Icinga pour prendre en compte la configuration :

# systemctl restart icinga2

Installer les paquets qui correspondent à l’interface graphique :

# dnf install -y icingaweb2 icingaweb2-selinux php-pecl-imagick
  • icingaweb2 fournit l’application Icinga Web.
  • icingaweb2-selinux contient les règles SELinux d’Icinga Web.
  • php-pecl-imagick est un module PHP nécessaire pour la génération des graphismes dans l’interface.

Éditer un fichier /etc/php.d/date.ini pour renseigner le fuseau horaire correct :

# /etc/php.d/date.ini
[Date]
date.timezone = Europe/Paris

Activer et démarrer le service PHP-FPM :

# systemctl enable php-fpm --now

Configurer un hébergement sécurisé

Installer le client ACME Certbot :

# dnf install -y certbot

La génération d’un certificat SSL/TLS est expliquée en détail dans cet article. Je me contente donc de noter sommairement ma façon de procéder. Vous adapterez le script mkcert.sh à votre configuration :

#!/bin/bash
# 
# mkcert.sh
...
# Generate SSL/TLS certificate
certbot certonly \
  --non-interactive \
  --email info@microlinux.fr \
  --preferred-challenges http \
  --standalone \
  --agree-tos \
  --force-renewal \
  -d sd-155842.dedibox.fr
...

Générer le certificat :

# ./mkcert.sh 
Adding group certs with GID 240.
Stopping Apache server.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account registered.
Requesting a certificate for sd-155842.dedibox.fr
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/sd-155842.dedibox.fr/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/sd-155842.dedibox.fr/privkey.pem
This certificate expires on 2024-04-28.
These files will be updated when the certificate renews.
...
Setting file permissions.
Starting Apache server.

Maintenant que je dispose d’un certificat SSL/TLS, je peux installer le module SSL pour Apache :

# dnf install -y mod_ssl

Avant d’aller plus loin, je peaufine la configuration d’Apache :

Je fournis des modèles pour ces fichiers dans mon dépôt Git, qu’il faudra évidemment adapter à votre configuration :

# mv -v /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig
renamed '/etc/httpd/conf/httpd.conf' -> '/etc/httpd/conf/httpd.conf.orig'
# mv -v /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.orig
renamed '/etc/httpd/conf.d/ssl.conf' -> '/etc/httpd/conf.d/ssl.conf.orig'
# cp -v rocky-8-server/el8/httpd/httpd.conf /etc/httpd/conf/
'rocky-8-server/el8/httpd/httpd.conf' -> '/etc/httpd/conf/httpd.conf'
# cp -v rocky-8-server/el8/httpd/ssl.conf /etc/httpd/conf.d/
'rocky-8-server/el8/httpd/ssl.conf' -> '/etc/httpd/conf.d/ssl.conf'

Le paquet icingaweb2 a installé un fichier de configuration icingaweb2.conf dans /etc/httpd/conf.d. Je vais modifier ce fichier pour utiliser le chiffrement et l’adapter à ma configuration :

# /etc/httpd/conf.d/icingaweb2.conf

<VirtualHost *:80>
  ServerName sd-155842.dedibox.fr
  Redirect / https://sd-155842.dedibox.fr/
</VirtualHost>

<VirtualHost *:443>
  ServerName sd-155842.dedibox.fr
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/sd-155842.dedibox.fr/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/sd-155842.dedibox.fr/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/sd-155842.dedibox.fr/fullchain.pem

  Alias /icingaweb2 "/usr/share/icingaweb2/public"

  <Directory "/usr/share/icingaweb2/public">
    Options SymLinksIfOwnerMatch
    AllowOverride None

    DirectoryIndex index.php

    <IfModule mod_authz_core.c>
      # Apache 2.4
      <RequireAll>
        Require all granted
      </RequireAll>
    </IfModule>

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

    SetEnv ICINGAWEB_CONFIGDIR "/etc/icingaweb2"

    EnableSendfile Off

    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteBase /icingaweb2/
      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_rewrite.c>
      DirectoryIndex error_norewrite.html
      ErrorDocument 404 /icingaweb2/error_norewrite.html
    </IfModule>

  </Directory>

</VirtualHost>

Tester la configuration d’Apache :

# apachectl configtest
Syntax OK

Prendre en compte la configuration sécurisée :

# systemctl restart httpd

Ouvrir l’assistant de configuration

La connexion à l’assistant de configuration d’Icinga Web nécessite un jeton que l’on peut générer comme ceci :

# icingacli setup token create
The newly generated setup token is: ed7c3bd54312bbf4

AstuceSi jamais on a besoin de réafficher ce jeton pour une raison ou pour une autre, on pourra utiliser cette commande :

# icingacli setup token show
The current setup token is: ed7c3bd54312bbf4

Je copie ce jeton dans mon presse-papier et j’ouvre mon navigateur web à l’adresse https://sd-155842.dedibox.fr/icingaweb2. Je colle le jeton depuis le presse-papier dans le champ Setup Token sur la page d’accueil et je clique sur Next :

Icinga - Installation

AstucePourquoi ne pas définir un nom d’hôte comme icinga.microlinux.fr, plus sympathique que sd-155842.dedibox.fr ? Parce que la machine qui héberge mon serveur DNS primaire fait partie du parc de machines à superviser. Je préfère pouvoir me connecter « directement » à mon serveur de supervision.

Acceptez les réglages par défaut en cliquant sur Next :

Icinga - Installation

L’assistant de configuration vérifie la présence des modules PHP nécessaires au bon fonctionnement de l’application. Vérifiez si tous les modules sont bien présents et cliquez sur Next :

Icinga - Installation

Acceptez les réglages par défaut en cliquant sur Next :

Icinga - Installation

Un peu plus haut, nous avons mis en place deux bases de données. La base icingaweb contient toutes les données de l’application web Icinga Web. Renseignez les paramètres de connexion à cette base et vérifiez vos paramètres en cliquant sur Validate Configuration :

Icinga - Installation

Cliquez sur Next si le test de connexion à la base a réussi :

Icinga - Installation

Acceptez les réglages par défaut en cliquant sur Next :

Icinga - Installation

L’écran Administration permet de définir un compte d’administrateur initial pour Icinga Web :

Icinga - Installation

Acceptez les réglages par défaut en cliquant sur Next :

Icinga - Installation

L’écran subséquent offre un récapitulatif de la configuration d’Icinga Web. Cliquez sur Next :

Icinga - Installation

Passez à la configuration du moteur de l’application Icinga en cliquant sur Next :

Icinga - Installation

On passe au paramétrage de la base de données icinga qui contiendra les données à proprement parler de l’application de supervision, c’est-à-dire les états successifs des hôtes et des services, l’historique des incidents, etc. Renseignez les paramètres de connexion à cette base et cliquez sur Validate Configuration :

Icinga - Installation

Une fois que le test de connexion à la base de données a réussi, cliquez sur Next :

Icinga - Installation

Dans l’écran Command Transport, renseignez d’abord le nom d’hôte du serveur. Les paramètres de l’utilisateur API figurent dans le fichier /etc/icinga2/conf.d/api-users.conf. Cliquez sur Validate Configuration pour tester la connexion :

Icinga - Installation

Si le test s’effectue correctement, cliquez sur Next :

Icinga - Installation

Acceptez les réglages par défaut en cliquant sur Next :

Icinga - Installation

L’écran récapitulatif du moteur de supervision Icinga s’affiche. Confirmez en cliquant sur Finish :

Icinga - Installation

Cliquez sur Login to Icinga Web 2 pour afficher l’écran de connexion :

Icinga - Installation

Première connexion

Connectez-vous à Icinga Web avec l’identifiant et le mot de passe que vous avez définis dans l’assistant :

Icinga - Installation

Le tableau de bord d’Icinga s’affiche avec une poignée de services configurés par défaut :

Icinga - Installation

AstuceEt puisque vous vous posez la question. Sur la capture d’écran ci-dessus, le service ping6 s’affiche dans un état CRITICAL. C’est tout à fait normal, étant donné que j’ai désactivé l’IPv6 sur ce serveur.

La suite au prochain numéro, où nous allons peaufiner la configuration initiale de notre serveur de supervision.


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *