On se propose dans ce tutoriel de créer un module de supervision qui permettra de monitorer deux paramètres spécifiques à un fichier : sa taille et les droits qui lui sont appliqués.
Il faudra pouvoir configurer un ou plusieurs chemins d'accès au fichier au niveau du gabarit.
Le module devra permettre de remonter une alerte sur les deux paramètres remontés.
Etendre tout ce qui inclus de base dans SI Monitor (cpu, ram…) par des modules personnalisables.
Exemple : Supervision des backups (émettre une alerte si le statut d'un backup n'est pas bon)
Exemple : Emettre une alerte sur mot clé (dans un fichier de log)
Exemple : Taille d'un fichier : Emettre une alarme sur la taille normale est dépassée. Peut aussi vérifier les droits sur un fichier
Exemple : Détecter l'existence d'un fichier.
Exemple : Nombre de paquets bloqués sur un Firewall. Valeur que l'on peut tracer sur un graphe avec émission d'une alerte si valeur anormale
Exemple de détection d'attaque DDOS :
créer un script qui renvoie la valeur du nombre de paquets droppés sur une chaine IPTable (par ex) puis remettre le compteur à zéro (ex : toutes les minutes via un cron).
SI Monitor (via la création d'un module personnalisé), permet d'émettre une alerte si le nombre de paquets est anormalement élevé et de tracer un graphe.
etc…
La tache cron (ou planificateur Windows) appelle SI Monitor probe (l'indicateur). Cet indicateur va simultanément récupérer la sortie d'un script personnalisé (plugin Nagios, script client…script dans n'importe quel langage à partir du moment où la sortie est textuelle (chaine de caractères). L'indicateur fait son rapport au serveur Frontend qui se charge d'historiser, d'émettre une alarme le cas échéant et de tracer les graphes.
Lors de la création du module, un fichier XML décrivant le modèle du module a été créé. Il contient les informations suivantes :
<?xml version="1.0" encoding="utf-8"?> <module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60"> <singleparams/> <globalparams/> <reportvalues regex="/(.*)/i"/> <alarms/> </module>
<note tip> Cliquez sur “Editer le modèle” pour afficher la définition XML du module. </note>
Les attributs du noeud module sont :
Le nœud module peut contenir les fils suivants :
Nous allons placer dans singleparams un nœud param qui contiendra notre paramètre d'entrée à savoir le chemin du fichier. Le nœud singleparams contient des nœuds param. Les attributs possibles pour le nœud param sont :
Voici notre paramètre d'entrée :
<param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/>
Pour ce module, l'indicateur de supervision va faire un rapport contenant un certain nombre d'informations, dont un rapport textuel qu'il faudra savoir interpréter.
Ce rapport textuel va être lu par une expression régulière (attribut regex du nœud reportvalues), qui placera sa lecture dans différentes variables (décrites dans les nœuds reportvalue)
Nous savons que notre script remontera les données sous cette forme :
filepath:/var/log/syslog,filesize:141268368,filechmod:-rw-r-----
Nous devons récupérer dans trois variables différentes les valeurs :
Pour celan nous utiliserons la regex suivante :
/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i
Notre XML devrait donc ressembler à ceci :
<reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i"/>
Il y a trois parenthèses capturantes dans cette regex. Nous aurons donc trois paramètres à ajouter avec les nœuds reportvalue.
Les attributs possibles du nœud reportvalue sont :
Nous aurons donc ici :
<reportvalue index="0" name="filepath"/> <reportvalue index="1" name="filesize"/> <reportvalue index="2" name="filechmod"/>
A ce stade, notre fichier XML de définition du modèle ressemble donc à ceci :
<?xml version="1.0" encoding="utf-8"?> <module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60"> <singleparams> <param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/> </singleparams> <globalvalues/> <reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i"> <reportvalue index="0" name="filepath"/> <reportvalue index="1" name="filesize"/> <reportvalue index="2" name="filechmod"/> </reportvalues> <alarms/> </module>
Il ne nous reste plus qu'à définir quelles alarmes pourront être appliquées à notre module. Pour cela, nous utilisons évidemment le nœud alarms auquel nous allons ajouter des nœuds alarm.
Les alarmes du xml ne permettent pas de définir le seuil (alerte, erreur) mais les informations de bases (nom de l'alarme et opérateur). Pour configurer les seuils, il faut se référer à la personnalisation des seuils
Les attributs possibles pour le nœud alarm sont :
Nous proposons ici d'autoriser la création de deux types d'alarmes, la première sur le paramètre filesize
, et la deuxième sur le paramètre filechmod
:
<alarm authorizedparam="filesize" authorizedoperand="<|<=|==|!=|>=|>" defaultoperand=">"/> <alarm authorizedparam="filechmod" authorizedoperand="!=" defaultoperand="!="/>
<note tip>Remarquez au passage que nous avons dû échapper notre chaîne de caractères pour qu'elle soit compatible avec XML (le signe < est échappé en < et le signe > en >). Si nécessaire, le site http://www.freeformatter.com/xml-escape.html peut vous aider dans cette tâche.</note>
Nous avons terminé la définition de notre module. Le fichier XML devrait être le suivant :
<?xml version="1.0" encoding="utf-8"?> <module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60"> <singleparams> <param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/> </singleparams> <globalvalues/> <reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i"> <reportvalue index="0" name="filepath"/> <reportvalue index="1" name="filesize"/> <reportvalue index="2" name="filechmod"/> </reportvalues> <alarms> <alarm authorizedparam="filesize" authorizedoperand="<|<=|==|!=|>=|>" defaultoperand=">"/> <alarm authorizedparam="filechmod" authorizedoperand="!=" defaultoperand="!="/> </alarms> </module>
Maintenant que notre module est prêt, nous allons l'activer dans un gabarit.
Vous pouvez vérifier que votre configuration est active. Pour cela :
Vous devriez voir votre section comme ceci :
[plugin:mycheckfile] @interval=60 @plugin=mycheckfile @service=mycheckfile filepath0=/var/log/syslog filepath1=/var/log/messages
Pour cet exemple, nous utiliserons :
#!/usr/bin/python3 """ Les librairies nécessaires à l'exécution de notre script """ import os import stat import configparser import base64 """ Configparser nous permet de lire le fichier ini de l'indicateur simonitor """ config = configparser.ConfigParser() config.read('/etc/simonitor.ini') res = [] """ Pour chaque ligne commençant par filepath dans la section plugin:mycheckfile et si le fichier existe... """ for key in config['plugin:mycheckfile']: if key.count("filepath") > 0: path = config['plugin:mycheckfile'][key] if os.path.isfile(path): """ ... récupérer les infos filesize et permissions """ osfile = os.stat( path ) mode = stat.filemode( osfile.st_mode ) size = osfile.st_size """ Ajouter à la liste de résultats """ res.append( 'filepath:'+path+',filesize:'+str( size )+',filechmod:'+mode ) """ Séparer les lignes par un \n """ strres = "\n".join( res ) """ Afficher le résultat """ print( strres )
Voici la ligne cron que nous pourrions ajouter (fréquence d'exécution : 1 minute) :
* * * * * /opt/simonitor/simonitor-probe -x "mycheckfile=;d;`/usr/bin/python3 /opt/simonitor/mycheckfile.py`" >> /dev/null 2>&1
Au bout de quelques minutes, vous devriez voir apparaître des informations dans les logs :
Si vous rencontrez une erreur dans SI Monitor pensez à :
Les alarmes sont définies :
Il existe deux niveaux d'alarme :