{{tag>serveur supervision}}
----
====== SNMP (Simple Network Management Protocol) ou la supervision d'équipements réseaux ======
===== Introduction =====
==== 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 [[https://www.ietf.org/rfc/rfc1157.txt|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.
===== Installation =====
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, [[:tutoriel:comment_installer_un_paquet|installez le paquet]] [[apt>snmpd]].
[[https://thejoyofstick.com/blog/2019/05/28/installing-snmp-mib-files-in-linux-ubuntu-12-04-lts/|A partir d'Ubuntu 12.04, il faut aussi installer les MIBs]] en [[:tutoriel:comment_installer_un_paquet|installant le paquet]] [[apt>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
===== Configuration =====
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
[[:tutoriel:comment_modifier_un_fichier|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_shell|commande]] :
tkmib
{{:snmp:tkmib_5421_01.png?492x600|}}
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 [[:tutoriel:comment_editer_un_fichier|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 [[:tutoriel:comment_editer_un_fichier|dans le fichier]] **/etc/snmp/snmp.conf** :
mibs +DISMAN-EVENT-MIB
==== Gestion des MIBs avec SNMPb ====
Voir [[https://blog.cedrictemple.net/257-snmpb-faire-des-requetes-snmp-avec-un-outil-graphique/|https://blog.cedrictemple.net/257-snmpb-faire-des-requetes-snmp-avec-un-outil-graphique/]]
===== Utilisation =====
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)
===== Note·s =====
La gestion des //traps// se fait avec le serveur SNMP et fera l'objet d'un autre article.
[[:tutoriel:configurer_snmp_pour_utiliser_cacti_depuis_une_machine_distante|Configurer SNMP sur un serveur pour le rendre accessible à distance par Cacti]]
----
//Contributeurs : [[utilisateurs:ostaquet|ostaquet]], [[utilisateurs:sefran|Franc SERRES]], [[utilisateurs:Yannis.B|Yannis BRISOT]], [[utilisateurs:HacKurx|HacKurx]].//