Outils pour utilisateurs

Outils du site


brouillon_snmp

Ceci est une ancienne révision du document !


snmp

Liens

Introduc

Client/Serveur

smnpd est un daemon qui attend les requetes des clients.

Les logiciels clients sont snmpget, snmpgetnext, snmpwalk, etc…

Le daemon smnpd peut dés l'installation répondre a quelques requetes… (encore faut-il le configurer pour autoriser les clients)

OID & MIB

OID


Object IDentifier
Version numéric d'un MIB (?)
Exemple: .1.3.6.1.2.1.1.3.0

MIB


Management Information Base
Version ascii d'un OID (?)
Exemple: SNMPv2-MIB::sysUpTime.0

Arbre

Les objects sont disposés dans un “arbre”, qu'on parcours en commencant par “.”…

Voir la commande snmptranslate qui permet de convertir un OID en MIB et inversement.

installation

snmpd

# aptitude install snmpd

Le “daemon” ecoute en udp sur le port 161.
Il attend les requetes des clients.

Les clients sont autorisés selon le fichier /etc/snmp/snmpd.conf.

Dans les extraits suivants, j'ai coupé les parties présentes par défaut, du genre:

#       sec.name  source          community
com2sec paranoid  default         public
#com2sec readonly  default         public
#com2sec readwrite default         private
...

community

Dans le fichier snmpd.conf :

####
# First, map the community name (COMMUNITY) into a security name
# (local and mynetwork, depending on where the request is coming
# from):
#       sec.name  source                community
# TJ -----------
com2sec admin           localhost       code_secret1
com2sec admin           10.20.0.20      code_secret2
com2sec localnet        10.20.0.0/16    code_secret3
# --------------
com2sec déclare la relation entre une communauté et un “security name”
sec.name “security name” (groupe) associé a la communauté
source d'où qui vient
community le nom de la communauté

Dans les faits, ce qui est nommé “community” (communauté), est un pseudo mot de passe.

:!: les mots de passe circulent en clair ! (sauf depuis la “v3”, si bien configuré, mais pas trés populaire il me semble…)

group

Dans snmpd.conf :

####
# Second, map the security names into group names:

#               sec.model  sec.name
# TJ -----------
group RWmaison   v1      admin
group RWmaison   v2c     admin
group ROmaison   v1      localnet
group ROmaison   v2c     localnet
# --------------

Là, on créé des groupes…

group This directive defines the mapping from securitymodel/securityname to group.
name le nom du groupe
sec.model “security model” … la version du protocole plutot… non ?
sec.name le “security name” qui nous renvoit vers la “commununity”
“v1” c'est bien, ca passe partout. y a juste des soucis avec les compteurs 64 bits
“v2c” (version 2 en fait, mais bon), c'est mieux, sans les problèmes de la “v1”
“v3” c'est encore mieux, mot de passe crypté, etc…: trop compliqué pour moi

Comme vous le voyez, on peut avoir plusieurs versions ! super.

view

####
# Third, create a view for us to let the groups have rights to:

#           incl/excl subtree                          mask
view all    included  .1                               80
view system included  .iso.org.dod.internet.mgmt.mib-2.system

Là, j'ai rien touché.
Ca semble definir des “groupes” de qu'on a le droit de voir. (et lire ou ecrire)

access

####
# Finally, grant the 2 groups access to the 1 view with different
# write permissions:

#                context sec.model sec.level match  read   write  notif
# TJ ---------
access ROmaison  ""     any       noauth    exact  all   none   none
access RWmaison  ""     any       noauth    exact  all   all    none
# ------------
context voir man
sec.model “v1” “v2c” “any” etc… selon les “protocoles” accepté
sec.level “noauth” ⇒ sans authentication (le “community name” suffit)
match voir man
read autorise la lecture ou pas
write autorise l'ecriture ou pas
notif voir man

Conclusion

Au final le “snmpd.conf” permet l'accés au client.

# /etc/init.d/snmpd restart

Clients

Installer

# aptitude update
# aptitude install snmp

(Et libsnmp-session-perl ?)

Et voila.

snmptranslate

Transformer un OID en MIB :

$ snmptranslate .1.3.6.1.2.1.1.3.0
DISMAN-EVENT-MIB::sysUpTimeInstance

Transformer un MIB en OID :

$ snmptranslate -On DISMAN-EVENT-MIB::sysUpTimeInstance
.1.3.6.1.2.1.1.3.0

Transformer en ses sous-identifiers nommés:

$ snmptranslate -Of DISMAN-EVENT-MIB::sysUpTimeInstance
.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance

Un MIB est garantie etre unique (sauf rare cas isolé).
De ce fait, il doit être précis.
Par exemple:

$ snmptranslate sysUpTimeInstance
No log handling enabled - turning on stderr logging
sysUpTimeInstance: Unknown Object Identifier (Sub-id not found: (top) -> sysUpTimeInstance)

Ca ne fonctionne pas, sauf si on demande a la commande de faire une recherche “aléatoire” :

$ snmptranslate -IR sysUpTimeInstance
DISMAN-EVENT-MIB::sysUpTimeInstance

Ou

$ snmptranslate -On -IR sysUpTimeInstance
.1.3.6.1.2.1.1.3.0

Recherche par 'regex':

$ snmptranslate -Ib 'sys.*ime'
SNMPv2-MIB::sysORUpTime

Oups, ce n'est pas ce qu'on voulait:

$ snmptranslate -Ib 'sysUp.*ime'
SNMPv2-MIB::sysUpTime

Pour avoir la liste des “noeuds” qui corresponde a la recherche:

$ snmptranslate -TB 'sys.*ime'
SNMPv2-MIB::sysORUpTime
SNMPv2-MIB::sysUpTime
DISMAN-EVENT-MIB::sysUpTimeInstance
HOST-RESOURCES-MIB::hrSystemUptime

La description complete (pas trés clair dans cet exemple):

$ snmptranslate -On -Td DISMAN-EVENT-MIB::sysUpTimeInstance
.1.3.6.1.2.1.1.3.0
sysUpTimeInstance OBJECT-TYPE
  -- FROM       DISMAN-EVENT-MIB
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysUpTime(3) 0 }

Un diagramme:

$ snmptranslate -Tp -IR system
+--system(1)
 |
 +-- -R-- String    sysDescr(1)
 |        Textual Convention: DisplayString
 |        Size: 0..255
 +-- -R-- ObjID     sysObjectID(2)
 +-- -R-- TimeTicks sysUpTime(3)
 |  |
 |  +--sysUpTimeInstance(0)
 |
 +-- -RW- String    sysContact(4)
 |        Textual Convention: DisplayString
 |        Size: 0..255
 +-- -RW- String    sysName(5)
 |        Textual Convention: DisplayString
 |        Size: 0..255
 +-- -RW- String    sysLocation(6)
 |        Textual Convention: DisplayString
 |        Size: 0..255
 +-- -R-- INTEGER   sysServices(7)
 |        Range: 0..127
 +-- -R-- TimeTicks sysORLastChange(8)
 |        Textual Convention: TimeStamp
 |
 +--sysORTable(9)
    |
    +--sysOREntry(1)
       |  Index: sysORIndex
       |
       +-- ---- INTEGER   sysORIndex(1)
       |        Range: 1..2147483647
       +-- -R-- ObjID     sysORID(2)
       +-- -R-- String    sysORDescr(3)
       |        Textual Convention: DisplayString
       |        Size: 0..255
       +-- -R-- TimeTicks sysORUpTime(4)
                Textual Convention: TimeStamp

Oh! un arbre!

v1 ou v2c

Il faudra choisir un protocole “-v1” , “-v 1” , “-v2c” ou “-v 2c”.

Les réponses n'ont pas toujours le même format.

Nous, on choisira “-v 2c” … mouai.

snmpget

Retourne l'information associé à un object “MIB”:

$ snmpget -v 2c -c <community_name> <host> DISMAN-EVENT-MIB::sysUpTimeInstance
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8193500) 22:45:35.00

On précise la version “2c”, la “<community_name>”, l'adresse de l'hôte a interroger, et la MIB. Soit en clair:

$ snmpget -v 2c -c code_secret1 localhost DISMAN-EVENT-MIB::sysUpTimeInstance

En plus simple:

$ snmpget -v 2c -c code_secret1 localhost sysUpTime.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8221481) 22:50:14.81

Plus interessant:

$ snmpget -v 2c -c code_secret1 localhost UCD-SNMP-MIB::extOutput.1
UCD-SNMP-MIB::extOutput.1 = STRING: RAID OK (2/2)

(sera developpé ultérieurement)

snmpgetnext

Pareil que “snmpget”, sauf que ca retourne l'objet valide SUIVANT . L'interet est de simplifier les requetes en laissant la commande rechercher l'objet valide dans les sous-branches.

Exemple:

$ snmpgetnext -v 2c -c code_secret1 localhost DISMAN-EVENT-MIB::sysUpTimeInstance.0
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmpd.local.conf)

C'est bien le suivant!

Mais c'est surtout interessant pour les OID incomplets:

$ snmpgetnext -v 2c -c code_secret1 localhost sysUpTime
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8262728) 22:57:07.28

Comme vous pouvez l'imaginer, on peut “marcher” en parcourant l'arbre…

snmpwalk

Retourne quelques infos de l'arbre:

$ snmpwalk -v 2c -c code_secret1 localhost sysORID
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

Retourner toutes les informations de la branche “.1”

$ snmpwalk -v 2c -c code_secret1 localhost .1

ou

$ snmpwalk -v 2c -c code_secret1 localhost .iso

(huge output !)

Un poil plus interessant:

$ snmpwalk -v 2c -c code_secret1 localhost .1.3.6.1.4.1.2021.8.1
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: raidmon
UCD-SNMP-MIB::extCommand.1 = STRING: /usr/bin/sudo /root/prod/snmpd/raidmon
UCD-SNMP-MIB::extResult.1 = INTEGER: 0
UCD-SNMP-MIB::extOutput.1 = STRING: RAID OK (2/2)
UCD-SNMP-MIB::extErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::extErrFixCmd.1 = STRING:

snmptable

Sortir des tables…

$ snmptable -v 2c -c code_secret1 localhost sysORTable
SNMP table: SNMPv2-MIB::sysORTable

                                        sysORID                                                                     sysORDescr  sysORUpTime
                                  IF-MIB::ifMIB    The MIB module to describe generic objects for network interface sub-layers 0:0:00:00.00
                            SNMPv2-MIB::snmpMIB                                             The MIB module for SNMPv2 entities 0:0:00:00.00
                                TCP-MIB::tcpMIB                                The MIB module for managing TCP implementations 0:0:00:00.00
                                     IP-MIB::ip                        The MIB module for managing IP and ICMP implementations 0:0:00:00.00
                                UDP-MIB::udpMIB                                The MIB module for managing UDP implementations 0:0:00:00.00
        SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup                                      View-based Access Control Model for SNMP. 0:0:00:00.00
 SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance                                          The SNMP Management Architecture MIB. 0:0:00:00.00
                SNMP-MPD-MIB::snmpMPDCompliance                                The MIB for Message Processing and Dispatching. 0:0:00:00.00
       SNMP-USER-BASED-SM-MIB::usmMIBCompliance The management information definitions for the SNMP User-based Security Model. 0:0:00:00.00

snmpset

Fixer une valeur:
“The SET request is used to modify information on the target agent - updating the configuration of that agent, or controlling the behaviour of the remote system.” Suite

snmptrap

FIXME

tips

snmp et commande externe

On va prendre exemple d'un monitoring de RAID !

commande

On a composé un script de monitoring RAID trés simple:

$ cat /root/prod/snmpd/raidmon
#!/bin/sh

# pour snmpd
# Il n'accepte que la 1er ligne en reponse

MDADM=/sbin/mdadm
EGREP=/bin/egrep

[ -x "$MDADM" ] || exit 0

COUNT=0
RAIDOK=0
CRITICAL=0

for RAIDDEV in /dev/md*
do
  if [ -b "$RAIDDEV" ]
  then
    COUNT=$(( COUNT + 1 ))

    if [ -z "$( $MDADM --detail $RAIDDEV | $EGREP '^ *State *: *(clean|active) *$' )" ]
    then
      CRITICAL=$(( CRITICAL + 1 ))
    else
      RAIDOK=$(( RAIDOK + 1 ))
    fi
  fi
done

if [ "$CRITICAL" = "0" ]
then
  echo "RAID OK ($RAIDOK/$COUNT)"
else
  echo "RAID CRITICAL ($CRITICAL/$COUNT)"
fi

exit 0

### vim: set shiftwidth=2 softtabstop=2 : ###

En root, quand on fait : /root/prod/snmpd/raidmon on a :

# /root/prod/snmpd/raidmon
RAID OK (2/2)

On attend qu'une simple ligne en retour, avec “OK” ou “CRITICAL” (c'est pour nagios, voir plus loin)

Mais en simple user on aura:

$ /root/prod/snmpd/raidmon
mdadm: cannot open /dev/md0: Permission denied
mdadm: cannot open /dev/md1: Permission denied
RAID CRITICAL (2/2)

Donc, il faudra l'executer en “root”, mais le daemon snmpd ne tourne (idéalement) qu'en simple user snmp. On peut changer en root, mais on ne le fera pas !

On va utiliser sudo !

Donc, aprés avoir configuré “sudo” pour autoriser le user snmp, on fera:

$ sudo /root/prod/snmpd/raidmon
RAID OK (2/2)

Bien !

snmpd.conf

Insérer la commande dans le fichier de conf (exemple):

# TJ ----------
exec raidmon /usr/bin/sudo /root/prod/snmpd/raidmon
# -------------

Puis on redemarre:

# /etc/init.d/snmpd restart

snmpget RAID

$ snmpget -v 2c -c code_secret1 localhost .1.3.6.1.4.1.2021.8.1.101.1
UCD-SNMP-MIB::extOutput.1 = STRING: RAID OK (2/2)

Ou encore:

$ snmpget -v 2c -c code_secret1 localhost UCD-SNMP-MIB::extOutput.1
UCD-SNMP-MIB::extOutput.1 = STRING: RAID OK (2/2)

Un peu plus d'info:

$ snmpwalk -v 2c -On -c code_secret1 localhost .1.3.6.1.4.1.2021.8.1
.1.3.6.1.4.1.2021.8.1.1.1 = INTEGER: 1
.1.3.6.1.4.1.2021.8.1.2.1 = STRING: raidmon
.1.3.6.1.4.1.2021.8.1.3.1 = STRING: /usr/bin/sudo /root/prod/snmpd/raidmon
.1.3.6.1.4.1.2021.8.1.100.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.101.1 = STRING: RAID OK (2/2)
.1.3.6.1.4.1.2021.8.1.102.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.103.1 = STRING:

Si j'ai bien compris, chaque script ajouté dans la conf de “snmpd” ajouter “+1” a l'OID de l'objet, dans l'ordre de leur déclaration.

Donc:

.1.3.6.1.4.1.2021.8.1.1.1
.1.3.6.1.4.1.2021.8.1.1.2
.1.3.6.1.4.1.2021.8.1.1.3
etc...
.1.3.6.1.4.1.2021.8.1.101.1
.1.3.6.1.4.1.2021.8.1.101.2
.1.3.6.1.4.1.2021.8.1.101.3
etc... etc...
brouillon_snmp.1219928493.txt.gz · Dernière modification : 2008/08/28 13:01 de thierry