4 SNMP trap

Aperçu

La réception des traps SNMP est l’inverse de l’interrogation des appareils compatibles SNMP.

Dans ce cas, l’information est envoyée depuis un appareil compatible SNMP vers snmptrapd et est collectée ou "trapée" par le serveur Zabbix ou le proxy Zabbix à partir d’un fichier.

En général, les traps sont envoyés lors d’un changement d’état, et l’agent se connecte au serveur sur le port 162 (par opposition au port 161 côté agent, utilisé pour les requêtes). L’utilisation des traps peut permettre de détecter certains problèmes brefs qui surviennent entre deux intervalles de requête et qui pourraient être manqués par les données de requête.

La réception des traps SNMP dans Zabbix est conçue pour fonctionner avec snmptrapd et l’un des mécanismes de transmission des traps vers Zabbix - soit un script Bash ou Perl, soit SNMPTT.

La manière la plus simple de configurer la surveillance des traps après avoir configuré Zabbix consiste à utiliser la solution par script Bash, car Perl et SNMPTT sont souvent absents des distributions modernes et nécessitent une configuration plus complexe. Cependant, cette solution utilise un script configuré comme traphandle. Pour de meilleures performances sur les systèmes de production, utilisez la solution Perl intégrée (soit un script avec l’option do perl, soit SNMPTT).

Le flux de traitement de la réception d’un trap :

  1. snmptrapd reçoit un trap.
  2. snmptrapd transmet le trap au script récepteur (Bash, Perl) ou à SNMPTT.
  3. Le récepteur analyse, met en forme et écrit le trap dans un fichier.
  4. Le collecteur de traps SNMP de Zabbix lit et analyse le fichier de traps.
  5. Pour chaque trap, Zabbix trouve tous les éléments de collecteur de traps SNMP dont les interfaces d’hôte correspondent à l’adresse du trap reçu. Notez que seul le IP ou le DNS sélectionné dans l’interface d’hôte est utilisé lors de la correspondance.
  6. Pour chaque élément trouvé, le trap est comparé à l’expression régulière dans snmptrap[regexp]. Le trap est défini comme valeur de tous les éléments correspondants. Si aucun élément correspondant n’est trouvé et qu’il existe un élément snmptrap.fallback, le trap est défini comme valeur de celui-ci.
  7. Si le trap n’a été défini comme valeur d’aucun élément, Zabbix consigne par défaut le trap non apparié. (Cela est configuré par Consigner les traps SNMP non appariés dans Administration > Général > Autre.)
Remarques sur le basculement HA

Lors du basculement d’un nœud de haute disponibilité (HA), Zabbix continuera le traitement après le dernier enregistrement dans le dernier horodatage ISO 8601 ; si le même enregistrement n’est pas trouvé, seul l’horodatage sera utilisé pour identifier la dernière position.

Configuration des traps SNMP

Ce type d'élément nécessite la configuration d'interface suivante :

Étape 1: Créer une interface SNMP pour l'hôte
  1. Dans Collecte de données > Hôtes, créez un hôte ou modifiez celui qui existe déjà.
  2. Dans le champ Interfaces, sélectionnez le type d'interface SNMP.
  3. Saisissez l'adresse IP/le nom DNS et le numéro de port.
  4. Sélectionnez la version SNMP dans la liste déroulante : (SNMPv1, SNMPv2, ou SNMPv3) et ajoutez les informations d'identification de l'interface en fonction de la version SNMP sélectionnée.

L'adresse de chaque trap reçu sera comparée aux adresses IP et DNS de toutes les interfaces SNMP afin de trouver les hôtes correspondants.

Étape 2: Configurer l'élément
  1. Pour l'hôte, créez un élément ou modifiez celui qui existe déjà.
  2. Dans le champ Key, utilisez l'une des clés de trap SNMP :

    • snmptrap[regexp] - capture tous les traps SNMP qui correspondent à l'expression régulière spécifiée dans le paramètre regexp ; si regexp n'est pas spécifié, capture n'importe quel trap.
      Les macros utilisateur et les expressions régulières globales sont prises en charge dans le paramètre.
      Valeur de retour: trap SNMP.
      Cet élément peut être défini uniquement pour les interfaces SNMP.
    • snmptrap.fallback - capture tous les traps SNMP qui n'ont été capturés par aucun des éléments snmptrap[] pour cette interface.
      Valeur de retour: trap SNMP.
      Cet élément peut être défini uniquement pour les interfaces SNMP.

La correspondance d'expressions régulières multilignes n'est pas prise en charge pour le moment.

  1. Définissez Type d'information sur Log afin que les horodatages soient analysés. D'autres formats, tels que Numérique, sont également acceptables, mais peuvent nécessiter un gestionnaire de traps personnalisé.

- Configuration de la supervision des traps SNMP

Configuration du serveur/proxy Zabbix

Pour lire les traps, le serveur ou le proxy Zabbix doit être configuré pour démarrer le processus SNMP trapper et pointer vers le fichier de traps qui est écrit par SNMPTT ou par un récepteur de traps Bash/Perl. Pour cela, modifiez le fichier de configuration (zabbix\_server.conf ou zabbix\_proxy.conf) :

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Si le paramètre systemd PrivateTmp est utilisé, il est peu probable que ce fichier fonctionne dans /tmp.

Configuration du récepteur de traps Bash

Exigences : uniquement snmptrapd.

Un script de récepteur de traps Bash script peut être utilisé pour transmettre les traps au serveur Zabbix depuis snmptrapd à l'aide du fichier trapper. Pour le configurer, ajoutez l'option traphandle au fichier de configuration de snmptrapd (snmptrapd.conf), voir l'exemple.

Il peut être nécessaire de redémarrer snmptrapd pour prendre en compte les modifications de sa configuration.

Configuration du récepteur de traps Perl

Exigences: Perl, Net-SNMP compilé avec --enable-embedded-perl (fait par défaut depuis Net-SNMP 5.4)

Un récepteur de traps Perl (voir misc/snmptrap/zabbix\_trap\_receiver.pl) peut être utilisé pour transmettre les traps au serveur Zabbix directement depuis snmptrapd. Pour le configurer:

  • Ajoutez le script Perl au fichier de configuration de snmptrapd (snmptrapd.conf), par exemple:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • Configurez le récepteur, par exemple:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

snmptrapd peut devoir être redémarré pour prendre en compte les modifications de sa configuration.

Si le nom du script n'est pas entre guillemets, snmptrapd refusera de démarrer et affichera des messages similaires à ceux-ci:

Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of line
Configuration de SNMPTT

Au départ, snmptrapd doit être configuré pour utiliser SNMPTT.

Pour de meilleures performances, SNMPTT doit être configuré comme un démon en utilisant snmptthandler-embedded pour lui transmettre les traps. Voir les instructions pour configurer SNMPTT.

Lorsque SNMPTT est configuré pour recevoir les traps, configurez snmptt.ini :

  1. Activez l'utilisation du module Perl du package NET-SNMP :
net_snmp_perl_enable = 1
  1. Enregistrez les traps dans le fichier de traps qui sera lu par Zabbix :
log_enable = 1
log_file = [TRAP FILE]
  1. Définissez le format de date et d'heure :
date_time_format = %Y-%m-%dT%H:%M:%S%z

Le package net-snmp-perl a été supprimé dans RHEL 8.0-8.2 ; il a été réintégré dans RHEL 8.3. Pour plus d'informations, consultez les problèmes connus.

Formatez maintenant les traps pour que Zabbix puisse les reconnaître (modifiez snmptt.conf) :

  1. Chaque instruction FORMAT doit commencer par ZBXTRAP [address], où [address] sera comparée aux adresses IP et DNS des interfaces SNMP sur Zabbix. Par exemple :
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Voir plus bas les détails sur le format des traps SNMP.

N'utilisez pas de traps inconnus - Zabbix ne pourra pas les reconnaître. Les traps inconnus peuvent être gérés en définissant un événement général dans snmptt.conf :

EVENT general .* "General event" Normal
Format du trap SNMP

Tous les récepteurs de traps Perl personnalisés et la configuration SNMPTT doivent formater le trap de la manière suivante :

[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]

  • [timestamp] - l'horodatage au format %Y-%m-%dT%H:%M:%S%z.
  • ZBXTRAP - en-tête indiquant qu'un nouveau trap commence sur cette ligne.
  • [address] - adresse IP utilisée pour trouver l'hôte de ce trap.

Notez que ZBXTRAP et [address] seront supprimés du message pendant le traitement. Si le trap est formaté autrement, Zabbix peut analyser les traps de manière inattendue.

Exemple de trap :

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state: 1. Operational state: 2

Cela donnera le trap suivant pour l'interface SNMP avec IP=192.168.1.1 :

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events"
localhost - Link down on interface 2. Admin state: 1. Operational state: 2

Configuration système requise

Il est recommandé d’installer les fichiers MIB afin de garantir que les valeurs des éléments soient affichées dans le format correct. Sans les fichiers MIB, des problèmes de formatage peuvent survenir, comme l’affichage des valeurs en HEX au lieu de l’UTF-8 ou inversement.

Prise en charge des fichiers volumineux

Zabbix prend en charge les fichiers volumineux pour les fichiers de trapper SNMP. La taille limite maximum que Zabbix peut lire est 2\^63 (8 EiB). Notez que le système de fichier peut imposer une limite inférieure sur la taille du fichier.

Rotation des journaux

Zabbix ne fournit aucun système de rotation des journaux - cela doit être géré par l'utilisateur. La rotation des journaux doit d'abord renommer l'ancien fichier, puis seulement ensuite le supprimer, afin qu'aucun trap ne soit perdu :

  1. Zabbix ouvre le fichier de trap à la dernière position connue et passe à l'étape 3.
  2. Zabbix vérifie si le fichier actuellement ouvert a été soumis à une rotation en comparant le numéro d'inode au numéro d'inode du fichier de trap défini. S'il n'y a aucun fichier ouvert, Zabbix réinitialise la dernière position et revient à l'étape 1.
  3. Zabbix lit les données du fichier actuellement ouvert et définit la nouvelle position.
  4. Les nouvelles données sont analysées. S'il s'agissait du fichier rotaté, le fichier est fermé et le processus revient à l'étape 2.
  5. S'il n'y a pas de nouvelles données, Zabbix dort pendant 1 seconde et revient à l'étape 2.
Système de fichiers

En raison de l'implémentation du fichier de trap, Zabbix a besoin que le système de fichiers prenne en charge les inodes afin de différencier les fichiers (l'information est obtenue par un appel stat()).

Exemples de configuration utilisant différentes versions du protocole SNMP

Cet exemple utilise snmptrapd et un script Bash de réception pour transmettre les traps au serveur Zabbix.

Configuration:

  1. Configurez Zabbix pour démarrer le SNMP trapper et définissez le fichier de traps. Ajoutez à zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Téléchargez le script Bash dans /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/scripts/snmptraps/zabbix_trap_handler.sh

Si nécessaire, ajustez la variable ZABBIX_TRAPS_FILE dans le script. Pour utiliser la valeur par défaut, créez d'abord le répertoire parent:

mkdir -p /var/lib/zabbix/snmptraps
  1. Ajoutez ce qui suit à snmtrapd.conf (reportez-vous à l'exemple fonctionnel)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

Il peut être nécessaire de redémarrer snmptrapd pour prendre en compte les modifications de sa configuration.

  1. Créez un élément SNMP TEST (gardez à l'esprit les exigences de configuration initiales):

    Type: SNMP trap
    Type d'information: Log
    Interface de l'hôte: SNMP 127.0.0.1
    Clé: snmptrap["linkUp"]
    Format de l'heure du journal: yyyyMMdd.hhmmss

Notez que le format de date et d'heure ISO 8601 est utilisé.

  1. Ensuite, nous allons configurer snmptrapd pour la version du protocole SNMP choisie et envoyer des traps de test à l'aide de l'utilitaire snmptrap.
SNMPv1, SNMPv2

Les protocoles SNMPv1 et SNMPv2 reposent sur l'authentification par "community string". Dans l'exemple ci-dessous, nous utiliserons "secret" comme community string. Elle doit être définie avec la même valeur sur les expéditeurs de traps SNMP.

Veuillez noter que, bien qu'encore largement utilisé dans les environnements de production, SNMPv2 n'offre aucun chiffrement ni authentification réelle de l'expéditeur. Les données sont envoyées en texte clair et, par conséquent, ces versions du protocole ne doivent être utilisées que dans des environnements sécurisés, tels qu'un réseau privé, et ne doivent jamais être utilisées sur un réseau public ou tiers.

La version 1 de SNMP n'est plus vraiment utilisée aujourd'hui, car elle ne prend pas en charge les compteurs 64 bits et est considérée comme un protocole obsolète.

Pour autoriser l'acceptation des traps SNMPv1 ou SNMPv2, vous devez ajouter la ligne suivante à snmptrapd.conf. Remplacez secret par la community string SNMP configurée sur les expéditeurs de traps SNMP:

authCommunity log,execute,net secret

Ensuite, nous pouvons envoyer un trap de test à l'aide de snmptrap. Nous utiliserons dans cet exemple l'OID courant "link up":

snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3

SNMPv3 corrige les problèmes de sécurité de SNMPv1/v2 et fournit l'authentification et le chiffrement. Vous pouvez utiliser les méthodes d'authentification MD5 ou plusieurs SHA, ainsi que DES ou plusieurs AES comme chiffrement.

Pour autoriser l'acceptation de SNMPv3, ajoutez les lignes suivantes à snmptrapd.conf:

createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest

Veuillez noter le mot-clé "execute" qui permet d'exécuter des scripts pour ce modèle de sécurité utilisateur.

snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0

Si vous souhaitez utiliser des méthodes de chiffrement robustes telles que AES192 ou AES256, veuillez utiliser net-snmp à partir de la version 5.8. Vous devrez peut-être le recompiler avec l'option configure : --enable-blumenthal-aes. Les anciennes versions de net-snmp ne prennent pas en charge AES192/AES256. Voir aussi: Strong Authentication or Encryption.

Vérification

Dans les deux exemples, vous verrez des lignes similaires dans votre /var/lib/zabbix/snmptraps/snmptraps.log:

2024-01-30T10:04:23+0200 ZBXTRAP 127.0.0.1
UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

La valeur de l'élément dans Zabbix sera:

2024-01-30 10:04:23 2024-01-30 10:04:21 

2024-01-30T10:04:21+0200 UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Exemple avec Perl:

2024-01-30T11:42:54+0200 ZBXTRAP 127.0.0.1
PDU INFO:
  receivedfrom                   UDP: [127.0.0.1]:58649->[127.0.0.1]:162
  notificationtype               TRAP
  version                        1
  community                      public
  errorstatus                    0
  transactionid                  1
  requestid                      2101882550
  messageid                      0
  errorindex                     0
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (457671) 1:16:16.71
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkUp.0

Voir également