--- title: "Pysnmp: outil Python pour SNMP (authPriv v3)" date: 2019-11-27T22:50:53+01:00 description: "pysnmp : outil Python pour SNMP ; utilisation sous OpenBSD, principalement v3 avec authentification forte" draft: false tags: ["OpenBSD", "Python3", "SNMP", "client"] --- ## Description **pysnmp** est une librairie en Python, multiplateforme pour {{< abbr SNMP "Simple Network Management Protocol" >}}, capable d'agir en tant qu'agent, gestionnaire, proxy, sur les trois versions du protocole SNMP, de "discuter" sur les protocoles réseaux IPv(4|6). Le propos est de *(dé)* montrer l'utilisation de **pysnmp** avec l'authentification forte de la v3 de SNMP. ## Documentation * La documentation officielle de la librairie : http://snmplabs.com/pysnmp/ ## Installation * OpenBSD 6.6 * Version : 4.4.6 Sous OpenBSD, nous avons un paquet tiers : `# pkg_add py3-snmp` Malheureusement, cette version ne semble pas *(pleinement ?)* fonctionnelle. Donc, installons-le par le biais de l'outil `pip` : `# python3.7 -m pip install --upgrade --user pysnmp` ### Travailler avec les MIB OpenBSD L'équipe OpenBSD a créé ses propres {{< abbr MIB "Management Information Base" >}} - *ce sont des arborescences de données, que l'on peut aussi appeler "base de données arborescente"* - **pysnmp** nativement n'est pas capable de les interroger. Mais heureusement, on peut lui "donner à manger". Avec **pysnmp** est fourni un outil nommé `mibdump.py` - *depuis la v4.3 ; avant il fallait utiliser `build-pysnmp-mib.py`* -, et lui indiquer le chemin des MIB d'OpenBSD. Ces MIB sont fournis dans le répertoire `/usr/share/snmp/mibs/`. {{< code "sys-openbsd-pysnmp-mibdump" sh >}} *je n'ai volontairement recopié que la sortie écran du premier fichier* Les lignes à vérifier sont : * `MIBs to compile` qui nous montre quel fichier est compilé * `Created/updated MIBs` qui nous restitue le nom du nouveau fichier compilé * `Ignored MIBs` et `Failed MIBs` qui peut informer des informations MIB défectueuses ou ignorées Une fois le traitement terminé, les nouveaux fichiers compilés ont été créés dans : `~/.pysnmp/mibs/` Mais avant de (sa?)voir comment utiliser les fichiers MIB nouvellement créés, voyons comment utiliser **pysnmp** dans le contexte de SNMPv3.
Je m'attarderais très particulièrement sur la manière de l'utiliser avec l'authentification forte. ## Coding Appelons l'outil : {{< code "sys-openbsd-pysnmp-code-import" python3 >}} Puis paramétrons les variables nécessaires pour l'authentification forte, à savoir : {{< code "sys-openbsd-pysnmp-code-variables" python3 >}} *j'ai repris celles de l'exemple, dans l'article sur l'outil natif à OpenBSD, {{< inside2 t="snmp" l="sys:openbsd:snmp" a="authentification-forte" >}}, ni plus ni moins.* ### SNMP Engine, MIB View Controller Une des premières choses à déclarer est le **Contrôleur de Vue MIB**, qui nécessite la création d'un **moteur SNMP** : {{< code "sys-openbsd-pysnmp-code-se-mvc" python3 >}} Et, maintenant, nous allons voir comment appeler les MIB d'OpenBSD ! ### OID + MIB {{< code "sys-openbsd-pysnmp-code-oid-mib" python3 >}} * `ObjectIdenttity()` : en premier, nous construisons un objet identifiant, selon un OID précis que nous recherchons - *ici le nombre d'interfaces vues par la MIB PF d'OpenBSD* * `addMibSource()` : référence le chemin où ont été créé les fichiers MIB précédemment * `loadMibs()` : pour appeler chacun des fichiers MIB créés précédemment - *pour info, selon l'OID recherché, il n'est pas forcément nécessaire de toutes les charger* - * `resolvedWithMib()` : nous permet d'appliquer le Contrôleur de Vue MIB sur l'objet Continuons avec la gestion des données utilisateurs nécessaires à l'identification : ### USM User Data {{< code "sys-openbsd-pysnmp-code-usmuserdata" python3 >}} Pour information, les différentes valeurs du protocole de chiffrement d'authentification sont : * `usmNoAuthProtocol` pour aucun protocol * `usmHMACMD5AuthProtocol` pour le chiffrement `MD5` * `usmHMACSHAAuthProtocol` pour `SHA` * `usmHMAC128SHA224AuthProtocol` pour `SHA-224` * `usmHMAC192SHA256AuthProtocol` pour `SHA-256` * `usmHMAC256SHA384AuthProtocol` pour `SHA-384` * `usmHMAC384SHA512AuthProtocol` pour `SHA-512` Concernant le chiffrement du protocole de confidentialité, ces valeurs sont : * `usmNoPrivProtocol` si aucun * `usmDESPrivProtocol` pour `DES` * `usmAesCfb128Protocol` pour `AES` *(Pour information, il en existe d'autres, mais ce sont surtout des "drafts", du moins pour l'instant !)* ### Générateur Nous avons besoin de construire le générateur de la commande `get` : {{< code "sys-openbsd-pysnmp-code-generator" python3 >}} ### Retourner le résultat {{< code "sys-openbsd-pysnmp-code-final" python3 >}} *ne pas s'inquiéter du temps que mets la requête à s'afficher ; cela est dû au chiffrement des informations* L'exécution nous retourne ceci : {{< code "sys-openbsd-pysnmp-code-result" python3 >}} ### Fin Pour finir, nous venons de voir que discuter avec l'outil **pysnmp** sur SNMPv3 avec authentification forte **EST** possible. Le plus délicat est de récupérer les informations dans les MIB. Trés vite, vous allez avoir à buter sur des erreurs incompréhensibles, et difficiles à résoudre.
Et, ça, ça le don de m'énerver ! *(enfin presque…)* ## Remerciements * J'ai beaucoup appris grâce à cet [article](https://makina-corpus.com/blog/metier/2016/initiation-a-snmp-avec-python-pysnmp-partie2), trouvé sur le site **Makina Corpus**. ----