Mon blog-notes à moi que j'ai

Blog personnel d'un sysadmin, tendance hacker

En route vers Python Protobix 1.0

python-protobix est une implémentation Python du protocole Zabbix Sender qui vous permet de superviser de manière efficace et performante votre infrastructure informatique.

python-protobix 1.0alpha est sur le point d’être publiée. De très nombreux changements sont intervenus.
Petit tour d’horizon.

Support de TLS

python-protobix n’a pas été conçu pour être utilisé en WAN, l’idée étant qu’il est préférable de communiquer en réseau local avec un zabbix_proxy qui, lui, se chargera d’échanger, éventuellement de manière sécurisée, avec le zabbix_server. De fait, le support de TLS ne m’a pas paru important. Je considère en effet qu’au sein d’un LAN maîtrisé, l’utilisation de TLS pose plus de problème (debug) qu’il n’en résout.

Néanmoins, le support TLS est attendu et réclamé par certains utilisateurs de python-protobix. J’ai donc décidé de l’implémenter.

Pour l’instant, le support de TLS repose sur le module Python ssl, essentiellement pour éviter une dépendance supplémentaire avec un autre module.
Malheureusement, le module ssl de Python ne supporte pas TLS-PSK.
Une alternative possible aurait pu être d’utiliser pyOpenSSL, module dont le support et le développement sont actifs, mais celui-ci ne semble pas non plus supporter TLS-PSK.
Enfin, le support d’une solution tierce n’a évidemment pas été retenu pour d’évidentes questions de sécurité: les quelques exemples que j’ai pu trouvé n’ont, bien souvent, pas été mis à jour depuis des mois et je n’ai ni l’envie ni les compétences pour réaliser un audit de code.

Enfin, Zabbix impose l’utilisation de TLS v1.2. C’est une excellente décision d’un point de vue sécurité.
Malheureusement, TLS v1.2 n’est disponible que dans Python >=2.7.9. De facto, cela exclut donc le support de TLS pour les versions antérieures comme, par exemple, celle fournie avec Debian Wheezy.

Sauf surprise, python-protobix ne devrait donc supporter que le chiffrement basé sur des certificats.
De plus, TLS ne sera disponible que pour Python >= 2.7.9

Respecter le comportement de zabbix_sender

python-protobix est une implémentation en Python du protocole Zabbix Sender. Le pendant côté Zabbix est l’utilitaire zabbix_sender. Il est donc logique de respecter l’implémentation de ce dernier dans python-protobix.

zabbix_sender envoie un maximum de 250 items à la fois au zabbix_server, afin de garantir que le traitement de ces items se fera dans des délais raisonnables.
python-protobix de son côté était beaucoup plus brutal: il envoyait tout d’un coup.

Je n’ai jamais constaté de problème avec cette approche. Néanmoins, il reste préférable de respecter le comportement de zabbix_sender: si cette limite de 250 (ou quelque soit la valeur en fait) devenait une contrainte dans une version future de Zabbix, il faudrait patcher en urgence python-protobix. Autant anticiper pour éviter un éventuel problème :)

À chaque problème, sa solution

D’autres problèmes concernaient le design du module.

Gestion des options de configuration

Problème
python-protobix à la possibilité de lire le fichier de configuration du zabbix_agent et d’utiliser ces options pour s’auto-configurer.
Ces options peuvent être surchargées par la sonde, sous forme d’arguments passés en ligne de commande. Néanmoins, l’implémentation reposait sur optparse qui est déprécié.
De plus, l’ajout de nouvelle options s’est fait de manière quelque peu anarchique et, notamment, sans cohérence avec les options existantes de Zabbix, par exemple celles de zabbix_sender.
Solution
J’ai décidé de passer de optparse à argparse pour la gestion des options de la ligne de commande.
La configuration est à présent regroupée et gérée dans une classe unique de python-protobix: ZabbixAgentConfig.
Enfin, les options de la ligne de commande de la sonde SampleProbe sont à présent les mêmes que celles de zabbix_sender.

Sous réserve d’être quelque peu familier avec zabbix_sender, le passage à python-protobix en sera donc facilité.

Duplication de code, code « spaghetti »

Problème
le code de python-protobix est devenu de plus en plus complexe au fil du temps, pour gérer plusieurs cas de figure différents avec le moins de modification de code.
Malheureusement, l’effet escompté n’a pas été au rendez-vous. Au lieu de simplifier le code, je n’ai fait que le complexifier, à tel point qu’il m’a fallu 10 minutes pour me souvenir de l’utilité d’une ligne de code!
Solution
Plusieurs parties du code de python-protobix ont donc été ré-écrites, pour obtenir une plus grande cohérence, mais aussi pour le simplifier.
La principale conséquence est le changement d’API du module, sans rétro-compatibilité, d’où le passage à une version 1.0.
L’avantage, cependant, est qu’il devrait être encore plus simple d’utiliser python-protobix.
De plus, les utilisateurs de la sonde SampleProbe ne devraient être concernés que par la migration de optparse vers argparse.

Amélioration des tests

Problème
Quelques tests existaient bien dans python-protobix. Mais il étaient relativement peu nombreux, ne couvraient pas l’intégralité du code et, de plus, reposaient sur l’utilisation d’un serveur Zabbix écrit en Python… en réutilisant du code de python-protobix. Pas la meilleure façon de tester donc.
Enfin, il manquait un test permettant de détecter les fuites mémoires. C’est un problème que j’avais déjà rencontré, et résolu, dans une version précédente de python-protobix avec la gestion des socket. Il manquait un test pour vérifier que les modifications apportées au code ne ré-introduisent pas ce type de problème.
Solution
python-protobix aura donc une suite de tests plus complète, ne dépendant d’aucun serveur Zabbix.
Quelques tests permettent toutefois de vérifier le bon fonctionnement de l’intégralité de la chaîne. Ils nécessitent un serveur Zabbix fonctionnel et sont donc exclus du jeu de test par défaut.
La détection de fuite mémoire est assurée par un test simulant un processus persistent.

Amélioration de la documentation

La documentation actuelle n’est malheureusement pas à jour. La prochaine version corrigera bien entendu ce problème, et je ferai en sorte que les versions suivantes le soient également.

Conclusion

Avec de nombreuses modifications et de nouvelles fonctionnalités comme TLS, python-protobix devrait être publié peu après la conférence Zabbix 2016.

Les nouvelles fonctionnalités de python-protobix 1.0 ainsi que les exemples d’utilisation seront détaillées dans de futurs billets.