SNMP (Simple Network Management Protocol) ou la supervision d'équipements réseaux

Qu'est-ce que le SNMP ?

Le SNMP est un protocole qui permet aux administrateurs réseaux de gérer les équipements et de diagnostiquer les problèmes. Le sigle SNMP signifie Simple Network Management Protocol et la plupart des switchs, UPS, pare-feux matériels, routeurs, etc. comprennent ce protocole pour les diagnostics.

Quand on dit « la plupart », on parle du matériel que l'on retrouve en entreprise ; pas forcément le routeur fourni par votre fournisseur d'accès Internet. Pour savoir si votre matériel est compatible avec le SNMP, veuillez consulter les spécifications techniques livrées avec l'appareil.

Le protocole SNMP est un standard défini par l'IETF dans la RFC 1157 (mai 1990). Le SNMP est souvent vu comme quelque chose de compliqué et d'assez confus. Les API permettant d'interagir avec le protocole englobent tellement de choses qu'au final, on ne s'y retrouve plus. Les livres et la documentation disponibles sur le sujet ont tendance à compliquer les choses et à ne pas les démystifier. C'est ce que je vais essayer de faire dans cet article.

Généralités et vocabulaire

Le protocole SNMP (Simple Network Management Protocol) est relativement simple… une fois qu'on a compris. Voyons comment se compose un ensemble d'éléments communiquant via SNMP.

Un périphérique réseau (routeur, switch, pare-feu…) fait tourner un agent SNMP qui est en fait un processus daemon qui répond aux requêtes du réseau. L'agent SNMP fournit un grand nombre d'identifiant d'objets (Object Identifiers ou OID). Un OID est une paire clé-valeur unique. L'agent SNMP remplit ces valeurs et fait en sorte qu'elles soient disponibles. Un manager SNMP (ou Serveur SNMP) peut effectuer des requêtes aux agents avec ces paires clé-valeur à propos d'informations spécifiques. Les OID SNMP peuvent être lus ou écrits.

Notons qu'il est rare d'écrire des informations sur un périphérique SNMP. Le SNMP est surtout utilisé par de nombreuses applications de management pour contrôler l'état des périphériques réseaux (comme une interface graphique administrative pour les switchs). Un système d'authentification basique existe dans le SNMP ; il permet au manager d'envoyer un community name (qui est en fait un mot de passe en clair) pour autoriser la lecture ou l'écriture des OID. La plupart des périphériques utilisent le community name non sécurisé « public ». Les communications SNMP se font via les ports UDP 161 et 162.

MIB

Si vous avez déjà effectué quelques recherches sur le SNMP, vous avez sûrement été confronté aux MIB (Management Information Base). L'importance des MIB est très surfaite et vous allez comprendre pourquoi. Au premier coup d'œil, une MIB peut paraître très complexe ; en réalité, c'est très simple.

Les OID sont numériques et globaux. Un OID est très similaire à une adresse IPv6 et les différents fabricants ont différents préfixes, chaque fabricant a sa gamme de produit (un autre préfixe) et ainsi de suite. Les OID peuvent très vite être longs et c'est compliqué pour un humain de se rappeler la signification de cet ensemble de nombres. C'est pour cela qu'une méthode a été mise au point pour traduire un OID numérique dans une forme lisible pour un humain. Cette carte de traduction est stockée dans un fichier texte appelé Management Information Base ou MIB.

Vous n'avez pas besoin d'un MIB pour utiliser SNMP ou effectuer des requêtes sur des périphériques SNMP mais sans la MIB, vous n'allez pas savoir facilement ce que signifient les données retournées par le périphérique. Dans certains cas, c'est facile comme le nom de l'hôte, l'usage des disques ou les informations d'état des ports. Dans d'autres cas, cela peut être plus difficile et une MIB peut être d'une grande aide. Notez qu'il est assez inhabituel pour la plupart des applications d'écrire des requêtes uniquement numériques ; la plupart des applications permettent l'installation de MIB complémentaires. Cette installation consiste en fait à placer les MIB à un endroit où l'application cliente SNMP peut les trouver pour effectuer la traduction.

Techniques de supervision avec SNMP

SNMP peut être utilisé de deux manières distinctes : le polling et les traps.

Le polling consiste simplement à envoyer une requête à intervalles réguliers pour obtenir une valeur particulière. Cette technique est appelée « vérification active ». Vous pouvez, par programme ou script, vérifier si les valeurs sont correctes. Si la requête échoue, il est possible qu'il y ait un problème avec le périphérique. Cependant, vu que le SNMP s'appuie sur UDP, il est conseillé de réitérer la requête pour confirmer le problème (surtout dans le cas d'une vérification au travers d'Internet).

Les traps consistent à faire de la vérification passive ; en gros, on configure l'agent SNMP pour qu'il contacte un autre agent SNMP en cas de problème. C'est-à-dire que l'on peut configurer un périphérique réseau (comme un routeur) pour qu'il envoie un trap SNMP lors de certains événements. Par exemple, le routeur peut envoyer un trap lorsqu'il détecte que la ligne est coupée (down). Quand un événement trap apparait, l'agent sur le périphérique va envoyer le trap vers une destination pré-configurée communément appelé trap host. Le trap host possède son propre agent SNMP qui va accepter et traiter les traps lorsqu'ils arrivent. Le traitement des traps est effectué par des trap handlers. Le handler peut faire ce qui est approprié pour répondre au trap, comme envoyer un courriel d'alerte ou faire ce qu'on veut.

Les différentes versions de SNMP

Il existe actuellement 3 versions différentes du protocole SNMP :

  • SNMP v1 (RFC 1155, 1157 et 1212).
  • SNMP v2c (RFC 1901 à 1908).
  • SNMP v3 (RFC 3411 à 3418).

La coexistence des trois versions est détaillée dans la RFC 3584.

Pour installer un manager SNMP, vous pouvez utiliser Net-SNMP. L'application Net-SNMP est un ensemble de programmes console permettant de tout faire avec le protocole SNMP. L'avantage d'utiliser des programmes console est que vous pouvez facilement écrire des petits scripts de vérification que vous pourrez intégrer dans Nagios, par exemple.

Pour installer le paquet client SNMP, installez le paquet snmpd.

A partir d'Ubuntu 12.04, il faut aussi installer les MIBs en installant le paquet snmp-mibs-downloader et charger les MIBs en commentant la ligne mibs : dans le fichier /etc/snmp/snmp.conf :

grep ^mibs /etc/snmp/snmp.conf -q && sudo sed -i 's/\(^mibs.*$\)/#\1/' /etc/snmp/snmp.conf

Attention : certains paramètres sont à modifier dans le fichier /etc/default/snmpd Ils ne seront pas pris en compte dans /etc/snmp/snmpd.conf

Paramétrage du service

Sauvegardez le fichier de configuration :

sudo cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak

Editez le fichier de configuration du service SNMP :

sudo nano /etc/snmp/snmpd.conf

Afin qu'il contienne ceci (à adapter selon vos besoins) :

# This file controls the activity of snmpd and snmptrapd

# MIB directories.  /usr/share/snmp/mibs is the default, but
# including it here avoids some strange problems.
export MIBDIRS=/usr/share/snmp/mibs

# snmpd control (yes means start daemon).
SNMPDRUN=yes

# snmpd options (use syslog, close stdin/out/err).
SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid '

# snmptrapd control (yes means start daemon).  As of net-snmp version
# 5.0, master agentx support must be enabled in snmpd before snmptrapd
# can be run.  See snmpd.conf(5) for how to do this.
TRAPDRUN=no

# snmptrapd options (use syslog).
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'

# create symlink on Debian legacy location to official RFC path
SNMPDCOMPAT=yes

# Alerte pour le disque dur :
disk / 100000

rocommunity  public # public à remplacer par sa communauté
syslocation  Mon_Ordinateur
syscontact  mon_courriel@fai.fr
  • export MIBDIRS= définit le répertoire où sont stocké les MIBs
  • SNMPDRUN= active ou désactive le service SNMP
  • SNMPDOPTS= options de démarrage du daemon SNMPD
  • TRAPDRUN= active ou désactive le service de capture des traps SNMP
  • TRAPDOPTS= options de démarrage de daemon SNMPTRAPD

Valider les changements, et redémarrer le service SNMP

sudo /etc/init.d/snmpd restart

Gestion des MIBs avec tkmib

Pour visualiser les MIBs nous allons installer apt://tkmib. Pour le lancement il vous suffit de taper la commande :

tkmib

L'étape suivante consiste à vous procurer les MIB concernant votre matériel (en général, sur le site web du constructeur) et à les copier dans le répertoire « /usr/share/snmp/mibs/ », répertoire par défaut sous Debian/Ubuntu.

Il est toujours possible de les installer dans un autre répertoire de votre choix mais ce faisant, il devient nécessaire de renseigner ce dernier en assignant la variable d'environnement « $MIBDIRS » de la manière suivante (à introduire dans une console) :

MIBDIRS=+/chemin/complet/de/votre/répertoire/

Ensuite, il est possible de renseigner ce nouveau répertoire pour tous en ajoutant la ligne ci-dessus dans le fichier /etc/snmp/snmp.conf :

mibdirs +/chemin/complet/de/votre/répertoire/

La bibliothèque Net-SNMP supporte une liste finie bien qu'extensible de MIB, définie lors de la compilation. Il est alors nécessaire d'ajouter les noms de MIB supplémentaires pour pouvoir les traduire correctement. Pour ce faire, il faut ajouter chaque nom (spécifié dans le fichier, à ne pas confondre avec le nom du fichier) peut être ajouté dans la variable d'environnement « $MIBS » de la manière suivante (dans cet exemple, la nouvelle se nomme DISMAN-EVENT-MIB) :

MIBS=+DISMAN-EVENT-MIB

De même, cette information peut également profiter à tous en ajoutant la ligne ci-dessus dans le fichier /etc/snmp/snmp.conf :

mibs +DISMAN-EVENT-MIB

Gestion des MIBs avec SNMPb

Pour une utilisation de base du SNMP, vous avez besoin de 2 commandes principales :

  • snmpwalk : pour sortir des informations par lots.
  • snmpget : pour obtenir une information sur un OID précis.

Il existe bien d'autres commandes SNMP disponibles dans le paquet Net-SNMP. Je vous encourage à lire la manpage principale : man snmpcmd.

snmpwalk

Lorsqu'on décide de superviser un périphérique, il est important de connaître ce qui est disponible. Pour ce faire, il existe la commande « snmpwalk ». Cette commande permet de sortir sur la console toutes les informations accessibles sur le périphérique. Voici un exemple avec un switch 3com SuperStack3 :

snmpwalk -v1 -c private 192.168.0.232

Voyons brièvement les différentes options :

  • -v1 : indique que l'on utilise le protocole SNMP version 1 (la version du protocole à utiliser dépend du périphérique supervisé).
  • -c private : indique le community name pour accéder aux informations. Dans cet exemple, on utilise le community name private. Ce community name est dépendant du périphérique et se modifie dans les paramètres de ce dernier (interface web, console,…).
  • 192.168.0.232 : indique l'adresse IP du périphérique.

Une telle commande retourne quelque chose de similaire à ce qui suit :

SNMPv2-MIB::sysDescr.0 = STRING: 3Com SuperStack 3
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.43.10.27.4.1.2.11
SNMPv2-MIB::sysUpTime.0 = Timeticks: (6550243) 18:11:42.43
SNMPv2-MIB::sysContact.0 = STRING: root@ubu.tu.fr
SNMPv2-MIB::sysName.0 = STRING: switch
SNMPv2-MIB::sysLocation.0 = STRING: Ubuntu-fr
SNMPv2-MIB::sysServices.0 = INTEGER: 2
IF-MIB::ifNumber.0 = INTEGER: 34
[...]
IF-MIB::ifOperStatus.112 = INTEGER: up(1)
IF-MIB::ifOperStatus.113 = INTEGER: up(1)
IF-MIB::ifOperStatus.114 = INTEGER: down(2)
IF-MIB::ifOperStatus.115 = INTEGER: up(1)
IF-MIB::ifOperStatus.116 = INTEGER: up(1)
IF-MIB::ifOperStatus.117 = INTEGER: down(2)
IF-MIB::ifOperStatus.118 = INTEGER: up(1)
IF-MIB::ifOperStatus.119 = INTEGER: down(2)
IF-MIB::ifOperStatus.120 = INTEGER: down(2)
[...]

Cette liste peut être très longue et dépend du périphérique supervisé. Vous constatez que les informations sont classées par MIB suivi du OID.

Dans l'exemple ci-dessus, nous avons « IF-MIB::ifOperStatus.117 = INTEGER: down(2) ». Ce qui signifie que l'OID « ifOperStatus.117 » (qui correspond à l'état du port 17 du switch) est repris dans la MIB « IF-MIB » (qui est une MIB standard). Cet OID (clé) est associé à une valeur entière (type INTEGER) qui vaut 2 (qui indique que l'état est down).

L'application « snmpwalk » peut également sortir les enfants d'un OID. Par exemple :

snmpwalk -v1 -c private 192.168.0.232 IF-MIB::ifOperStatus

Nous fournira l'état de toutes les interfaces du switch.

snmpget

Si vous avez compris snmpwalk, vous comprendrez très rapidement comment fonctionne le snmpget. L'application snmpget permet d'obtenir l'information concernant un OID précis. Reprenons notre exemple, imaginons que nous voulons connaître uniquement l'état du port 22 du switch, il nous suffit d'entrer la commande suivante :

snmpget -v1 -c private 192.168.0.232 IF-MIB::ifOperStatus.122

Nous obtenons l'information précise :

IF-MIB::ifOperStatus.122 = INTEGER: up(1)

La gestion des traps se fait avec le serveur SNMP et fera l'objet d'un autre article.

Configurer SNMP sur un serveur pour le rendre accessible à distance par Cacti


Contributeurs : ostaquet, Franc SERRES, Yannis BRISOT, HacKurx.

  • snmp.txt
  • Dernière modification: Le 02/03/2023, 14:17
  • par 217.114.205.206