SNMP : Le protocole de gestion réseaux

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Les systèmes de gestion de réseau sont basés sur trois éléments principaux : un superviseur, des nœuds (ou nodes) et des agents. Dans la terminologie SNMP, le synonyme manager est plus souvent employé que superviseur. Le superviseur est la console qui permet à l'administrateur réseau d'exécuter des requêtes de management. Les agents sont des entités qui se trouvent au niveau de chaque interface, connectant au réseau l'équipement géré (nœud) et permettant de récupérer des informations sur différents objets.

Switchs, hubs, routeurs, postes de travail et serveurs (physiques ou virtuels) sont des exemples d'équipements contenant des objets gérables. Ces objets gérables peuvent être des informations matérielles, des paramètres de configuration, des statistiques de performance et autres objets qui sont directement liés au comportement en cours de l'équipement en question. Ces objets sont classés dans une sorte de base de données arborescente appelée MIB (« Management Information Base »). SNMP permet le dialogue entre le superviseur et les agents afin de recueillir les objets souhaités dans la MIB.

L'architecture de gestion du réseau proposée par le protocole SNMP est donc fondée sur trois principaux éléments :

  • Les équipements gérés (managed devices) sont des éléments du réseau (ponts, switchs, hubs, routeurs ou serveurs), contenant des « objets de gestion » (managed objects) pouvant être des informations sur le matériel, des éléments de configuration ou des informations statistiques
  • Les agents, c'est-à-dire les applications de gestion de réseau résidant dans un périphérique, sont chargés de transmettre les données locales de gestion du périphérique au format SNMP
  • Les systèmes de gestion de réseau (network management systems notés NMS), c'est-à-dire les consoles à travers lesquelles les administrateurs peuvent réaliser des tâches d'administration

2 Les versions

Il existe 3 versions du protocole SNMP :

  • V1 : La première version utilise les communautés pour avoir des accès au protocole
  • V2 : Cette version souffre d'implémentations incompatible (pas de normes, chaque constructeur fait comme il souhaite)
  • V3 : Utilise USM (User Security Model) pour améliorer la sécurité sur :
    • Authentification des utilisateurs hashé
    • Encryptage des données qui transitent

3 Gestion des bases d'information

Le SNMP contient des informations hiérarchique dans une base de donnée pour chaque appareils. Les données sont encapsulées comme des objets appelés OID représentées par :

  • Un tableau qui peut contenir plusieurs valeurs
  • Un scalaire pour une seule valeur
  • 2 types d'entier pour :
    • Les compteurs : entier non négatif, augmente jusqu'au max, puis les valeurs sont remise à zero
    • Les gauges : négatif ou entier non négatif, reste à la valeur max

4 Installation

4.1 Client

4.1.1 Debian

Sur Debian, nous allons avoir besoin du package snmp :

Command aptitude
aptitude install snmp

4.1.2 Red Hat

Sur Red Hat, nous allons devoir installer le package net-snmp-utils :

Command yum
yum install net-snmp-utils

4.2 Serveur

4.2.1 Debian

Sur Debian, nous allons avoir besoin du package snmp :

Command aptitude
aptitude install snmpd

4.2.2 Red Hat

Sur Red Hat, nous allons devoir installer le package net-snmp-utils :

Command yum
yum install net-snmp

5 Configuration

5.1 Serveur v1

Pour un serveur en configuration v1, vous pouvez configurer les accès à l'aide de la commande snmpconf ou du fichier de configuration :

Configuration File /etc/snmp/snmpd.conf
# read only(ro) or write community(rw) | shared secret | source | oid |
# oid : ".1" = everythings
rocommunity       public
rwcommunity       password      192.168.0.0/24     .1

The first line allow anybody to access to the rocommunity. The second allow write to 192.168.0.0/24 range.

Si vous utilisez la commande snmpconf, créer un fichier de configuration. Mais d'abord, il va falloir déplacer l'actuel car la commande risque de poser des problèmes sinon.

5.2 Serveur v3

La version 3 du protocole SNMP est différente de la version 1 sur son fonctionnement. Avant de commencer, nous allons couper le serveur snmp et c'est très important qu'il soit arrêter pour la suite :

Command service
/etc/init.d/snmpd stop

Nous allons ensuite installer le package de developpement pour disposer d'un outil fort pratique sur Red Hat :

Command yum
yum install net-snmp-devel

Il va falloir créer un utilisateur a qui nous irons attribuer des droits (le mot de passe doit être >= 8 caractères) :

Command net-snmp-config
> net-snmp-config --create-snmpv3-user -ro -A auth_passphrase -a sha -X private_passphrase -x AES username
adding the following line to /var/lib/net-snmp/snmpd.conf:
   createUser username SHA "auth_passphrase" AES private_passphrase
adding the following line to /etc/snmp/snmpd.conf:
  rouser username

Ici nous voyons donc que l'outil net-snmp-config nous a modifier le fichier de configuration en rajoutant l'utlisateur username. Il a également été enregister d'autres informations dans le fichier /var/lib/net-snmp/snmpd.conf.

Créons maintenant les droits pour cet utilisateur. Pour cela nous allons avoir besoin de créer :

  • Un groupe : on va définir un groupe pour y intégrer des utilisateurs
  • Une vue : cette vue va service à dire quelle est la vue que le groupe définit est autorisé à voir (par rapport à un arbre SNMP)
  • Un access : on a mapper l'accès et les méthodes d'authneitification au groupe à la la vue choisie
Configuration File /etc/snmp/snmpd.conf
...
rouser username
#       groupName      securityModel securityName
group  mygroup   usm        username
#       name           incl/excl     subtree         mask(optional)
view   myview   included   .1
#       group          context sec.model sec.level prefix read   write  notif
access mygroup any auth exact myview none none

Faites attention à l'ordre d'insertion des lignes, elles ont de l'importance pour que la configuration focntionne.

Démarrez ensuite le service SNMP :

Command service
/etc/init.d/snmpd start

6 Les MIBs

Les MIBs se traduisent sous cette forme :

Snmp mib.png

La définition d'une MIB est donc sous la forme suivante :

  • De préfix : IP-MIB::ipForwarding.0 (le 0 est obligatoire pour les valeurs scalaires, sinon ça ne fonctionne pas)
  • ID numérique : .1.3.6.1.2.1.4.1.0
  • Le nom complet de l'objet : .iso.org.dod.internet.mgmt.mib-2.ip.ipForwarding.0

Le dernier numéro est un index correspondant à la valeur de l'OID (les indexes fonctionnant comme les tableaux en Perl) :

Snmp index oid.png

6.1 Lire une MIB

Pour la lecture, prenons par exemple les MIB d'un Linux :

Configuration File /usr/share/snmp/mibs/IP-MIB.txt
...
--
-- the IP general group
-- some objects that affect all of IPv4
--
 
ip       OBJECT IDENTIFIER ::= { mib-2 4 } 
ipForwarding OBJECT-TYPE    SYNTAX     INTEGER {
                    forwarding(1),    -- acting as a router
                    notForwarding(2)  -- NOT acting as a router
               }
    MAX-ACCESS read-write
    STATUS     current
    DESCRIPTION           "The indication of whether this entity is acting as an IPv4
            router in respect to the forwarding of datagrams received
            by, but not addressed to, this entity.  IPv4 routers forward
            datagrams.  IPv4 hosts do not (except those source-routed
            via the host).
 
            When this object is written, the entity should save the
            change to non-volatile storage and restore the object from
            non-volatile storage upon re-initialization of the system.
            Note: a stronger requirement is not used because this object
            was previously defined."
    ::= { ip 1 }
...

  • ip OBJECT IDENTIFIER ::= { mib-2 4 } : Correspond au préfix SNMP
  • ipForwarding OBJECT-TYPE : importation des dépendances, tel que les OBJECT-TYPE
  • DESCRIPTION : on a une description

6.1.1 snmpget

6.1.1.1 SNMP v1

Pour récupérer la valeur de cet objet, nous allons utiliser la commande snmpget qui sert à récupérer une seule valeur :

Command snmpget
snmpget -v1 -c public localhost IP-MIB::ipForwarding.0

  • -v : On spécifie ici la version du protocole (1)
  • -c : la communauté à utiliser (regardez la configuration du serveur pour la connaitre)

Note : Si vous ne récupérez rien, c'est certainement que vous avez un problème de droit côté serveur.

6.1.1.2 SNMP v3

On vient de voir ici pour la version 1, maintenant pour une version 3 :

Command snmpget
snmpget -v3 localhost IP-MIB::ipForwarding.0 -l authPriv -u username -A auth_passphrase -a sha -X private_passphrase -x AES

  • -l : C'est le type de sécurité que l'on souhaites pour le SNMPv3
    • auth : mot de passe pour une authentification hashé et donc cryptée
    • priv : mot de passe pour une encryption des donnés
    • authPriv : permet d'utiliser les 2 types d'encryptions (authentification + datas)
    • authNoPriv : Avoir de l'authentification sans cryptage des données.
  • -u : le nom d'utilisateur à utiliser pour s'authentifier
  • -A : la pass phrase pour l'authentification de l'utilisateur
  • -a : l'algorithme de hash à utiliser pour l'authentification
  • -X : la pass phrase partagée avec le serveur
  • -x : l'algorithme de cryptage a utiliser pour le secret partagé

Note : Si vous ne récupérez rien, c'est certainement que vous avez un problème de droit côté serveur.

Si vous avez souvent plusieurs requêtes à effectuer vers le même host, vous pouvez créer un fichier qui ne peut contenir qu'un seul host dans ~/.snmp/snmp.conf ou /etc/snmp/snmp.conf :

Configuration File ~/.snmp/snmp.conf
defversion             3
defsecurityname        username
defsecuritylevel       authPriv
defhtype               SHA
defauthpassphrase      auth_passphrase
defprivtype            AES
defprivpassphrase      private_passphrase

Maintenant, vous n'avez plus à passer tous vos arguments, simplement le serveur avec la MIB.

6.1.2 snmpwalk

Snmpwalk va récupérer toutes les valeurs. Il va donc falloir utiliser grep pour trouver la valeur que l'on souhaites :

Command snmpwalk
> snmpwalk -v1 -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 2.6.32 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (121891) 0:20:18.91
SNMPv2-MIB::sysContact.0 = STRING: Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
...

6.1.3 snmpnetstat

Cet outil va récupérer les OID et les afficher comme la commande netstat :

Command snmpwalk
 snmpnetstat -v1 -c public -Cs localhost

6.2 Trouver des objets de MIB

La commande snmptranslate va nous aider à trouver des objets de MIBs installé localement sur la machine (/usr/share/snmp/mibs/*). Par exemple pour effectuer une recherche en arbre :

Command snmptranslate
> snmptranslate -TB '.*forward.*'
SNMP-COMMUNITY-MIB::snmpProxyTrapForwardGroup
SNMP-COMMUNITY-MIB::snmpProxyTrapForwardCompliance
IP-MIB::ipv6InterfaceForwarding
IP-MIB::ipv6IpForwarding
IP-MIB::ipForwarding
IP-FORWARD-MIB::ipForward
IP-FORWARD-MIB::ipForwardTable
IP-FORWARD-MIB::ipForwardEntry
IP-FORWARD-MIB::ipForwardMetric5
IP-FORWARD-MIB::ipForwardMetric4
IP-FORWARD-MIB::ipForwardMetric3
IP-FORWARD-MIB::ipForwardMetric2
IP-FORWARD-MIB::ipForwardMetric1
IP-FORWARD-MIB::ipForwardNextHopAS
IP-FORWARD-MIB::ipForwardInfo
IP-FORWARD-MIB::ipForwardAge
IP-FORWARD-MIB::ipForwardProto
IP-FORWARD-MIB::ipForwardType
IP-FORWARD-MIB::ipForwardIfIndex
IP-FORWARD-MIB::ipForwardNextHop
IP-FORWARD-MIB::ipForwardPolicy
IP-FORWARD-MIB::ipForwardMask
IP-FORWARD-MIB::ipForwardDest
IP-FORWARD-MIB::ipForwardNumber
IP-FORWARD-MIB::ipForwardConformance
IP-FORWARD-MIB::ipForwardCompliances
IP-FORWARD-MIB::ipForwardOldCompliance
IP-FORWARD-MIB::ipForwardCompliance
IP-FORWARD-MIB::ipForwardReadOnlyCompliance
IP-FORWARD-MIB::ipForwardFullCompliance
IP-FORWARD-MIB::ipForwardGroups
IP-FORWARD-MIB::ipForwardMultiPathGroup
IP-FORWARD-MIB::ipForwardCidrRouteGroup
IP-FORWARD-MIB::inetForwardCidrRouteGroup

Si l'on veut une version numérique :

Command snmptranslate
> snmptranslate -On IP-FORWARD-MIB::ipForward
.1.3.6.1.2.1.4.24

Pour avoir une version en arbre complète :

Command snmptranslate
> snmptranslate -Tp -Of .1.3.6.1.2.1.4.24
+--ipForward(24)
   +-- -R-- Gauge     ipForwardNumber(1)
   |
   +--ipForwardTable(2)
   |  |
   |  +--ipForwardEntry(1)
   |     |  Index: ipForwardDest, ipForwardProto, ipForwardPolicy, ipForwardNextHop
   |     |
   |     +-- -R-- IpAddr    ipForwardDest(1)
   |     +-- CR-- IpAddr    ipForwardMask(2)
   |     +-- -R-- Integer32 ipForwardPolicy(3)
   |     |        Range: 0..2147483647
   |     +-- -R-- IpAddr    ipForwardNextHop(4)
   |     +-- CR-- Integer32 ipForwardIfIndex(5)
   |     +-- CR-- EnumVal   ipForwardType(6)
   |     |        Values: other(1), invalid(2), local(3), remote(4)
   |     +-- -R-- EnumVal   ipForwardProto(7)
   |     |        Values: other(1), local(2), netmgmt(3), icmp(4), egp(5), ggp(6), hello(7), rip(8), is-is(9), es-is(10), ciscoIgrp(11), bbnSpfIgp(12), ospf(13), bgp(14), idpr(15)
   |     +-- -R-- Integer32 ipForwardAge(8)
   |     +-- CR-- ObjID     ipForwardInfo(9)
...