NAGIOS – Supervision d’un serveur windows

Supervision d’un serveur Windows

Comme nous avons vu dans le chapitre précédent, Nagios peut utiliser le protocole SNMP pour contrôler un hôte Windows. Cette méthode qui est basée sur l’agent SNMP vous permet de vérifier l’état de plusieurs paramètres tel que la charge du système, le nombre de processus, le nombre d’utilisateurs connectés, etc. Toutefois, il y a d’autres paramètres que Nagios ne peut pas contrôler en utilisant SNMP ou en utilisant ses plugins génériques. Ces paramètres nécessitent parfois l’exécution de scripts sur la machine elle-même pour collecter les informations. Cette fonctionnalité est indisponible avec le protocole SNMP.

Nagios possède une alternative au protocole SNMP pour contrôler une machine Windows. Cette alternative consiste à installer un agent dédié pour les hôtes Windows qui est nommé NSClient++ (http://www.nsclient.org/).

1. Installation de NSClient++

NSClient++ est un démon de surveillance puissant, flexible et simple dédié pour contrôler les machines Windows de toutes les versions (2003, XP, Vista, Server 2008, Server 2012). Il a été construit pour être utilisé avec un outil de supervision comme Nagios mais il peut être utilisé aussi avec de nombreux autres scénarios où vous souhaitez recevoir des métriques de performance. Il est disponible avec les deux versions 64 bits et 32 bits et il offre plusieurs fonctionnalité essentiellement :

  • Le contrôle à distance

    NSClient permet à une machine de surveillance distante d’exécuter à la demande des commandes sur la machine contrôlée pour vérifier son état ou l’état de son service.

  • Le contrôle en temps réel

    NSClient permet de surveiller les systèmes et de soumettre les résultats de contrôles à un serveur de surveillance centrale.

  • La résolution des problèmes

    NSClient vous permet d’effectuer des actions à distance sur les hôtes en se basant sur des mesures de surveillance à partir d’un serveur central pour résoudre des problèmes.

NSClient++ est conçu pour être ouvert et extensible pour vous permettre de personnaliser sa configuration par rapport aux besoins. Il offre des contrôles intégrés pour des mesures basiques du système à savoir : utilisation de l’espace disque, utilisation de la mémoire, état des services, mais le pouvoir réel vient de plugins et de scripts externes. Ces scripts que vous écrivez avec votre langage préféré sont exécutés par NSClient++ et les résultats sont envoyés au serveur central de surveillance ou d’autres scripts pour prendre des mesures. Ceci est généralement le moyen le plus simple pour étendre NSClient++ que vous pouvez utiliser pour avoir des mesures avancées sur les hôtes. Aussi NSClient++ supporte plusieurs modes utilisés par les outils de supervision comme Nagios tel que nsclient (par défaut), NRPE et NSCA (Nagios Service Check Acceptor).

Cet agent possède un exécutable d’installation téléchargeable depuis le site officiel (https://www.nsclient.org/download/). Il s’installe par défaut dans le répertoire C:\Program Files\NSClient++.

images/07EP01.PNG

Cliquez sur le bouton Custom pour choisir les fonctionnalités à installer.

images/07EP02.PNG

Après avoir choisi les fonctionnalités à installer, cliquez sur Next pour passer à l’étape suivante.

images/07EP03.PNG

Cette étape consiste à faire une configuration initiale à l’agent NSClient++. Nous allons voir plus de détails sur cette configuration dans la partie suivante.

2. Configuration de NSClient++

Une fois l’installation terminée, NSClient++ possède une configuration par défaut sauvegardée dans le répertoire C:\Program Files\NSClient++. Ce répertoire contient un sous-répertoire de modules contenant les extensions de NSClient++ permettant d’améliorer ses fonctionnalités, un autre sous-répertoire scripts contenant des exemples des scripts VB (Visual Basic) et PowerShell, le fichier exécutable de service nscp.exe, le fichier des logs nsclient.log nous aide pour connaître et résoudre les erreurs et le fichier de configuration nsclient.ini.

Avant de démarrer le service nscp, vous devez configurer l’agent en éditant le fichier de configuration nsclient.ini. Le fichier de configuration est un fichier texte simple et constitué de plusieurs sections séparées par des commentaires. Une première section de configuration [/modules] dédiée à l’activation et désactivation de modules ou d’extensions de NSClient++. Voici la liste des noms de quelques modules disponibles:

  • FileLogger.dll

  • CheckSystem.dll

  • CheckDisk.dll

  • NSClientListener.dll

  • NRPEListener.dll

  • SysTray.dll

  • CheckEventLog.dll

  • CheckLogFile.dll

  • CheckNSCP.dll

  • CheckHelpers.dll

  • CheckWMI.dll

  • NSCAAgent.dll

  • SimpleCache.dll

  • CheckTaskSched.dll

  • CheckTaskSched2.dll

  • CheckWMI.dll

  • Scheduler.dll

  • PythonScript.dll

  • LUAScript.dll

  • CheckExternalScripts.dll

  • SimpleFileWriter.dll

  • SyslogClient.dll

  • SMTPClient.dll

Ensuite, il faut choisir les modules à activer et les ajouter à la section [/modules] comme l’exemple ci-dessous :

[/modules] 
CheckDisk = 1 
CheckEventLog = 1 
CheckExternalScripts = 1 
CheckSystem = 1 
CheckNSCP = 1 
NSClientServer = 1 
NRPEServer = 1 
CheckHelpers = 1
  • CheckDisk : ce module permet de contrôler les disques durs et les fichiers liés à ceci.

  • CheckEventLog : ce module permet de vérifier les erreurs et les avertissements dans le journal des événements.

  • CheckExternalScripts : ce module permet d’exécuter des scripts externes.

  • CheckSystem : ce module permet de contrôler des éléments liés au système, tels que la charge CPU, l’état du processus, utilisation de la mémoire, état du service et les compteurs PDH.

  • CheckNSCP : ce module est utilisé pour vérifier la santé et le statut de NSClient++ lui-même.

  • NSClientServer : ce module permet à l’agent de fonctionner avec le mode nsclient.

  • NRPEServer : ce module permet à l’agent de fonctionner avec le mode NRPE.

  • CheckHelpers : ce module offre diverses fonctions d’aide pour étendre d’autres contrôles. Ceci est également pris en charge uniquement par NRPE.

La deuxième section [/settings/default] contient les directives nécessaires pour autoriser les adresses IP des hôtes à interroger l’agent installé sur la machine cliente. Elle devrait ressembler à ceci :

[/settings/default] 
allowed_hosts=127.0.0.1/32,192.168.10.0/24,172.16.100.20 
password=password-nsclient

Deux directives sont utilisées :

  • allowed_hosts : cette directive contient la liste des hôtes ou sous-réseaux autorisés à se connecter sur la machine. La liste est séparée par des virgules.

  • password : cette directive représente un mot de passe qui devra être fourni à chaque interrogation distante de l’agent.

Et la dernière section [/settings/external scripts/alias] contient une liste d’alias. Un alias est une commande interne qui a été enveloppée pour utiliser des seuils bien définis ou pour passer des arguments. L’exemple ci-dessous propose deux manières pour contrôler le CPU d’une machine Windows :

[/settings/external scripts/alias] 
alias_cpu = checkCPU warn=80 crit=90 time=5m time=1m time=30s 
alias_cpu_ex = checkCPU warn=$ARG1$ crit=$ARG2$ time=5m time=1m time=30s
  • alias_cpu : cet alias permet de contrôler le CPU avec la commande checkCPU par rapport aux valeurs des seuils statiques (80 % pour le seuil d’avertissement et 90 % pour le seuil critique).

  • alias_cpu_ex : cet alias permet de contrôler le CPU avec la commande checkCPU par rapport aux valeurs des seuils passées en arguments.

D’autres sections peuvent être ajoutées au fichier de configuration suivant le mode de fonctionnement de NSClient++. Chaque mode possède sa propre configuration et ses directives. Commençons par le mode le plus simple NSClient. Ce mode utilise seulement les modules activés dans le fichier de configuration de l’agent pour contrôler l’hôte.

[NSClient] 
allowed_hosts= 
port=12489 
bind_to_address= 
socket_timeout=30  

Les directives utilisées dans la section [NSClient] sont :

  • allowed_hosts : cette directive joue le même rôle que celle trouvée dans la section [/settings/default]. Elle peut être laissée vide afin d’utiliser la liste définie dans la section [/settings/default] ou elle peut être utilisée pour ajouter de nouvelles adresses.

  • port : cette directive spécifie le port d’écoute entrant du mode nsclient. Par défaut, NSClient++ utilise le port 12489.

  • bind_to_address : cette directive permet de lier le serveur à une adresse locale ou interface réseau spécifique. Pour que l’agent écoute sur toutes les interfaces réseau de la machine, il faut laisser cette directive vide.

  • socket_timeout : cette directive spécifie la durée maximum autorisée pour une interrogation avant de terminer la connexion entre l’agent et l’hôte demandeur.

La section [NRPE] est dédiée au mode de fonctionnement NRPE. Par rapport au mode de fonctionnement précédent, ce mode a une double fonctionnalité : La première consiste à interroger l’hôte en utilisant les modules de NSClient++ alors que la deuxième permet d’utiliser des scripts avec différents langages comme Visual Basic, PowerShell, Perl ou DOS qui sont présents sur la machine et ne se limite pas aux interrogations prévues par l’agent NSClient++.

Ce mode permet en plus d’encrypter les données pendant le transport avec SSL, ce qui n’existe pas avec le mode nsclient.

Vous pouvez spécifier les hôtes autorisés à se connecter via NRPE, le numéro de port, et quelques autres options, telles que : use_sslallow_argumentsallow_nasty_meta_chars, etc.

[NRPE] 
port=5666 
command_timeout=60 
allow_arguments=1 
allow_nasty_meta_chars=0 
use_ssl=1 
bind_to_address= 
allowed_hosts= 
socket_timeout=30

Les directives utilisées dans la section [NRPE] sont :

  • port : cette directive spécifie le port d’écoute entrant du mode NRPE. Par défaut, NSClient++ utilise le port 5666.

  • command_timeout : cette directive permet de spécifier la limite du temps d’exécution d’une commande.

  • allow_arguments : cette directive permet d’activer ou désactiver l’utilisation des arguments avec les commandes.

  • allow_nasty_meta_chars : cette directive permet à NRPE d’exécuter les commandes externes qui ont des caractères meta “méchants”, tels que “>”, etc.

  • use_ssl : cette directive précise si SSL doit être utilisé ou pas.

  • bind_to_address : cette directive permet de lier le serveur à une adresse locale ou une interface réseau spécifique. Pour que l’agent écoute sur toutes les interfaces réseau de la machine, il faut laisser cette directive vide.

  • allowed_hosts : cette directive joue le même rôle que celle trouvée dans la section [/settings/default]. Elle peut être laissée vide afin d’utiliser la liste définie dans la section [/settings/default] ou elle peut être utilisée pour ajouter de nouvelles adresses.

  • socket_timeout : cette directive spécifie un intervalle de temps permis pour effectuer une interrogation avant de terminer la connexion entre l’agent et l’hôte demandeur.

Une dernière section [NSCA Agent] permet de paramétrer et configurer l’agent NSClient++ pour fonctionner en mode NSCA.  Le principe de fonctionnement de ce mode consiste à interroger localement l’hôte et de soumettre ses résultats à Nagios dans des périodes régulières via le protocole NSCA. Avec ce mode, on ne parle plus du contrôle actif mais plutôt du contrôle passif.

[NSCA Agent] 
interval=300 
encryption_method=1 
password= password-nsca 
hostname= serveur-windows 
nsca_host=192.168.10.6 
nsca_port=5667

Les directives utilisées dans la section [NSCA Agent] sont :

  • interval : cette directive spécifie la durée en secondes entre deux contrôles successifs sur l’hôte.

  • encryption_method : cette directive spécifie la méthode de cryptage qui doit être la même que la méthode de décryptage utilisée sur le serveur NSCA (Nagios).

  • password : cette directive spécifie le mot de passe à utiliser pour la communication entre l’agent et le serveur de supervision.

  • hostname : cette directive spécifie le nom d’hôte de la machine. Le nom de la machine sera utilisé par défaut si cette directive est laissée vide.

  • nsca_host : cette directive spécifie le serveur NSCA (Nagios) pour envoyer les résultats du rapport.

  • nsca_port : cette directive spécifie le port du serveur NSCA (Nagios). Le port 5667 est la valeur prise par défaut.

Ce qui suit est un exemple d’un fichier de configuration nsclient.ini qui charge tous les types de contrôles et modes de fonctionnement nsclient, NRPE et NSCA :

[/modules] 
CheckDisk = 1 
CheckEventLog = 1 
CheckExternalScripts = 1 
CheckSystem = 1 
CheckNSCP = 1 
NSClientServer = 1 
NRPEServer = 1 
CheckHelpers = 1 
 
[/settings/default] 
allowed_hosts=127.0.0.1/32,192.168.10.0/24,172.16.100.20 
password= password-nsclient 
 
[/NSClient] 
allowed_hosts= 
port=12489 
bind_to_address= 
socket_timeout=30   
 
[/NRPE] 
port=5666 
command_timeout=60 
allow_arguments=1 
allow_nasty_meta_chars=0 
use_ssl=1 
bind_to_address= 
allowed_hosts= 
socket_timeout=30 
 
[/NSCA Agent] 
interval=300 
encryption_method=1 
password= password-nsca 
hostname=serveur-windows 
nsca_host=192.168.10.6 
nsca_port=5667 
 
[/settings/external scripts/alias] 
alias_cpu = checkCPU warn=80 crit=90 time=5m time=1m time=30s 
alias_cpu_ex = checkCPU warn=$ARG1$ crit=$ARG2$ time=5m time=1m time=30s 
alias_disk = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED 
alias_disk_loose = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED
ignore-unreadable  
alias_mem = checkMem MaxWarn=80% MaxCrit=90% ShowAll=long type=physical 
type=virtual type=paged type=page  
alias_service = checkServiceState CheckAll  
alias_up = checkUpTime MinWarn=1d MinWarn=1h  
alias_process = checkProcState "$ARG1$=started"

À ce stade, le fichier de configuration ci-dessus est suffisamment renseigné pour faire fonctionner l’agent NSClient++. Passons maintenant à la configuration au serveur de supervision Nagios.

3. Configuration de Nagios pour surveiller une machine Windows

a. NSClient++ en mode nsclient

Nagios offre un plugin standard nommé check_nt pour interroger un agent NSCLient++ installé sur une machine qui fonctionne en mode nsclient. Ce plugin offre plusieurs fonctionnalités permettant de superviser un hôte Windows d’une façon complète.

La syntaxe de ce plugin est la suivante :

check_nt -H host -v variable [-p port]  
         [-w warning] [-c critical]  
         [-l params] [-d SHOWALL] [-u] [-t timeout]

Les options utilisées par ce plugin sont :

  • -H, –hostname : le nom du domaine ou l’adresse IP de l’hôte à vérifier.

  • -p, –port : le numéro de port à utiliser pour communiquer avec l’agent NSClient++. Le port doit être identique à celui spécifié dans la configuration de l’agent. Le port par défaut est 12489.

  • -s, –secret : le mot de passe requis à la connexion. Il doit être identique à celui spécifié dans la configuration de l’agent NSClient++.

  • -w, –warning : le dépassement de la valeur spécifiée dans ce paramètre produit un état d’avertissement.

  • -c, –critical : le dépassement de la valeur spécifiée dans ce paramètre produit un état critique.

  • -t, –timeout : la durée en seconde avant de terminer la connexion.

  • -l, –params : cette option permet de passer des paramètres au contrôle spécifié.

  • -d, –display : les options d’affichage. Actuellement il y a seulement l’option SHOWALL qui fonctionne.

  • -v, –variable : variable pour vérifier. Les variables possibles sont les suivantes :

  • CLIENTVERSION : cette variable est utilisée pour vérifier la version de l’agent NSClient installé sur la machine. Un état d’avertissement sera renvoyé si cette valeur diffère de celle précisée avec l’option -l <version>.

  • CPULOAD : cette variable est utilisée pour retourner la charge moyenne du système durant une période de temps exprimée en minute. Il nécessite le paramètre -l avec la syntaxe suivante : -l <intervalle minutes><seuil d’avertissement>,<seuil critique>.

  • UPTIME : c’est la durée écoulée depuis le dernier démarrage de l’hôte

  • USEDDISKSPACE : cette variable est utilisée pour retourner la taille totale et le pourcentage de disque dur utilisé. Il nécessite le paramètre -l contenant le nom du disque à interroger, par exemple : -l C.

  • MEMUSE : cette variable est utilisée pour retourner la mémoire utilisée.

  • SERVICESTATE : cette variable permet de vérifier sur la machine contrôlée l’état des services (démarré ou arrêté) dont leurs noms sont définis avec le paramètre -l, par exemple : -l <service1>,<service2>,<service3>.

  • PROCSTATE : cette variable permet de vérifier sur la machine contrôlée l’état d’un ou plusieurs processus dont leurs noms sont définis avec le paramètre -l, par exemple : -l <proc1>,<proc2>,<proc3>.

Plusieurs contrôles peuvent être lancés en utilisant ce plugin, à savoir :

  • Contrôle de l’espace disque restant sur C :

./check_nt -H 192.168.20.11 -p 12489 -s password-nsclient -v USEDDISKSPACE 
-l C -w 15-c 10  
 
C:\ - total: 9,99 Gb - used: 1,81 Gb (18%) - free 8,17 Gb (82%) | ’C:\ Used 
Space’=1,81Gb;0,00;0,00;0.00;9,99
  • Contrôle de la mémoire utilisée :

./check_nt -H 192.168.20.11 -p 12489 -s password-nsclient -v MEMUSE -w 10 -c 5  
 
Memory usage: total:922,18 Mb - used: 100,87 Mb (11%) - free: 821,31 Mb (89%) | ’Memory
usage’=100,87Mb;92,22;46,11;0.00;922,18
  • Contrôle de la charge moyenne du système sur ces trois périodes la dernière minute, les 5 et les 15 dernières minutes et les compare par rapport aux deux seuils 80 (avertissement) et 90 (critique) :

./check_nt -H 192.168.20.11 -p 12489 -s password-nsclient -v CPULOAD  -l 
1,80,90,5,80,90,15,80,90 
CPU Load 10% (1 min average) 15% (5 min average) 20% (15 min average) | ’1 min avg 
Load’=10%;80,90;0;100 ’5 min avg Load’=15%;80,90;0;100 ’15 min avg 
Load’=20%;80,90;0;100
  • Contrôle de la durée écoulée depuis le dernier démarrage de la machine :

./check_nt -H 192.168.20.11 -p 12489 -s password-nsclient -v UPTIME 
System Uptime - 0 day(s) 3 hour(s) 14 minute(s)
  • Contrôle de l’état d’un service. Dans cet exemple, nous allons vérifier l’état de service nscp :

 ./check_nt -H 192.168.20.11 -p 12489 -s password-nsclient -v SERVICESTATE -d 
SHOWALL -l nscp 
 
nscp: Started
  • Contrôle de l’état d’un processus. Dans cet exemple, nous allons vérifier l’état de processus nscp :

./check_nt -H 192.168.20.11  -p 12489 -s password-nsclient -v PROCSTATE  -d 
SHOWALL -l nscp 
 
nscp: Running

Nous allons maintenant transformer ces appels à des services Nagios dont chacun permet de contrôler un élément sur un hôte Windows. Nous allons définir deux commandes génériques : une qui utilise l’option -d SHOWALL permettant de vérifier l’état des services et processus et l’autre qui utilise des arguments pour passer des seuils permettant de contrôler les ressources système habituelles d’une machine Windows.

define command{ 
    command_name            check_nt_service  
    command_line            $USER1$/check_nt -H $HOSTADDRESS$ -s $ARG1$ 
-p $ARG2$ -v $ARG3$ -l $ARG4$ -d SHOWALL 
}
define command{ 
    command_name            check_nt_system  
    command_line            $USER1$/check_nt -H $HOSTADDRESS$ -s $ARG1$ 
-p $ARG2$ -v $ARG3$ -l $ARG4$ -w $ARG5$   -c $ARG6$      
}

Voici les définitions de deux services correspondant à ces deux commandes :

define service{ 
    use                      generic-service 
    host_name                serveur-windows 
    service_description      Espace Disque C  
    check_command            check_nt_system!password-nsclient!12489! 
 USEDDISKSPACE!C!15 !10! 
}
define service{ 
    use                   generic-service 
    host_name             serveur-windows 
    service_description   Service NSClient  
    check_command         check_nt_service!password-nsclient!12489! 
 SERVICESTATE!nscp! 
}

b. NSClient++ en mode NRPE

Une autre méthode pour contrôler un serveur Windows avec Nagios est d’utiliser l’agent NSClient++ en mode NRPE.

Nous allons maintenant refaire le travail vu avec le mode nsclient mais cette fois-ci en mode NRPE. À titre de rappel, NRPE utilise le plugin check_nrpe pour lancer les commandes de contrôle à distance. Par exemple, pour obtenir le pourcentage d’utilisation du CPU, il faut lancer la requête suivante :

./check_nrpe -h 192.168.20.11 -c check_cpu 
 
OK CPU Load ok.|’5m’=65;70;90; ’1m’=60;70;90; ’30s’=60;70;90;

192.168.20.11 est l’adresse IP de l’hôte distant sur lequel un contrôle devrait être effectué en utilisant l’agent NSClient++.

Il est possible aussi d’ajouter des arguments à la commande à condition que l’option allow_arguments soit activée dans le fichier nsclient.ini.

./check_nrpe -h 192.168.20.11 -c check_cpu -a warn=80 crit=90 time=5m time=1m time=30s 
 
OK CPU Load ok.|’5m’=65;80;90; ’1m’=60;80;90; ’30s’=60;80;90;

Contrôle de l’espace libre sur le disque dur :

./check_nrpe -H 192.168.20.11 -c alias_disk 
 
OK: All drives within bounds.|’C:\’=82%;10;5;

Contrôle de la mémoire :

./check_nrpe -H 192.168.20.11 -c alias_mem 
 
OK: physical memory: 155M|’physical memory’=30%;80;90;

Contrôle de l’état des services :

./check_nrpe -H 192.168.20.11 -c alias_service 
 
OK: All services are running.

Voici un exemple de commande Nagios générique qui utilise le plugin check_nrpe pour contrôler une machine Windows.

define command{ 
    command_name          check_nrpe_windows 
    command_line          $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ 
}

Cette commande nous permet de définir plusieurs services tels que :

define service{ 
    use                         generic-service 
    host_name                   serveur-windows 
    service_description         CPU Load 
    check_command               check_nrpe_windows!check_cpu! 
}
 define service{ 
    use                         generic-service 
    host_name                   serveur-windows 
    service_description         Memoire Utilise 
    check_command               check_nrpe_windows!alias_mem! 
} 

c. NSClient++ en mode NSCA

Afin que Nagios accepte les informations reçues de la machine Windows en utilisant l’agent NSClient++ en mode NSCA, nous avons besoin de créer un service où le contrôle passif est activé et le contrôle actif est désactivé. Ce qui suit est un exemple d’un service qui ne permet que de recevoir les contrôles passifs :

define service{ 
   use                         generic-service 
   host_name                   serveur-windows 
   service_description         alias_cpu 
   active_checks_enabled       0 
   passive_checks_enabled      1 
   check_command check_dummy!0!No messages in last 6 hours 
}

La description de ce service contient le nom de la commande défini dans la configuration de l’agent.

L’hôte Windows peut être supervisé par plusieurs méthodes. Le mode de configuration de chaque méthode pour le système Nagios et l’agent NSClient++ dépend des besoins de l’utilisateur. Au-delà de la diversité de ces méthodes, le but principal reste toujours l’acquisition des services plus lisibles favorisant le contrôle de la machine.