Nagios


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi


Installation d’un serveur Nagios et configuration des hosts monitorés

L’objectif est d’installer un serveur Nagios sur un rapsberry pi afin de monitorer son infrastructure locale, cela demande de configurer le serveur nagios ainsi que nagios-nrpe sur les hosts monitorés afin de pouvoir effectuer des opérations de check localement.

L’installation se fait à partir des sources de Nagios.

Attention toutes les opérations se font sur le compte root, il faut donc avoir effectué un sudo -u root bash

Préparatoin de la carte SD

Insérer la carte SD

$ df
/dev/disk6s1 249671680 16128 249655552 1% 63 975217 0% /Volumes/Untitled

Unmount de la carte

$ diskutil unmountDisk /dev/disk6

Ecrire l’image sur la carte

$ sudo dd bs=1m if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/disk6 ; sync
Password:
1760+0 records in
1760+0 records out
1845493760 bytes transferred in 443.168437 secs (4164317 bytes/sec)

Ejecter la carte SD

$ sudo diskutil eject /dev/rdisk6
Password:
Disk /dev/rdisk6 ejected

Préparation du systeme.

Pour le premier boot brancher un écran un clavier et une souris (enfin si nécessaire), il est conseillé d’activer ssh ainsi par la suite plus besoin de clavier / souris / ecran on peut se connecter a distance sur le Pi.

$> sudo -u root bash
$> apt-get update
$> apt-get upgrade

Installation des packages

$> apt install net-tools zip lsof build-essential vim

Installation de Nagios.

Nous allons réaliser l’installation à partir des sources, il faut différencier l’installation du serveur Nagios et de l’agent sur les hosts à monitorer, cet agent n’est nécessaire que si l’on souhaite réaliser des taches locales, si l’objectif est juste de vérifier qu’un port réseau est bien à l’écoute cela ne sera pas nécessaire.

Dans un second temps nous verrons la configuration du serveur Nagios et des hosts à monitorer.

Serveur Nagios.

Il est en général nécessaire d’installer 3 packages sur le serveur. 1. Serveur Nagios Core 2. Plugins Nagios 3. NRPE

Serveur Nagios Core

La procédure d’installation du serveur Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. Nagios Core

Celui ci est nécessaire dans tous les cas.

Plugins Nagios

La procédure d’installation des plugins Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation, l’installation des plugins est décrite un peu plus bas dans la page d’installation de Nagios Core. Nagios Core

Les plugins sont nécessaires sur le serveur Nagios si il est souhaité de monitorer aussi le serveur nagios, soit par lui meme soit par un autre serveur Nagios afin de faire du check croisé.

NRPE

La procédure d’installation de NRPE se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. https://support.nagios.com/kb/article/nrpe-how-to-install-nrpe-v4-from-source-515.html#Raspbian

NRPE est nécessaire si vous souhaitez réaliser des check_nrpe depuis le serveur Nagios, cela sera abordé un peu plus loin.

Host à monitorer.

Pour monitorer un host il y a deux possibilités, soit on va juste vérifier qu’un port réseau (TCP ou UDP) est en écoute depuis le serveur, dans ce cas aucune autre installation supplémentaire n’est nécessaire, soit on souhaite réaliser des check un peu plus fins localement et dans ce cas il faudra prévoir l’installation de NRPE et des Nagios Plugins.

Plugins Nagios

La procédure d’installation des plugins Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation, l’installation des plugins est décrite un peu plus bas dans la page d’installation de Nagios Core. Nagios Core

Les plugins sont nécessaires sur le serveur Nagios si il est souhaité de monitorer aussi le serveur nagios, soit par lui meme soit par un autre serveur Nagios afin de faire du check croisé.

NRPE

La procédure d’installation de NRPE se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. https://support.nagios.com/kb/article/nrpe-how-to-install-nrpe-v4-from-source-515.html#Raspbian

NRPE est nécessaire si vous souhaitez réaliser des check_nrpe depuis le serveur Nagios, cela sera abordé un peu plus loin.

Première configuration du serveur Nagios

Avant tout il faut commencer par quelques configuration, dans un premier temps nous allons juste configurer nagios pour qu’il check les hosts et les services réseau qui sont en écoute sur chacun d’eux, dans un second temps nous verrons pour faire évoluer les checks par nrpe afin d’affiner un peu ce qui sera surveillé par Nagios.

Dans un premier temps il faut commencer par faire quelques configurations dans les fichiers de Nagios.

Fichier commands.cfg

Ajouter dans ce fichier ses commandes, par exemple ici des commandes de notification par gmail ou par SMS.

define command{
    command_name    notify-host-by-gmail
    command_line    /usr/local/nagios/libexec/notify-by-gmail TODO@gmail.com TODO_PASSWORD smtp.gmail.com 587 $CONTACTEMAIL$ "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" "***** Nagios *****  NotificationType:$NOTIFICATIONTYPE$  Host:$HOSTNAME$  State:$HOSTSTATE$  Address:$HOSTADDRESS$  Info:$HOSTOUTPUT$    Date/Time:$LONGDATETIME$"
}

define command{
    command_name    notify-service-by-gmail
    command_line    /usr/local/nagios/libexec/notify-by-gmail TODO@gmail.com TODO_PASSWORD smtp.gmail.com 587 $CONTACTEMAIL$ "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" "***** Nagios *****    NotificationType:$NOTIFICATIONTYPE$    Service:$SERVICEDESC$  Host:$HOSTALIAS$  Address:$HOSTADDRESS$  State:$SERVICESTATE$    Date/Time:$LONGDATETIME$    AdditionalInfo:$SERVICEOUTPUT$"
}
define command{
    command_name    notify-host-by-sms
    command_line    /usr/local/nagios/libexec/notify-by-sms $CONTACTPAGER$ $CONTACTNAME$ "$NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$:$HOSTADDRESS$ is $HOSTSTATE$"
}

define command{
    command_name    notify-service-by-sms
    command_line    /usr/local/nagios/libexec/notify-by-sms $CONTACTPAGER$ $CONTACTNAME$ "$NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}

Il est possible de mettre en place des commandes de notification comme on le souhaite, par exemple par des API il est possible de provoquer des notifications dans Slack , Telegram ….

Fichier contacts.cfg

define contact{
        contact_name                    Patrice_Trognon
        alias                           admin
        contactgroups                   admins
        host_notifications_enabled      1
        service_notifications_enabled   1
        host_notification_period        24x7
        service_notification_period     24x7
        host_notification_options       d,u,r,f
        service_notification_options    u,c,r,f
        host_notification_commands      notify-host-by-gmail,notify-host-by-sms
        service_notification_commands   notify-service-by-gmail,notify-service-by-sms
        email                           TODO_YOUR_EMAIL@gmail.com
        pager                           TODO_YOUR_06
}

define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin,Patrice_Trognon
}

Fichier templates.cfg

Dans le contact pour utiliser les notifications par gmail que nous avons définit dans le fichier commands.cfg il faut penser a modifier ces deux lignes.

    service_notification_commands   notify-service-by-gmail ; send service notifications via email
    host_notification_commands      notify-host-by-gmail    ; send host notifications via email

Créer son fichier de config et le référencer dans le fichier nagios.cfg

Création du fichier depuis le localhost.cfg

$> cp localhost.cfg ptro_infra.cfg

Attention il faut supprimer le hostgroup de ce fichier car il est déjà définit dans le fichier localhost.cfg

Référencement du fichier ptro_infra.cfg dans le fichier nagios.cfg

cfg_file=/usr/local/nagios/etc/objects/ptro_infra.cfg

Configuration de ses hosts dans le fichier ptro_infra.cfg

Premier exemple

define host{
        use                     linux-server
        host_name               dns0
        alias                   DNS0
        address                 dns0.local.boxadmin.com
}

use : indique le template à utiliser, celui ci doit etre définit dans le fichier templates.cfg address : l’ip ou le nom dns du host.

Exemple complet des hosts

define host{
        use                     linux-server
        host_name               dns0
        alias                   DNS0
        address                 dns0.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               dhcp0
        alias                   DHCP0
        address                 dhcp0.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               gammu1
        alias                   gammu1
        address                 gammu1.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               gammu2
        alias                   gammu2
        address                 gammu2.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               torproxy
        alias                   torproxy
        address                 torproxy.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               asterisk
        alias                   asterisk
        address                 asterisk.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               mint
        alias                   mint
        address                 mint.local.boxadmin.com
}

define host{
        use                     linux-server
        host_name               kubuntu
        alias                   kubuntu
        address                 kubuntu.local.boxadmin.com
}

Configuration des services pour chaque host.

Dans un premier temps nous allons nous contenter de définir le check de services réseau sur chaque hosts qui sont capables de répondre sur l’ip, il s’agit alors d’un simple check_tcp (ou check_udp) ainsi que le check par un ping du host.

check_ping

Exemple de définition d’un service de type ping sur le host dns0.

#------------------------------
# dns0.local.boxadmin.com
#------------------------------
define service{
        use                             generic-service
        host_name                       dns0
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
}

Rechercher des services en écoute sur UDP

Dans mon infra j’ai le DNS et le DHCP qui sont en écoute en UDP, pour les trouver nous allons utiliser les commandes lsof et regarder dans le fichier /etc/services

Par exemple sur le host qui fait tourner le DNS cela donne

$> lsof | grep UDP
named     32302 32308 isc-socke             bind  512u     IPv6   33757336        0t0        UDP *:domain

Pour trouver à quel port cela corresponds il faut chercher dans le fichier /etc/services

$> grep domain /etc/services
domain          53/tcp
domain          53/udp

sur celui qui fait tourner le DHCP voici le résultat :

$> lsof | grep UDP
dhcpd     16110                             root    8u     IPv4   26278430        0t0        UDP *:bootps

Pour trouver à quel port cela corresponds il faut chercher dans le fichier /etc/services

$> grep bootps /etc/services
bootps          67/udp

Rechercher des services en écoute sur TCP

Sur le host faisant tourner le serveur DNS voici ce que donne la recherche

$> lsof | grep LISTEN
nrpe        504                           nagios    4u     IPv4      11170        0t0        TCP *:nrpe (LISTEN)
exim4      5324                      Debian-exim    3u     IPv4   26304578        0t0        TCP localhost:smtp (LISTEN)
sshd       5627                             root    3u     IPv4   26303903        0t0        TCP *:ssh (LISTEN)
named     32302 32308 isc-socke             bind   21u     IPv6   33757337        0t0        TCP *:domain (LISTEN)
$> grep -E 'nrpe|smtp|ssh' /etc/services
ssh             22/tcp                          # SSH Remote Login Protocol
smtp            25/tcp          mail
[...]
nrpe            5666/tcp                        # Nagios Remote Plugin Executor

test du check_tcp, check_udp sur le serveur Nagios

Une fois touvé les process en écoute sur TCP ou UDP sur chaque host, il est conseillé de réaliser un test depuis le serveur nagios avant de programmer les regles de check dans nagios, cela va permettre de vérifier que le serveur nagios parvient bien a joindre les hosts sur les ports indiqués, et donc d’eliminer par exemple un firewall qui bloquerait le traffic.

Pour cela il suffit de se placer sur le serveur Nagios dans le répertoire /usr/local/nagios/libexec

Vérifications des services du host DNS0

sur DNS0 nous avons trouvé 3 service en écoute sur TCP, respectivement sur les ports 5666 22 et 53, voici comment les tester

$> ./check_tcp -H dns0.local.boxadmin.com -p 5666
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 5666|time=0.005706s;;;0.000000;10.000000

$> ./check_tcp -H dns0.local.boxadmin.com -p 22
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 22|time=0.005869s;;;0.000000;10.000000

$> ./check_tcp -H dns0.local.boxadmin.com -p 53
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 53|time=0.005847s;;;0.000000;10.000000

Vérifications des services du host DHCP0

sur DHCP0 nous avons trouvé 2 service en écoute sur TCP, respectivement sur les ports 5666 et 22, voici comment les tester

$> ./check_tcp -H dhcp0.local.boxadmin.com -p 22
TCP OK - 0.005 second response time on dhcp0.local.boxadmin.com port 22|time=0.005243s;;;0.000000;10.000000

$> ./check_tcp -H dhcp0.local.boxadmin.com -p 9666
connect to address dhcp0.local.boxadmin.com and port 9666: Connection refused

$> ./check_dhcp -s dhcp0.local.boxadmin.com
OK: Received 1 DHCPOFFER(s), 1 of 1 requested servers responded, max lease time = 600 sec.

mise en place des commandes de check des services pour chaque host dans le fichier ptro_infra.cfg

#------------------------------
# dns0.local.boxadmin.com
#------------------------------
define service{
        use                             generic-service
        host_name                       dns0
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
}

define service{
        use                             generic-service
        host_name                       dns0
        service_description             NRPE
        check_command                   check_tcp!5666
}

define service{
        use                             generic-service
        host_name                       dns0
        service_description             ssh
        check_command                   check_ssh
}

#------------------------------
# dhcp0.local.boxadmin.com
#------------------------------
define service{
        use                             generic-service
        host_name                       dhcp0
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
}

define service{
        use                             generic-service
        host_name                       dhcp0
        service_description             NRPE
        check_command                   check_tcp!5666
}

define service{
        use                             generic-service
        host_name                       dhcp0
        service_description             ssh
        check_command                   check_ssh
}

il faut continuer pour chaque host bien entendu.

Vérifications.

Relancer Nagios

$> systemctl restart nagios.service

Vérifier les logs

$> grep nagios /var/log/syslog
Jan  3 07:19:53 nagios nagios: Successfully launched command file worker with pid 5019
Jan  3 07:22:02 nagios nagios: job 0 (pid=5061): read() returned error 11
Jan  3 07:22:02 nagios nagios: wproc: Core Worker 5017: job 0 (pid=5061) timed out. Killing it
Jan  3 07:22:02 nagios nagios: wproc: CHECK job 0 from worker Core Worker 5017 timed out after 30.04s
Jan  3 07:22:02 nagios nagios: wproc:   host=gammu1; service=(null);
Jan  3 07:22:02 nagios nagios: wproc:   early_timeout=1; exited_ok=0; wait_status=0; error_code=62;
Jan  3 07:22:02 nagios nagios: Warning: Check of host 'gammu1' timed out after 30.04 seconds
Jan  3 07:22:02 nagios nagios: HOST ALERT: gammu1;DOWN;SOFT;1;(Host check timed out after 30.04 seconds)
Jan  3 07:22:03 nagios nagios: wproc: Core Worker 5017: job 0 (pid=5061): Dormant child reaped
Jan  3 07:23:32 nagios nagios: job 2 (pid=5099): read() returned error 11
Jan  3 07:23:32 nagios nagios: wproc: Core Worker 5013: job 2 (pid=5099) timed out. Killing it
Jan  3 07:23:32 nagios nagios: wproc: CHECK job 2 from worker Core Worker 5013 timed out after 30.02s
Jan  3 07:23:32 nagios nagios: wproc:   host=gammu1; service=(null);
Jan  3 07:23:32 nagios nagios: wproc:   early_timeout=1; exited_ok=0; wait_status=0; error_code=62;
Jan  3 07:23:32 nagios nagios: Warning: Check of host 'gammu1' timed out after 30.02 seconds
Jan  3 07:23:32 nagios nagios: HOST ALERT: gammu1;DOWN;SOFT;2;(Host check timed out after 30.02 seconds)
Jan  3 07:23:33 nagios nagios: wproc: Core Worker 5013: job 2 (pid=5099): Dormant child reaped
Jan  3 07:23:41 nagios nagios: SERVICE ALERT: mint;NRPE;CRITICAL;SOFT;1;connect to address mint.local.boxadmin.com and port 5666: Connection refused

En regardant dans les logs on voit la sortie des commandes de check, ici par exemple on constate que le host gammu1 est down, que le host ‘mint’ est up mais il ne parvient pas a vérifier l’état du port 5666

Connection et visualisation des hosts et des services

Pour se connecter sur son serveur nagios il faut aller depuis un navigateur sur http://nagios.local.boxadmin.com/nagios (remplacer nagios.local.boxadmin.com par le nom dns de son serveur nagios bien sur), ensuite il faut s’identifier, puis clicker sur Services a gauche afin de voir la liste des services, cela va demander un certain temps pour qu’ils passent en vert.

Configuration avancée par NRPE

Création de hosts_groups

Création de service_groups


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi