Fr En
[TIPS & TRICKS] Le filtrage granulaire des alertes

[TIPS & TRICKS] Le filtrage granulaire des alertes

Auteur : Virgile CABANE
Publié le : 19/10/2018 19 octobre Oct. 2018

Article mis à jour le : 06/11/2018

Nous vous proposons désormais une nouvelle catégorie d'article vous permettant d'approfondir certaines thématiques, et aujourd'hui nous commençons avec une fonctionnalité nouvellement développée : les alertes avancées !

La mise en place des règles d'alerte depuis un noeud fait gagner du temps, mais la rigidité de cette organisation hiérarchique force l'utilisateur à perpétuellement devoir faire le compromis entre sa topologie d'agent et de noeud, ainsi que les règles qui s'y appliquent. Par exemple, on souhaite être alerté quand l'antivirus Windows Defender n'est pas actif, en revanche lorsqu'un autre antivirus est en place, on désire ignorer ces alertes.
 

Mais alors, comment personnaliser les conditions de déclenchement d'une alerte ?

Grâce au filtrage avancé d'alerte !

Vous avez certainement remarqué l'ajout d'un nouveau bouton "Avancé" dans les alertes. C'est là que se cachent les filtres avancés d'alerte !

L'idée est d'offrir la possibilité de filtrer les objets suivants des règles que l'on peut définir à l'aide d'un langage simple à prendre en main.

Mais parlons un peu technique. Et oui, afin d'utiliser cette nouvelle fonctionnalité, il faut tout d'abord comprendre comment elle marche !

Qu'est-ce qu'un objet ?

Un objet chez RG System c'est l'élément le plus bas niveau du système d'alerte : le disque "C:", l'antivirus "BitDefender", une interface réseau etc.

Sur un agent, plusieurs plugins sont présents (exemple : Disque) et chacun de ces plugins peut être découpé en sous-éléments (exemple : C:, E:, disque réseau...) nommés objets.

Et ce langage ?

Le principal intérêt d'un filtre avancé d'alerte est d'être défini sur un noeud et d'utiliser cette option afin de filtrer les agents sur lesquels l'alerte va être appliquée.

Le langage mis en place se base sur l'expression language de symfony et peut nécessiter l'utilisation de regex. Pour ceux qui ne sont pas familiers avec ces notions nous vous conseillons de jeter un coup d'oeil à la documentation de l'expression language ainsi qu'à celle des regex.

Lors de la définition d'un filtre avancé d'alerte, certaines données sont accessibles comme les propriétés de l'agent actuellement analysé, l'objet, le pedigree de l'agent, les propriétés de l'alerte etc.

Vous trouverez ici une liste exhaustive de l'ensemble des variables disponibles pour créer vos filtres suivis d'un ensemble d'exemples de leur utilisation.

L'agent

Il est possible de filtrer les alertes à l'aide des caractéristiques suivantes de chaque agent :

  • ID > agent.agentId
  • Commentaire > agent.comment
  • Nom > agent.name
  • Type > agent.type
  • Type réel > agent.trueType

La définition de l'alerte

Dans le système d'alerte RG, la définition de l'alerte (ou alertUse) est l'élément regroupant les paramètres de déclenchement habituels des alertes.

  • Durée > alertUse.duration
  • Seuil > alertUse.threshold

L'objet

Comme indiqué précédemment l'objet est l'élément le plus bas niveau du système d'alerte RG.

  • Description > object.description
  • Nom > object.name

[Processus uniquement] Le processus

Lorsque vous configurez une alerte sur les processus, vous pouvez dorénavant filtrer sur le nom du processus qui déclenche l'alerte !

  • Nom > process.name

[Service uniquement] Le service

À l'instar des processus, vous pouvez maintenant filtrer sur le nom du service qui déclenche l'alerte !

  • Nom > service.name

Le pedigree

Certaines informations visibles depuis le pedigree d'un agent sont aussi accessibles lors de la création des filtres avancés d'alerte.

  • Informations du processeur > pedigree.get('CpuInfos')
  • Nom de la machine > pedigree.get('CSName')
  • Informations des disques > pedigree.get('DiskInfos')
  • Domaine réseau > pedigree.get('Domain')
  • Type de disque > pedigree.get('DriveType')
  • Numéro de série du matériel > pedigree.get('HardwareSerialNumber')
  • Date d'installation de l'OS > pedigree.get('InstallDate')
  • Date de dernier démarrage (UTC) > pedigree.get('LastBootTime')
  • Date de dernier démarrage (local à la machine) > pedigree.get('LastBootTimeOffsetApplied')
  • Fabricant > pedigree.get('Manufacturer')
  • Informations mémoire vive > pedigree.get('MemoryInfos')
  • Modèle du matériel > pedigree.get('Model')
  • Informations réseau > pedigree.get('NetworkInfos')
  • Nom du système d'exploitation > pedigree.get('OSName')
  • La machine fait-elle partie d'un domaine > pedigree.get('PartOfDomain')
  • Numéro de licence Windows > pedigree.get('SerialNumber')
  • Etat de la température de la machine > pedigree.get('ThermalState')

Comme vous l'aurez remarqué, les attributs du pedigree sont accedées via la fonction get(), ce qui s'explique par le fait que ces données sont des élements de type clé/valeur rassemblés sous la variable pedigree.

Les "jumeaux"

Comment procéder afin de vérifier certaines conditions sur les autres objets du même Plugin que celui analysé ? Par exemple comment m'assurer que l'agent actuellement analysé possède un autre antivirus avant d'évincer la génération d'alerte si Windows Defender n'est plus à jour ? La variable siblings est là pour ça, c'est un tableau qui contient l'ensemble des objets du même Plugin que l'objet analysé. Tout comme pedigreesiblings est une variable de type clé/valeur. Vous pourrez découvrir dans la section "Exemples" de ce post quelques cas d'utilisation de cette variable.

Le système clé/valeur

Le système clé valeur permet d'utiliser des fonctions sur un tableau, que ce soit un tableau de string indéxé par des string comme dans pedigree ou un tableau de tableaux comme siblings. Sur ces deux variables, il est possible d'utiliser les fonctions suivantes :

  • var.get(x) > permet de lire le tableau à l'index x
  • var.keys() retourne un nouvel élément clé/valeur constitué des clés de l'élément var
  • var.values() retourne un tableau (qui n'est plus de type clé/valeur) contenant les valeurs de var
  • var.in(x) retourne true si l'élément x est trouvé dans les valeurs de var
  • var.onMatches(x) retourne true si l'un des éléments de var respecte la regex x
  • var.allMatch(x) retourne true si tous les éléments de var respectent la regex x
  • var.column(x) retourne la colonne de var à l'index x en tant que clé/valeur
  • var.count() retourne le nombre d'éléments contenus dans var
  • var.filter(x) filtre var et retourne un nouveau clé/valeur issue contenant les éléments qui respectent la regex x

Exemples

[Disque] Ne pas alerter sur la taille des disques "Google File Stream" quand l'ordinateur a un processeur Intel

object.name != "Google File Stream" and pedigree.get("CpuInfos") matches "/Intel/"

[Antivirus] Ne pas alerter sur Windows Defender si un autre antivirus est installé

not(object.name == "Windows Defender" and siblings.count() > 0)

[Antivirus] Ne pas alerter sur Windows Defender si BitDefender est installé

not(object.name == "Windows Defender" and siblings.column("name").oneMatches("/bitdefender/i"))

[Antivirus] Ne pas alerter sur Windows Defender si BitDefender n'est pas installé

object.name != "Windows Defender" or (siblings.column("name").filter("/bitdefender/i").count() > 0)

[Service] Ne pas alerter sur les services qui contiennent Google Chome dans leur nom ou id

not (services.column("name").allMatch("/Google Chrome/")) or services.column(“serviceId”).allMatch(“/GoogleChrome/”)


Notes de modifications (date du 06/11/2018) :
- Faute de frappe (onMatches devient oneMatches)
- Erreur d’expression (object.name != "Google File Stream" and pedigree.get('CpuInfos') matches "*Intel*" devient object.name != "Google File Stream" and pedigree.get("CpuInfos") matches "/Intel/")
- Erreur d’expression (not(object.name == "Windows Defender" and siblings.column("name").matches("BitDefender")) devient not(object.name == "Windows Defender" and siblings.column("name").oneMatches("/bitdefender/i")))
- Erreur d’expression (object.name != "Windows Defender" or not siblings.column("name").filter("BitDefender").count() > 0 devient object.name != "Windows Defender" or (siblings.column("name").filter("/bitdefender/i").count() > 0))
- Erreur d’expression (not service.name matches "CDPUserSvc_*" devient not (services.column("name").allMatch("/CDPUserSvc_/")))

Notes de modifications (date du 07/03/2019) :

- Précision sur expression (not (services.column("name").allMatch("/CDPUserSvc_/")) devient not (services.column("name").allMatch("/Google Chrome/")) or services.column(“serviceId”).allMatch(“/GoogleChrome/”))

Historique

<< < ... 14 15 16 17 18 19 20 ... > >>