IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut TCL faire du snmpv3 à partir de scotty (tnm & tkined)
    Bonjour,
    [PC linux Ubuntu 18.04, tcl et tk 8.6, Tnm3.1.0]
    Je souhaite créer un petit gestionnaire réseau. Pour l'instant, j'interroge mon client snmp local (snmpd). Avec le protocole snmpv2c tout fonctionne. Je souhaite passer maintenant au protocole v3. J'ai donc créer un utilisateur userV3 avec une authentification SHA et un cryptage DES. Plusieurs méthodes pour poller mon PC :

    1/ la commande en ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /usr/bin/snmpget -u userDesV3 -v3 -a SHA -A cesnac_SNMPV3 -x DES -X cesnac_SNMPV3 localhost .1.3.6.1.2.1.1.9.1.4.11
    SNMPv2-MIB::sysORUpTime.11 = Timeticks: (930) 0:00:09.30
    Elle fonctionne très bien.

    2/ la même commande en ligne utilisée dans mon programme tcl, "en mode asynchrone"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    proc lectureNotif { trap } {
        global termine
        if { [ catch { set paquet [ read $trap ] } err ] }	{
            syslog debug "LectureTrap : rupture de connexion $err"
            set termine 1
        } else {
            if {$paquet!=""}	{
                syslog info "snmpv3 : $paquet"
            } else {
                syslog info "snmpv3 : on sort"
                set termine 1
                return
            }
        }
    }
    set requete "/usr/bin/snmpget -u userDesV3 -v3 -a SHA -A xxxxx_SNMPV3 -x DES -X xxxxx_SNMPV3 localhost .1.3.6.1.2.1.1.9.1.4.11"
    set notif [ open "| $requete" r ]
    fileevent $notif readable { lectureNotif $notif }
    fconfigure $notif -blocking no
    vwait termine
    Elle fonctionne très bien.

    3/ Enfin l'utilisation des paquets Tnm en mode asynchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package require Tnm
    proc walkproc {version s stat vbl} {
        if {$stat == "noError"} {
            syslog info "$version : $s [Tnm::snmp value $vbl 0] ; [Tnm::snmp value $vbl 1]"
        } else  {
            syslog info "$version : $s $stat"
        }
    }
    set s [Tnm::snmp generator -address localhost -version SNMPv3 -user userDesV3 \
                -authPassWord xxxxx_SNMPV3 -privPassWord xxxxx_SNMPV3 -authKey SHA -privKey DES  ]
        $s get {.1.3.6.1.2.1.1.9.1.4.11} { walkproc "testGetV3" %S %E "%V" }
    }
    Tnm::snmp wait
    Et là ça ne marche pas !, je reçois la réponse au bout de 3 secondes : noResponse.

    Voilà mon problème, alors oui je pourrai m'en passer, mais je suis têtu... Et puis utiliser Tnm aurait plus de gueule que de lancer constamment des process via exec...
    Merci pour un dépannage ou une orientation.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Aujourd'hui, j'ai choisit d'utiliser l’interpréteur scotty au lieu de tclsh, inutile de charger Tnm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/scotty3.1.0
    set s [Tnm::snmp generator -address localhost -version SNMPv3 -user userDesV3 \
                -authPassWord xxxxx_SNMPV3 -privPassWord xxxxx_SNMPV3 \
                -authKey SHA -privKey DES ]
    syslog info $s
    $s get {system.9.1.4.11} { puts "[Tnm::snmp value %V 0] [Tnm::snmp value %V 1]"  }
    Malheureusement, vous l'aurez deviné, NoResponse !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Au niveau des paquets, on n'a pas du tout la même chose.
    Une commande qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Apr 15 16:06:31 localhost snmpd[1458]: #012Received 64 byte packet from UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: 0000: 30 3E 02 01  03 30 11 02  04 73 23 FC  66 02 03 00    0>...0...s#.f...
    Apr 15 16:06:31 localhost snmpd[1458]: 0016: FF E3 04 01  04 02 01 03  04 10 30 0E  04 00 02 01    ..........0.....
    Apr 15 16:06:31 localhost snmpd[1458]: 0032: 00 02 01 00  04 00 04 00  04 00 30 14  04 00 04 00    ..........0.....
    Apr 15 16:06:31 localhost snmpd[1458]: 0048: A0 0E 02 04  35 DC D5 F8  02 01 00 02  01 00 30 00    ....5.........0.
    Apr 15 16:06:31 localhost snmpd[1458]: 
    Apr 15 16:06:31 localhost snmpd[1458]: Connection from UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: #012Sending 116 bytes to UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: 0000: 30 72 02 01  03 30 11 02  04 73 23 FC  66 02 03 00    0r...0...s#.f...
    Apr 15 16:06:31 localhost snmpd[1458]: 0016: FF E3 04 01  00 02 01 03  04 22 30 20  04 11 80 00    ........."0 ....
    Apr 15 16:06:31 localhost snmpd[1458]: 0032: 1F 88 80 F9  94 E2 54 42  91 84 5E 00  00 00 00 02    ......TB..^.....
    Apr 15 16:06:31 localhost snmpd[1458]: 0048: 01 0E 02 02  54 9F 04 00  04 00 04 00  30 36 04 11    ....T.......06..
    Apr 15 16:06:31 localhost snmpd[1458]: 0064: 80 00 1F 88  80 F9 94 E2  54 42 91 84  5E 00 00 00    ........TB..^...
    Apr 15 16:06:31 localhost snmpd[1458]: 0080: 00 04 00 A8  1F 02 04 35  DC D5 F8 02  01 00 02 01    .......5........
    Apr 15 16:06:31 localhost snmpd[1458]: 0096: 00 30 11 30  0F 06 0A 2B  06 01 06 03  0F 01 01 04    .0.0...+........
    Apr 15 16:06:31 localhost snmpd[1458]: 0112: 00 41 01 6C                                           .A.l
    Apr 15 16:06:31 localhost snmpd[1458]: 
    Apr 15 16:06:31 localhost snmpd[1458]: #012Received 124 byte packet from UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: 0000: 30 7A 02 01  03 30 11 02  04 73 23 FC  65 02 03 00    0z...0...s#.e...
    Apr 15 16:06:31 localhost snmpd[1458]: 0016: FF E3 04 01  04 02 01 03  04 2B 30 29  04 11 80 00    .........+0)....
    Apr 15 16:06:31 localhost snmpd[1458]: 0032: 1F 88 80 F9  94 E2 54 42  91 84 5E 00  00 00 00 02    ......TB..^.....
    Apr 15 16:06:31 localhost snmpd[1458]: 0048: 01 0E 02 02  54 9F 04 09  75 73 65 72  44 65 73 56    ....T...userDesV
    Apr 15 16:06:31 localhost snmpd[1458]: 0064: 33 04 00 04  00 30 35 04  11 80 00 1F  88 80 F9 94    3....05.........
    Apr 15 16:06:31 localhost snmpd[1458]: 0080: E2 54 42 91  84 5E 00 00  00 00 04 00  A0 1E 02 04    .TB..^..........
    Apr 15 16:06:31 localhost snmpd[1458]: 0096: 35 DC D5 F7  02 01 00 02  01 00 30 10  30 0E 06 0A    5.........0.0...
    Apr 15 16:06:31 localhost snmpd[1458]: 0112: 2B 06 01 02  01 01 09 01  04 0A 05 00                 +...........
    Apr 15 16:06:31 localhost snmpd[1458]: 
    Apr 15 16:06:31 localhost snmpd[1458]: Connection from UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: #012Sending 125 bytes to UDP: [127.0.0.1]:41220->[127.0.0.1]:161
    Apr 15 16:06:31 localhost snmpd[1458]: 0000: 30 7B 02 01  03 30 11 02  04 73 23 FC  65 02 03 00    0{...0...s#.e...
    Apr 15 16:06:31 localhost snmpd[1458]: 0016: FF E3 04 01  00 02 01 03  04 2B 30 29  04 11 80 00    .........+0)....
    Apr 15 16:06:31 localhost snmpd[1458]: 0032: 1F 88 80 F9  94 E2 54 42  91 84 5E 00  00 00 00 02    ......TB..^.....
    Apr 15 16:06:31 localhost snmpd[1458]: 0048: 01 0E 02 02  54 9F 04 09  75 73 65 72  44 65 73 56    ....T...userDesV
    Apr 15 16:06:31 localhost snmpd[1458]: 0064: 33 04 00 04  00 30 36 04  11 80 00 1F  88 80 F9 94    3....06.........
    Apr 15 16:06:31 localhost snmpd[1458]: 0080: E2 54 42 91  84 5E 00 00  00 00 04 00  A2 1F 02 04    .TB..^..........
    Apr 15 16:06:31 localhost snmpd[1458]: 0096: 35 DC D5 F7  02 01 00 02  01 00 30 11  30 0F 06 0A    5.........0.0...
    Apr 15 16:06:31 localhost snmpd[1458]: 0112: 2B 06 01 02  01 01 09 01  04 0A 43 01  01             +.........C..
    Apr 15 16:06:31 localhost snmpd[1458]:
    Une demande à partir du programme tcl, qui ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Apr 15 16:08:02 localhost snmpd[1458]: #012Received 88 byte packet from UDP: [127.0.0.1]:35849->[127.0.0.1]:161
    Apr 15 16:08:02 localhost snmpd[1458]: 0000: 30 56 02 01  03 30 10 02  04 5C EB F6  B0 02 02 40    0V...0...\.....@
    Apr 15 16:08:02 localhost snmpd[1458]: 0016: 00 04 01 04  02 01 03 04  19 30 17 04  00 02 01 00    .........0......
    Apr 15 16:08:02 localhost snmpd[1458]: 0032: 02 01 00 04  09 75 73 65  72 44 65 73  56 33 04 00    .....userDesV3..
    Apr 15 16:08:02 localhost snmpd[1458]: 0048: 04 00 30 24  04 00 04 00  A0 1E 02 04  5C EB F6 B0    ..0$........\...
    Apr 15 16:08:02 localhost snmpd[1458]: 0064: 02 01 00 02  01 00 30 10  30 0E 06 0A  2B 06 01 02    ......0.0...+...
    Apr 15 16:08:02 localhost snmpd[1458]: 0080: 01 01 09 01  04 0B 05 00                              ........
    Apr 15 16:08:02 localhost snmpd[1458]: 
    Apr 15 16:08:02 localhost snmpd[1458]: Connection from UDP: [127.0.0.1]:35849->[127.0.0.1]:161
    Apr 15 16:08:02 localhost snmpd[1458]: #012Sending 125 bytes to UDP: [127.0.0.1]:35849->[127.0.0.1]:161
    Apr 15 16:08:02 localhost snmpd[1458]: 0000: 30 7B 02 01  03 30 11 02  04 5C EB F6  B0 02 03 00    0{...0...\......
    Apr 15 16:08:02 localhost snmpd[1458]: 0016: FF E3 04 01  00 02 01 03  04 2B 30 29  04 11 80 00    .........+0)....
    Apr 15 16:08:02 localhost snmpd[1458]: 0032: 1F 88 80 F9  94 E2 54 42  91 84 5E 00  00 00 00 02    ......TB..^.....
    Apr 15 16:08:02 localhost snmpd[1458]: 0048: 01 0E 02 02  54 F9 04 09  75 73 65 72  44 65 73 56    ....T...userDesV
    Apr 15 16:08:02 localhost snmpd[1458]: 0064: 33 04 00 04  00 30 36 04  11 80 00 1F  88 80 F9 94    3....06.........
    Apr 15 16:08:02 localhost snmpd[1458]: 0080: E2 54 42 91  84 5E 00 00  00 00 04 00  A8 1F 02 04    .TB..^..........
    Apr 15 16:08:02 localhost snmpd[1458]: 0096: 5C EB F6 B0  02 01 00 02  01 00 30 11  30 0F 06 0A    \.........0.0...
    Apr 15 16:08:02 localhost snmpd[1458]: 0112: 2B 06 01 06  03 0F 01 01  04 00 41 01  6D             +.........A.m
    Apr 15 16:08:02 localhost snmpd[1458]:
    Le premier paquet est complètement différent...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    C'est encore moi, avec du python que je ne maîtrise pas trop donc un petit programme simple avec le protocole snmpv2c puis snmpv3 pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/python3.6
    from pysnmp.hlapi import *
    g = getCmd(SnmpEngine(),
        CommunityData('public'),
        UdpTransportTarget(('localhost', 161)),
        ContextData(),
        ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysORUpTime', 11)))
    res = next(g)
    print("{}\n".format(res))
    g = getCmd(SnmpEngine(),
        UsmUserData('userDesV3',authKey='xxxxx_SNMPV3',privKey='xxxxx_SNMPV3',authProtocol=usmHMACSHAAuthProtocol,privProtocol=usmDESPrivProtocol),
        UdpTransportTarget(('localhost', 161)),
        ContextData(),
        ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysORUpTime', 11)))
    res = next(g)
    print("{}".format(res))
    ET CA MARCHE !

    Bon, je voudrai bien rester avec tcl que je connais plutôt bien...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    En fouillant dans le code source, il ne fait référence qu'à RFC 2272 pour le snmpv3 autant dire obsolète de chez obsolète.
    Il y a une incompatibilité dans le dialogue...

    Je vais fouiller un peu plus le code mais je crois que c'est foutu...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    En cherchant dans les paquets, j'ai observé que :
    • avec la commande en ligne snmpget, on remarque que la requête ne possède pas ni de user ni securityEngineID. La réponse de l'Agent SNMP (snmpd de mon PC) intègre un numéro de securityEngineID mais ne donne pas le résultat de la requête. Le Master agent renvoie donc une requête avec le numéro de securityEngineID. L'Agent envoie un second paquet avec le résultat !
    • avec mon petit programme en TCL avec la librairie Tnm::snmp, un premier paquet est envoyé avec le user mais sans le securityEngineID. L'Agent répond avec avec son propre securityEngineID. Le petit programme renvoie un nouveau paquet mais toujours sans le securityEngineID, etc... Au bout de 3 demandes ça s'arrête.


    On note dans le RFC 3414 : Note that an empty securityEngineID is OK for a Request message, because that will cause the remote (authoritative) SNMP engine to return a Report PDU with the proper securityEngineID included in the msgAuthoritativeEngineID in the securityParameters of that returned Report PDU.


    Je me dit alors : récupère le securityEngineId et met le dans ta commande :
    set s [Tnm::snmp generator -address bertrand -version SNMPv3 -user xxxxxxxx \
    -authPassWord xxxxxxxxx -privPassWord xxxxxxxx \
    -authKey SHA -privKey DES -engineID 80001F8880F994E2544291845E00000000 ]
    Et ça marche, j'ai bien la réponse à la requête ! mais quelques remarques :
    • les infos ne sont pas cryptées et ça ce n'est pas terrible...
    • évidemment, si je mais n'importe quoi pour les options -authKey TOTO -privKey TITI, il s'en fiche
    • si je mets l'option -security "sha/des" j'ai une erreur de segmentation...


    Cela signifie peut-être que la configuration de l'Agent est incomplète puisqu'il accepte de dialoguer sans cryptage...
    Peut-être à suivre...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Bon, j'ai creusé un peu, confinement...

    Je n'avais pas bien compris la notion de "Report PDU". Mais en cherchant dans les paquets, on trouve un octet (A8) qui signifie que ce message de retour est un Rapport "de non conformité". Les paquets SNMP n'ont plus de secret pour moi

    Le traitement du message reçu, réalisé par les outils "tnm" ne tient pas compte du problème. Il relève bien cette valeur A8 (ASN1_SNMP_REPORT) mais réalise une nouvelle demande "request" avec le même paquet.

    L'évolution serait qu'il remonte au niveau Application le problème qui est décrit dans le paquet réponse (usmStatsUnknownUserNames) dans le cas d'un nom (userName) incorrect par exemple. Mais ça c'est une autre histoire, il faut bien maîtriser le C et surtout ne pas se perdre dans les structures...

    A plouch

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/09/2011, 18h14
  2. [HTML] Faire un lien à partir d'un lecteur cd
    Par Bourak dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/07/2006, 08h55
  3. [FPDF] Faire du pdf à partir de code php/html
    Par PedroBD dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/06/2006, 16h28
  4. Faire un variable à partir d'un mot dans un txt
    Par Apophis03 dans le forum C
    Réponses: 16
    Dernier message: 21/12/2005, 15h53
  5. Comment faire du MDX à partir d'une requete SQL?
    Par Immobilis dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 10/11/2005, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo