Le pack "Windows", permet de superviser des hôtes sur lesquels est installé le système d'exploitation Windows ( serveur ou client ).
Il contient :
Les commandes du modèle Windows de notre pack se basent sur le script perl check_wmi_plus.pl présent dans le répertoire des scripts shinken /var/lib/shinken/libexec ( ou $PLUGINSDIR$ depuis l'Interface de Configuration ).
WMI ( Windows Management Instrumentation ) est un système de gestion interne de Windows qui prend en charge la surveillance et le contrôle de ressources systèmes via un ensemble d’interfaces. Le script perl permet d'interroger ces interfaces via un nom d'utilisateur et un mot de passe. Si l'utilisateur a les droits suffisants, alors le système d'exploitation Windows retournera l'information demandée.
Il utilise le modèle "windows-base" ( voir la page Pack Windows-Base ) pour obtenir les quatre données nécessaires pour la connexion à la machine Windows.
Ce modèle contient des données ( locales ) qui seront utilisés par ses checks. Ces données seront utilisées par ses checks et leurs commandes en définissant $_HOST suivi du nom de la donnée.
Exemple : $_HOSTWINDOWS_ALL_CPU_CRIT$ utilisera la donnée nommée WINDOWS_ALL_CPU_CRIT ( qu'elle soit locale ou héritée d'un modèle ). |
Si vous souhaitez modifier de manière globale ces données, ou en rajouter, faîtes le directement sur le modèle "windows".
|
| Donnée | Valeur par défaut | Description |
|---|---|---|
DOMAINUSERSHORT | Nom d'utilisateur utilisé, sans le domaine | |
DOMAINPASSWORD | Mot de passe de l'utilisateur | |
DOMAIN | Nom du domaine Active Directory du compte. Si vide, alors c'est le domaine du serveur qui sera utilisé, ou un compte local s'il n'est pas dans un domaine Active Directory. | |
DOMAINUSER | Nom complet utilisé pour se connecter, il faut par défaut DOMAINE\DOMAINUSERSHORT.
| |
WINDOWS_SECURITY_MECANISMS | integrity | Niveau de sécurité utilisé pour se connecter sur le serveur Windows :
|
Le service WMI est installé et démarré par défaut sur les systèmes d'exploitations Windows.
Vous pouvez aller vérifier si ce service est bien démarré en vous rendant dans le gestionnaire de service Windows :
|
Si vous utilisez des firewall :
Comme on l'a vu précédemment, les commandes WMI requièrent une authentification au préalable afin de récupérer des informations de supervision sur l'hôte Windows. ( -u "$_HOSTDOMAINUSER$" -p "$_HOSTDOMAINPASSWORD$" )
L'utilisation du compte d'administrateur du poste Windows permet facilement d'obtenir ces informations avec succès, car ce compte à tous les droits d'accès ( WMI, DCOM, etc. ).
Cependant, pour des raisons de sécurité, il se peut que vous préfériez utiliser un compte avec des droits plus restreints.
Voici donc la procédure à suivre pour rajouter des droits à un utilisateur basique qui vous servira à récupérer les informations WMI souhaitées.
Une fois que vous avez créé votre utilisateur sur le poste client ou sur votre domaine, ouvrez la console de "gestion de l'ordinateur" ( compmgmt.msc ) sur le poste à superviser, et rajoutez à l'utilisateur les droits suivants : Utilisateurs du modèle COM distribué ( Distributed COM Users ) et Utilisateurs de l'Analyseur de performance ( Performance Monitor Users ) :
|
Il faut à présent rajouter les droits sur le contrôle WMI, pour cela, depuis la console de "gestion de l'ordinateur" :
Veuillez ouvrir la console des services ( services.msc ) et redémarrez le service gérant la partie WMI : "Infrastructure de gestion Windows".
Votre check ( via l'utilisateur spécifique passé en paramètre ) doit maintenant pouvoir passer une requête WMI à cet ordinateur depuis votre commande Shinken.
Sur les neuf, un seul check peut poser un problème, c'est la requête qui interroge les services Windows via le check "Services". Ce check va vous renvoyer une erreur :
UNKNOWN - The WMI query had problems. The error text from wmic is: [wmi/wmic.c:212:main()] ERROR: Retrieve result data. NTSTATUS: NT code 0x80041003 - NT code 0x80041003 |
Voyons comment résoudre ce problème dans la prochaine section.
|
Ce paragraphe aborde les problèmes liés au check "Services" du pack Windows lorsqu'un utilisateur non administrateur est utilisé. Veuillez vous référer au paragraphe précédent la mise en place d'un tel utilisateur sur Windows.
Ce check supervise l'état de tous les services configurés pour un démarrage automatique et bascule en état CRITIQUE si l'un de ces services n'est pas en cours d'exécution en raison d'une pause ou d'un arrêt.
Cependant, pour des raisons de sécurité, Windows restreint les droits d'interrogation de l'état des services pour les utilisateurs qui ne sont pas administrateurs. Initialement votre utilisateur ne devrait pas pouvoir questionner le statut des services.
Par conséquent, dans cette configuration, l'éventail des services supervisés par ce contrôle est limitée et incomplète.
Les étapes suivantes permettent de completer le nombre de services supervisés pour un utilisateur non administrateur.
L'ensemble des étapes suivantes nécessite d'utiliser l'interpreteur Powershell comme administrateur
Lancer l'interpréteur de commande comme administrateur :
Le SID ( identifiant de sécurité ) d'un utilisateur est l'identifiant utilisé par Windows pour la gestion des autorisation. Les commandes suivantes permettent de retrouver le SID de l'utilisateur auquel vous souhaitez rajouter le privilège d'interroger les services. Initialement un utilisateur non administrateur ne dispose pas des droits pour questionner les statuts des services, ni les démarrer, stopper ou mettre en pause.
Lister les utilisateurs :
Get-LocalUser |
Exemple :
PS C:\WINDOWS\system32> Get-LocalUser Name Enabled Description ---- ------- ----------- Administrateur False Compte d’utilisateur d’administration b.martin True DefaultAccount False Compte utilisateur géré par le système. Invité False Compte d’utilisateur invité support True WDAGUtilityAccount False Compte d’utilisateur géré et utilisé par le système pour les scénarios Windows Defender Application Guard. |
Déterminer le SID ( identifiant de sécurité ) de l'utilisateur auquel ajouter les autorisations : Le SID est nécessaire dans la gestion des autorisations des services.
Get-LocalUser -Name "nom de l'utilisateur" | Select sid |
Exemple :
PS C:\WINDOWS\system32> Get-LocalUser -Name 'b.martin' | Select sid SID --- S-1-5-21-2162771329-948085556-1632624503-1001 |
Le service SCManager est un composant du système d'exploitation, Windows qui est responsable de la gestion des services. Il est chargé de créer, supprimer et contrôler les services présents sur un ordinateur exécutant Windows. Ce service permet d'interroger l'état des autres services sur la machine. Toutefois il faut noter que pour des sécurité, Windows limite la sortie de ce service pour un utilisateur non administrateur et il faudra par la suite ajouter à la main les services exclus.
Lister les autorisation du service scmanager :
sc.exe sdshow scmanager |
La sortie de cette commande liste les autorisations accordées aux utilisateurs du service scmanager.
Exemple :
PS C:\Users\Administrator> sc.exe sdshow scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CCLCRPRC;;;LA)(A;;CCLCRPRC;;;LA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD) |
Voir le paragraphe Interpréter le Security Descriptor Definition Language (SDDL) si vous souhaitez comprendre la sortie de la commande.
Accorder les permissions à votre utilisateur:
En utilisant l'invite commande :
Pour rappel le format d'une autorisation est le suivant : (A;;Pairs d'autorisation;;; SID)
|
sc.exe sdset scmanager "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CCLCRPRC;;;S-1-5-21-214A909598-1293495619-13Z157935-75714)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" |
Si vous pensez avoir fait une erreur il vous suffit de d'appliquer la commande avec l'état inital des autorisations pour annuler les modifications que vous auriez pu faire.
A la fin de cette étape, la supervision des services réalisées par votre check n'est pas exhaustive. Les étapes suivantes vous permettront de determiner les services non pris en compte par le check et de les superviser.
Lister les services en démarrage automatique de votre machine Windows :
Get-Service | Where-Object { $_.StartType -eq 'Automatic' } |
Exemple:
PS C:\Windows\system32> Get-Service | Where-Object { $_.StartType -eq 'Automatic' }
Status Name DisplayName
------ ---- -----------
Running ApHidMonitorSer... AlpsAlpine HID Monitor Service
Running AudioEndpointBu... Générateur de points de terminaison...
Running Audiosrv Audio Windows
Running AVP21.9 Kaspersky Small Office Security Ser...
Running BFE Moteur de filtrage de base
Running BITS Service de transfert intelligent en...
Running BrokerInfrastru... Service d’infrastructure des tâches...
Running CDPSvc Service de plateforme des appareils...
Running CDPUserSvc_27ed576 Service pour utilisateur de platefo...
Running CoreMessagingRe... CoreMessaging
Running cplspcon Intel(R) Content Protection HDCP Se...
... |
Lister les services superviser par votre check :
Depuis une machine où vous avez installé Shinken lancer la commande suivante
/var/lib/shinken/libexec/wmic -U [domain/]adminuser%password //host "select Caption, Name from Win32_Service where StartMode='Auto'" |
Exemple
/var/lib/shinken/libexec/wmic -U 'SHINKEN\nonAdminUser%nonAdminUser' //integrationwin-1 "select Caption, Name from Win32_Service where StartMode='Auto'" [librpc/rpc/dcerpc_connect.c:329:dcerpc_pipe_connect_ncacn_ip_tcp_recv()] failed NT status (c00000b5) in dcerpc_pipe_connect_ncacn_ip_tcp_recv [librpc/rpc/dcerpc_connect.c:790:dcerpc_pipe_connect_b_recv()] failed NT status (c00000b5) in dcerpc_pipe_connect_b_recv CLASS: Win32_Service Caption|Name Active Directory Web Services|ADWS Background Tasks Infrastructure Service|BrokerInfrastructure DCOM Server Process Launcher|DcomLaunch DFS Namespace|Dfs DHCP Client|Dhcp DNS Client|Dnscache Windows Event Log|EventLog Kerberos Key Distribution Center|Kdc |
Les services retournés par la première commande et pas par la seconde sont les services exclus par défaut par Windows. Il faut donc rajouter les autorisations de les interroger à chacun.
Lister les autorisations d'un service :
sc.exe sdshow 'nom du service' |
Exemple:
PS C:\WINDOWS\system32> sc.exe sdshow 'AJRouter' D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD) |
La commande précédente affiche le descripteur de sécurité d'un service en utilisant le Security Descriptor Definition Language (SDDL)
Interpréter le résultat de la commande :
Il y a deux sections :
Le résultat de la section DACL est écrit selon langage de définition de descripteur de sécurité ( SDDL ), qui décrit un descripteur de sécurité en tant que chaîne de texte.
A;;CCLCSWRPWPDTLOCRRC;;;SY |
Le premier caractère est soit :
Les caractères du milieu se lisent par paire et correspondent à l'ensemble des permissions selon la relation suivante :
Les deux derniers caractères précise pour quel groupe ou utilisateur la section s'applique selon la relation suivante :
|
Exemple : Lister les permissions de scmanager
sc.exe sdshow scmanager |
Accorder des permissions à utilisateur ou un groupe sur un service :
En utilisant l'invite commande :
Pour rappel le format d'une autorisation est le suivant : (A;;Pairs d'autorisation;;; SID)
|
sc.exe sdset 'nom du service' "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CCLCRPRC;;;S-1-5-21-214A909598-1293495619-13Z157935-75714)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" |
Retirer des permissions à utilisateur ou un groupe sur un service :
Reprendre les étapes de la partie précédente et retirer les permissions.
sc.exe sdset 'nom du service' "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" |
Exemples d'utilisation :
Get-LocalUser -Name 'utilisateur' | Select sid sc.exe sdshow scmanager sc.exe sdset scmanager "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CCLCRPRC;;;'SID')S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" |
Get-LocalUser -Name 'utilisateur' | Select sid sc.exe sdshow 'nom du service' sc.exe sdset 'nom du service' "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;RPWPDTLO;;;'SID')S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" |
Contrairement à l'utilisation du compte administrateur pour la vérification des services ( qui permet une vue exhaustive et totale ), rajouter uniquement le droit d'énumerer les services pour un utilisateur ne permet pas de lister et vérifier tous les services. Dans ce cas, il est nécessaire d'ajouter individuellement des droits pour interroger les services qui ne sont pas pris en compte.
Si vous utiliser un compte autre qu'un compte administrateur il faut procéder en deux étapes :
La commande du pack Windows check_windows_auto_services retournera alors l'état des services ( en démarrage "automatique" ) pour un certain nombre de services Windows, ainsi que pour ceux sur lesquels vous avez rajouté les droits manuellement.
Après avoir mis en place le modèle dans Shinken et donné les bons droits à l'utilisateur Windows utilisé par le check, il se peut que les données de performances remontées par les checks ne puissent pas être remontées.
Il est possible dans ce cas que les valeurs de la bibliothèque du compteur de performances Windows soit corrompu ou contienne des valeurs incorrectes.
Dans ce cas, les checks Windows peuvent retourner les erreurs suivantes :
UNKNOWN - The WMI query had problems. The error text from wmic is: [wmi/wmic.c:212:main()] ERROR: Retrieve result data. NTSTATUS: NT code 0x80041017 - NT code 0x80041017 |
UNKNOWN - The WMI query had problems. The plugin is having trouble finding the required WMI Classes on the target host (172.16.0.132). There can be multiple reasons for this (please go through them and check) including permissions problems (try using an admin login) or software that creates the class is not installed (eg if you are trying to checkiis but IIS is not installed). It can also happen if your version of Windows does not support this check (this might be because the WMI fields are named differently in different Windows versions). Sometimes, some systems 'lose' WMI Classes and you might need to rebuild your WMI repository. Sometimes the WMI service is not running, other times a reboot can fix it. Other causes include mistyping the WMI namesspace/class/fieldnames. There may be other causes as well. You can use wmic from the command line to troubleshoot. Wmic error text on the next line. [wmi/wmic.c:212:main()] ERROR: Retrieve result data. NTSTATUS: NT code 0x80041010 - NT code 0x80041010 |
Il est possible de recréer manuellement les valeurs de la bibliothèque du compteur de Performance avec la commande suivante :
lodctr /r |
Plus d'informations sur la commande et ses possibilités peuvent être trouvées sur la page de documentation dédiée : https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/lodctr
Si un script retourne l'erreur :
Error: Can't locate perl58.dll" ou "Error: Can't locate perlXX.dll |
Il faut installer/réinstaller ActivePerl ( voir la page https://www.activestate.com/products/perl/ )
Si le script retourne l'erreur suivante :
UNKNOWN - The WMI query had problems. The error text from wmic is: [wmi/wmic.c:196:main()] ERROR: Login to remote object. NTSTATUS: NT code 0x80010111 - NT code 0x80010111 |
C'est une erreur dû à l'élévation de sécurité imposée sur les dernières mises à jour de Windows.