Icinga 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
Icinga 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
La 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.
Un 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}
La 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
La 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 :
- J’assainis
httpd.conf
. C’est expliqué en détail dans cet article. - J’améliore la configuration dans
/etc/httpd/conf.d/ssl.conf
. C’est expliqué ici.
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
Si 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 :
Pourquoi 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 :
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 :
Acceptez les réglages par défaut en cliquant sur Next :
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 :
Cliquez sur Next si le test de connexion à la base a réussi :
Acceptez les réglages par défaut en cliquant sur Next :
L’écran Administration permet de définir un compte d’administrateur initial pour Icinga Web :
Acceptez les réglages par défaut en cliquant sur Next :
L’écran subséquent offre un récapitulatif de la configuration d’Icinga Web. Cliquez sur Next :
Passez à la configuration du moteur de l’application Icinga en cliquant sur Next :
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 :
Une fois que le test de connexion à la base de données a réussi, cliquez sur Next :
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 :
Si le test s’effectue correctement, cliquez sur Next :
Acceptez les réglages par défaut en cliquant sur Next :
L’écran récapitulatif du moteur de supervision Icinga s’affiche. Confirmez en cliquant sur Finish :
Cliquez sur Login to Icinga Web 2 pour afficher l’écran de connexion :
Première connexion
Connectez-vous à Icinga Web avec l’identifiant et le mot de passe que vous avez définis dans l’assistant :
Le tableau de bord d’Icinga s’affiche avec une poignée de services configurés par défaut :
Et 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