TP-Link Easy Smart Switches est une famille de commutateurs gérés capables de prendre en charge les groupes de QoS, VLAN et les groupes d'agrégation de liens (LAG). Ils sont gérés via une interface Web, donnant à un certain nombre de fonctions, y compris les compteurs de paquets de base par rapport. Malheureusement, ces commutateurs n'implémentent pas SNMP pour l'accès à ces compteurs, et ne semblent pas implémenter une URL discrète pour l'accès direct à ces informations. Ce projet aborde ce problème pour produire des statistiques par rapport à partir d'une seule invocation de ligne de commande avec une sortie qui peut être analysée trivialement pour la sortie formatée, ou entrée dans un système de surveillance comme Zabbix.
Ce projet a été testé contre les modèles de commutation TP-Link TL-SG1016DE et TL-SG108E. Il devrait également être compatible avec les autres membres de cette famille, y compris le TL-SG105E et TL-SG1024DE.
*** AVERTISSEMENT ***
La famille Easy Smart Switch a un certain nombre de vulnérabilités non résolues, notamment CVE-2017-17746. Comme décrit dans https://seclists.org/fulldisclosure/2017/dec/67, une fois qu'un utilisateur d'une adresse IP source donnée s'authentifie à l'interface de gestion Web du commutateur, tout autre utilisateur de cette même adresse IP source est traité comme authentifié.
Les scripts Python de ce projet ne doivent être utilisés qu'à partir d'un hôte qui n'a pas d'accès général à l'utilisateur.
Essstat.py est un utilitaire léger est utilisé pour retirer les statistiques du port du commutateur et la sortie dans un format facilement analysé. Un code supplémentaire sera ajouté à l'analyse et à la sortie ou à la stockage de ces statistiques.
Cette application Python légère effectue une connexion rapide via l'interface administrative Web du commutateur, puis interroge l'unité pour les statistiques de port actuelles. Les informations d'identification pour accéder à l'unité sont transmises sur la ligne de commande. L'utilité a été codée avec Python 3.6 et utilise la belle bibliothèque de soupe.
essstat.py [-h] [-1] [-d] -p TPpswd [-s] [-u TPuser] TPhost
TPhost IP address or hostname of switch
-h, --help show this help message and exit
-1, --1line output in a single line
-d, --debug activate debugging output
-j, --json output in JSON format
-p TPpswd, --password TPpswd
password for switch access
-s, --statsonly output post statistics only
-u TPuser, --username TPuser
username for switch access
$ essstat.py myswitch -p ChangeMe
2020-03-28 11:25:15
max_port_num=8
1;Enabled;Link Down;0,0,0,0
2;Enabled;10M Full;3568644976,0,3144940915,0
3;Enabled;1000M Full;237232286,0,66662515,0
4;Enabled;1000M Full;4019260430,0,3721138807,0
5;Enabled;1000M Full;1300360968,0,355032522,0
6;Enabled;Link Down;0,0,0,0
7;Enabled;1000M Full;2903398648,0,4293632425,5
8;Enabled;Link Down;0,0,0,0
Le moyen le plus simple d'accumuler des données à partir des commutateurs est de faire en sorte que EssStat.py exécute avec l'option --1line et ajoutez la sortie dans un fichier CSV. Vous pouvez ensuite réduire une copie du fichier CSV et traiter les données brutes via ce classeur Excel pour produire un tableau dynamique qui recouvre automatiquement les données disponibles.
La première étape consiste à configurer un répertoire où les fichiers CSV accumuleront les données. J'ai choisi d'exécuter tout cela sous l'utilisateur de Zabbix qui prend en charge l'application de surveillance sur cet hôte. Vous pouvez choisir un utilisateur différent, mais assurez-vous simplement que le groupe du répertoire correspond au groupe de l'utilisateur que vous utiliserez.
$ ls -ald /var/log/essstat
drwxrwxr-x. 2 root zabbix 68 Mar 30 10:56 /var/log/essstat
Ensuite, créez le ou les travaux CRON pour la collecte de données périodiques. Pour ce faire, créez le fichier /etc/cron.d/essstat et ajoutez un calendrier pour chaque commutateur que vous surveillez. Pour faire de cette auto-entretien raisonnablement, incluez l'année en cours dans le cadre de la spécification du fichier CSV.
*/10 * * * * zabbix /usr/local/bin/essstat.py -1 -p ChangeMe1 orange >> /var/log/essstat/essstat-orange-`date +%G`.csv
*/10 * * * * zabbix /usr/local/bin/essstat.py -1 -p ChangeMe2 black >> /var/log/essstat/essstat-black-`date +%G`.csv
Dans l'exemple ci-dessus, deux commutateurs sont surveillés, nommés orange et black . Pour chaque commutateur, la collecte de données fonctionnera toutes les 10 minutes à partir de chaque heure. Les données d' orange seront accumulées dans le fichier /var/log/essstat/essstat-orange-2020.csv pendant l'année civile 2020.
Ce classeur Excel macro compatible est probablement le meilleur moyen de lire et de tracer les statistiques du port. Le classeur construira automatiquement une requête et exécutera une opération Web Get contre le serveur de surveillance à l'aide du script essstat2.cgi . Pour configurer le classeur de votre installation locale, le nom défini essstatBaseURL doit être modifié pour pointer vers le serveur Web opérant sur votre hôte de surveillance et le nom du script CGI. Pour faire cette mise à jour dans Excel 2019 sur Windows, cliquez sur l'onglet Formules Excel, puis cliquez sur le bouton Name Manager sur le ruban. Cliquez sur l'entrée pour essstatBaseURL et modifiez l'entrée en fonction. Assurez-vous de cliquer sur le bouton avec la coche verte pour enregistrer la modification, fermez la boîte de dialogue et enregistrez le classeur mis à jour. Cela ne doit être fait qu'une seule fois.
Lorsque vous utilisez le classeur, le nom du commutateur et les rapports depuis et à ce jour / heures sont spécifiés dans le tableau des paramètres en haut à gauche de l'onglet WebData . Cliquez sur le bouton Update From Web pour récupérer les données dans la table et mettre à jour dynamiquement le tracé de l'onglet PPS du graphique . Si le commutateur à l'étude n'a que huit ports, les ports supplémentaires seront cachés automatiquement.
Le nom du commutateur et la métrique tracée apparaît dans le titre du graphique. Une fois les mesures chargées dans le tableau, les différentes mesures peuvent être chargées dans le graphique en sélectionnant les choix de la cellule déroulante à côté de l' label. Moving between theses metrics for the same switch does *not* require doing another mise à jour de l'opération Web.
Le tableau de l'onglet * LocalPortNames vous permet de remplacer les noms de port par défaut affichés dans le graphique. Ce tableau est entièrement facultatif et la définition des entrées pour tous les ports d'un commutateur donné n'est pas requise (il est parfaitement bien de définir les remplacements de nom de port pour quelques ports pour un commutateur donné). Si vous avez plusieurs commutateurs, vous pouvez ajouter des entrées pour tous dans une seule table.
Ce prototype de classeur Excel peut être utilisé pour traiter une copie de la sortie de données brutes --1line de Essstat.py qui s'est accumulée dans un fichier CSV. Commencez par copier le fichier sur un nouveau nom, en incorporant le nom du commutateur surveillé. Ce sera le carnet de surveillance du commutateur. Par exemple:
C:usermeDocuments> copy essstat-TPLhost.xlsx essstat-orange.xlsx
Ensuite, téléchargez une copie des données CSV qui a été accumulée sur votre hôte de surveillance et ouvrez-la dans Excel, ainsi que le classeur de surveillance des commutateurs. À ce stade, vous devrez copier les données du CSV vers l'onglet RawData du carnet de surveillance du commutateur par valeur . Pour ce faire, accédez au fichier CSV dans Excel et sélectionnez la cellule supérieure gauche, A1 . Dans Windows, vous pouvez utiliser la séquence de touches Ctrl-Shift-End pour sélectionner toutes les données, puis appuyez sur Ctrl-Insert pour le copier tout. Accédez ensuite au classeur de surveillance du commutateur et sélectionnez la première cellule de données dans l'onglet RawData en A2 (cellule supérieure-gauche, sous les en-têtes). Faites un clic droit et choisissez l'option pour coller les valeurs. Avec les données brutes en place, vous devez faire défiler vers le bas pour noter la dernière ligne peuplée. Le fichier CSV d'origine peut désormais être fermé.
Cliquez sur l'onglet Tableau PPS pour étendre le tableau d'analyse et sélectionnez la métrique à tracer. La clé consiste à étendre la plage de table structurée pour correspondre à la RawData disponible. Appuyez sur Ctrl-End pour localiser l'extrémité du tableau. Souris sur le minuscule carré dans le coin inférieur gauche de la cellule jusqu'à ce que le pointeur de la souris se transforme en un réticule. Cliquez et faites glisser vers le même numéro de ligne que le dernier numéro de ligne peuplé dans l'onglet RawData . Toutes les formules et plages dans la table PPS et le graphique PPS s'étendront automatiquement.
Il y a quatre mesures qui sont suivies pour chaque port: TX Bons paquets, TX Bad Packets, Rx Good PKTS et RX Bad PKTS. La liste déroulante à la cellule B2 sur l'onglet Table PPS est utilisée pour sélectionner quelle métrique doit être remplie dans le tableau et graphique.
Ce script CGI est utilisé pour interroger les données CSV qui ont été accumulées sur votre hôte de surveillance et retourner les entrées correspondantes. Le CGI est autonome, en s'appuyant uniquement sur l'accès à AWK pour l'exécution d'un simple script en ligne. Il y a trois variables implémentées dans le CGI:
Notez que les spécifications de date / heure partielles sont autorisées, car les entrées correspondantes sont déterminées par une simple comparaison de chaînes. Les dates de et à des dates sont autorisées à s'étendre sur une limite d'une année (par exemple de 2019 à 2020).
Pour interroger le serveur de surveillance des statistiques de port pour le commutateur connu sous le nom d'Orange pour la plage de temps du 23/02/2020 00:00 au 3/7/2020 11:30, l'URI ressemblerait:
http://monitoring.mydomain.com/cgi-bin/essstat.cgi?esTPLhost=orange&esTo=2020-03-07%2011:30&esFrom=2020-02-23
Ce script CGI est conçu pour prendre en charge le fonctionnement du classeur essstat.xlsm Excel. Le script prend en charge les mêmes paramètres de requête que essstat.cgi et renvoie des données pour les mêmes mesures. Cependant, au lieu de retourner le nombre de paquets bruts dans chaque enregistrement, essstat2.cgi renverra les paquets moyens par seconde depuis le record précédent. Le script calculera le temps delta réel entre l'enregistrement actuel et précédent pour s'assurer que le taux est exact. Le script a également une manipulation pour les compteurs individuels réinitialisant à zéro car ils enveloppent la taille entière maximale du compteur. Dans un tel cas, le paquet par deuxième taux à partir de l'intervalle précédent sera retourné pour la statistique affectée.
Le commutateur Smart TP-Link Easy a plus de capacités qu'un commutateur complètement non géré. Cependant, l'environnement de gestion est relativement fermé, avec seulement un client de gestion propriétaire (utilité de configuration intelligente facile) ou une page de gestion basée sur le Web sur le commutateur disponible. De plus, il n'y a pas de support pour surveiller le commutateur avec SNMP. Cela signifie que notre seule entrée dans le commutateur sera via le protocole utilisé par le client propriétaire, ou en faisant l'échec de l'interface de gestion basée sur le Web sur le commutateur.
Tout d'abord, un petit arrière-plan sur le protocole de configuration Smart Easy Smart (ESCP) de base UDP que ce projet n'utilise pas . L'utilitaire de configuration Smart Easy interagit avec le commutateur par rapport à UDP avec les diffusions. Le client enverra une diffusion UDP du port 29809 à 29808 d'un paquet de découverte spécialement codé. Les commutateurs compatibles sur le réseau diffuseront une réponse du port 29808 à 29809 que l'inclusion du nom, du modèle et de l'adresse IP du commutateur. À partir de ce moment, il appartient au client d'encoder une séquence de connexion et de diffuser cela sur le réseau, avec l'attente que le commutateur cible spécifique recevra et traitera l'instruction. Cela pourrait être de renvoyer des informations dans un autre paquet de diffusion, de modifier la configuration du commutateur ou de prendre d'autres mesures.
Cette conception et mise en œuvre présentent un certain nombre de problèmes qui devraient provoquer une certaine préoccupation qui a été mis en évidence par les chercheurs en sécurité (@ChRISDCMOORE dans la vulnérabilité de divulgation d'informations dans TP-Link Easy Smart Switches et @ CHMOD7850 dans la divulgation de vulnérabilité TP-link multiples cves). Bien que le piratage de l'ESCP soit assez facile, je n'aimais vraiment pas l'idée de diffuser littéralement les informations d'identification sur le réseau régulièrement pour saisir des statistiques.
L'approche que ce projet utilise, le client Web, est également problématique. L'utilisation d'une connexion Unicast TCP est meilleure, mais SSL n'est pas implémentée par le commutateur. Bien qu'il soit possible de reconfigurer le commutateur pour utiliser un nom d'utilisateur administratif différent, il n'y a qu'un seul nom d'utilisateur pour accéder au commutateur. Cela empêche d'employer un accès basé sur les rôles avec un nom d'utilisateur dédié pour la lecture des statistiques. L'identification que nous utilisons pour saisir les statistiques pourrait également être utilisée pour accéder à l'interface de gestion permettant la réinitialisation des compteurs, la reconfiguration du commutateur ou même le remplacement du firmware.
Pire encore, les vulnérabilités rapportées dans CVE-2017-17746 . Comme décrit dans https://seclists.org/fulldisclosure/2017/dec/67, une fois qu'un utilisateur d'une adresse IP source donnée s'authentifie à l'interface de gestion Web du commutateur, tout autre utilisateur de cette même adresse IP source est traité comme authentifié. Cette condition est créée par l'exécution des scripts Python dans ce projet, où d'autres utilisateurs connectés ou tunneler via le même hôte auraient alors un accès non authentifié à l'interface de gestion du commutateur. Ce problème peut être atténué en exécutant les scripts d'un hôte de gestion dédié. L'utilisation d'un LAN de gestion hors bande dédiée pourrait également offrir une protection, mais ces commutateurs sont peu susceptibles d'être utilisés dans un environnement aussi structuré.
Peter Smode
psmode [at] kitsnet.us