Los interruptores inteligentes fáciles de TP-Link son una familia de interruptores administrados capaces de soportar los grupos de agregación de QoS, VLAN y enlace (LAGS). Se administran a través de una interfaz basada en la web, dando acceso a una serie de funciones, incluidos los contadores básicos de paquetes por puerto. Desafortunadamente, estos conmutadores no implementan SNMP para el acceso a estos contadores, ni parecen implementar una URL discreta para el acceso directo a esta información. Este proyecto aborda este problema para producir estadísticas por puerto a partir de una sola invocación de línea de comandos con salida que se puede analizar trivialmente para la salida formateada, o ingresarse en un sistema de monitoreo como Zabbix.
Este proyecto se ha probado con los modelos de conmutación TP-Link TL-SG1016DE y TL-SG108E. También debe ser compatible con los otros miembros de esta familia, incluidos TL-SG105E y TL-SG1024DE.
*** ADVERTENCIA ***
La familia Easy Smart Switch tiene una serie de vulnerabilidades no resueltas, incluido CVE-2017-17746. Como se describe en https://seclists.org/fulldisclosure/2017/dec/67, una vez que un usuario de una dirección IP de origen determinada se autentica a la interfaz de administración basada en la web del conmutador, cualquier otro usuario de esa misma dirección IP de origen se trata como autenticada.
Los scripts de Python en este proyecto deben usarse solo desde un host que no tiene acceso general al usuario.
Essstat.py es una utilidad ligera se utiliza para extraer estadísticas de puerto del interruptor y salida en un formato fácilmente analizado. Se agregará código adicional para analizar y emitir o almacenar estas estadísticas.
Esta aplicación de pitón ligera realiza un inicio de sesión rápido a través de la interfaz administrativa basada en la web del Switch, y luego consulta la unidad para las estadísticas de puerto actuales. Las credenciales para acceder a la unidad se pasan en la línea de comando. La utilidad estaba codificada con Python 3.6 y usa la hermosa biblioteca de sopa.
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
La forma más sencilla de acumular datos de los conmutadores es hacer que Essstat.py ejecute con la opción --1line y agregar la salida a un archivo CSV. Luego puede eliminar una copia del archivo CSV y procesar los datos sin procesar a través de este libro de trabajo de Excel para producir un gráfico dinámico que volverá automáticamente a los datos disponibles.
El primer paso es configurar un directorio donde los archivos CSV acumularán los datos. Elegí ejecutar todo esto bajo el usuario de Zabbix que admite la aplicación de monitoreo en este host. Puede elegir un usuario diferente, pero solo asegúrese de que el grupo del directorio coincida con el grupo del usuario que usará.
$ ls -ald /var/log/essstat
drwxrwxr-x. 2 root zabbix 68 Mar 30 10:56 /var/log/essstat
A continuación, cree los trabajos cron para la recopilación de datos periódicos. Para hacer esto, cree el archivo /etc/cron.d/essstat y agregue un horario para cada interruptor que monitoree. Para hacer que esto sea razonablemente autodestructivo, incluya el año en curso como parte de la especificación del archivo 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
En el ejemplo anterior, se están monitoreando dos interruptores, llamados orange y black . Para cada interruptor, la recopilación de datos se ejecutará cada 10 minutos a partir de cada hora. Los datos para orange se acumularán en el archivo /var/log/essstat/essstat-orange-2020.csv durante el año calendario 2020.
Este libro de trabajo de Excel habilitado para macro es probablemente la mejor manera de leer y trazar las estadísticas del puerto. El libro de trabajo construirá automáticamente una consulta y ejecutará una operación de Get Web contra el servidor de monitoreo utilizando el script essstat2.cgi . Para configurar el libro de trabajo para su instalación local, el nombre definido essstatBaseURL debe modificarse para señalar el servidor web que opera en su host de monitoreo y el nombre del script CGI. Para realizar esta actualización en Excel 2019 en Windows, haga clic en la pestaña Fórmulas de Excel, luego haga clic en el botón Name Manager en la cinta. Haga clic en la entrada de essstatBaseURL y modifique la entrada a la adaptación. Asegúrese de hacer clic en el botón con la marca de verificación verde para guardar la modificación, cerrar el diálogo y guardar el libro de trabajo actualizado. Esto debe hacerse solo una vez.
Al usar el libro de trabajo, el nombre del conmutador y los informes desde y hasta la fecha/horarios se especifican en la tabla de parámetros en la parte superior izquierda de la pestaña WebData . Haga clic en el botón Update From Web para obtener los datos en la tabla y actualizar dinámicamente el diagrama en la pestaña PPS Gráfico . Si el interruptor en estudio tiene solo ocho puertos, los puertos adicionales se ocultarán automáticamente.
El nombre del interruptor y la métrica trazada aparecen en el título de la tabla. Una vez que las métricas se han cargado en la tabla, las diferentes métricas se pueden cargar en el gráfico seleccionando desde las opciones en la celda desplegable al lado de la label. Moving between theses metrics for the same switch does *not* require doing another actualización de la operación Web`.
La tabla en la pestaña * LocalPortNames le permite anular los nombres de puerto predeterminados que se muestran en el gráfico. Esta tabla es completamente opcional y no se requiere entradas de definición para todos los puertos en un interruptor dado (está perfectamente bien definir anulaciones de nombres del puerto para solo un par de puertos para un interruptor dado). Si tiene múltiples interruptores, puede agregar entradas para todos en una sola tabla.
Este prototipo de libro de trabajo de Excel se puede utilizar para procesar una copia de la salida de datos sin --1line de Essstat.py que se ha acumulado en un archivo CSV. Comience copiando el archivo a un nuevo nombre, incorporando el nombre del conmutador que se está monitoreando. Este será el cuaderno de monitoreo de conmutadores. Por ejemplo:
C:usermeDocuments> copy essstat-TPLhost.xlsx essstat-orange.xlsx
A continuación, descargue una copia de los datos de CSV que se ha acumulado en su host de monitoreo y ábralo en Excel, así como el libro de trabajo de monitoreo de conmutadores. En esta etapa, deberá copiar los datos del CSV a la pestaña RawData del cuaderno de monitoreo del conmutador por valor . Para hacer esto, vaya al archivo CSV en Excel y seleccione la celda superior izquierda, A1 . En Windows, puede usar la secuencia clave Ctrl-Shift-End para seleccionar todos los datos, luego presione Ctrl-Insert para copiar todo. Luego vaya al libro de trabajo de monitoreo de conmutadores y seleccione la primera celda de datos en la pestaña RawData en A2 (celda superior izquierda, debajo de los encabezados). Haga clic derecho y elija la opción de pegar valores. Con los datos sin procesar en su lugar, debe desplazarse hacia abajo para tomar nota de la última fila poblada. El archivo CSV original ahora se puede cerrar.
Haga clic en la pestaña Tabla PPS para extender la tabla de análisis y seleccione la métrica que se registrará. La clave es extender el rango de tabla estructurado para que coincida con RawData disponible. Presione Ctrl-End para localizar el extremo de la tabla. Ratón sobre el pequeño cuadrado en la esquina inferior izquierda de la celda hasta que el puntero del mouse cambie a una mira. Haga clic y arrastre hacia abajo al mismo número de fila que el último número de fila poblada en la pestaña RawData . Todas las fórmulas y rangos en la tabla PPS y el gráfico PPS se extenderán automáticamente.
Hay cuatro métricas que se están rastreando para cada puerto: paquetes TX buenos, paquetes malos TX, pkts rx buenos y rx pkts malos. El menú desplegable en la celda B2 en la pestaña PPS se usa para seleccionar qué métrica debe poblarse en la tabla y trazar.
Este script CGI se utiliza para consultar los datos de CSV que se han acumulado en su host de monitoreo y devolver entradas coincidentes. El CGI es autónomo, confiando solo en el acceso a AWK para la ejecución de un script en línea simple. Hay tres variables implementadas en el CGI:
Tenga en cuenta que se permiten especificaciones de fecha/hora parciales, ya que las entradas coincidentes se determinan mediante una simple comparación de cadenas. Las fechas de From and to pueden abarcar a través de un límite de año (por ejemplo, de 2019 a 2020).
Para consultar el servidor de monitoreo para las estadísticas de puerto para el conmutador conocido como naranja para el rango de tiempo del 23/02/2020 00:00 al 3/7/2020 11:30, el URI se vería como:
http://monitoring.mydomain.com/cgi-bin/essstat.cgi?esTPLhost=orange&esTo=2020-03-07%2011:30&esFrom=2020-02-23
Este script CGI está diseñado para admitir la operación del libro de trabajo essstat.xlsm Excel. El script admite los mismos parámetros de consulta que essstat.cgi y devuelve datos para las mismas métricas. Sin embargo, en lugar de devolver los recuentos de paquetes sin procesar en cada registro, essstat2.cgi devolverá los paquetes promedio por segundo desde el registro anterior. El script calculará el tiempo delta real entre el registro actual y anterior para garantizar que la tasa sea precisa. El script también tiene manejo para contadores individuales que se restablecen a cero, ya que envuelven el tamaño de entero máximo para el mostrador. En tal caso, la tasa de paquete por segundo del intervalo anterior se devolverá para la estadística afectada.
El interruptor Smart Easy TP-Link tiene más capacidades que un interruptor completamente no administrado. Sin embargo, el entorno de administración está relativamente cerrado, con solo un cliente de administración patentado (utilidad de configuración inteligente fácil) o una página de administración basada en la web en el conmutador disponible. Además, no hay soporte para monitorear el interruptor con SNMP. Esto significa que nuestra única entrada al interruptor será a través del protocolo utilizado por el cliente patentado, o al marcar la interfaz de administración basada en la web en el conmutador.
Primero, un poco de fondo en el protocolo de configuración Smart Smart (ESCP) de base UDP que este proyecto no usa. La utilidad fácil de configuración inteligente interactúa con el conmutador a través de UDP con transmisiones. El cliente enviará una transmisión UDP desde el puerto 29809 a 29808 de un paquete de descubrimiento especialmente codificado. Los interruptores compatibles en la red transmitirán una respuesta desde el puerto 29808 a 29809 que incluye el nombre, el modelo y la dirección IP del conmutador. Desde este punto, depende del cliente codificar una secuencia de inicio de sesión y transmitir esto en la red, con la expectativa de que el interruptor de destino específico recibirá y procesará las instrucciones. Esto podría ser enviar información en otro paquete de transmisión, modificar la configuración del conmutador o tomar alguna otra acción.
Este diseño e implementación tiene una serie de problemas que deberían causar cierta preocupación que los investigadores de seguridad han sido destacados (@chrisdcmoore en la vulnerabilidad de divulgación de información en TP-Link fácil Smart Switches y @CHMOD7850 en la divulgación de vulnerabilidad TP-Link Multiples CVE). Si bien piratear el ESCP sería bastante fácil, realmente no me gustó la idea de transmitir literalmente credenciales en toda la red de forma regular para obtener estadísticas.
La aprobación que usa este proyecto, el cliente basado en la web, también es problemático. Usar un TCP Unidections es mejor, pero el conmutador no implementa SSL. Si bien es posible reconfigurar el interruptor para usar un nombre de usuario administrativo diferente, solo hay un nombre de usuario para acceder al interruptor. Esto impide emplear el acceso basado en roles con un nombre de usuario dedicado solo para estadísticas de lectura. La credencial que utilizamos para obtener las estadísticas también podría usarse para acceder a la interfaz de administración que permite el reinicio de los contadores, reconfigurar el interruptor o incluso reemplazar el firmware.
Peores aún son las vulnerabilidades reportadas en CVE-2017-17746 . Como se describe en https://seclists.org/fulldisclosure/2017/dec/67, una vez que un usuario de una dirección IP de origen determinada se autentica a la interfaz de administración basada en la web del conmutador, cualquier otro usuario de esa misma dirección IP de origen se trata como autenticada. Esta condición se crea mediante la ejecución de los scripts de Python en este proyecto, donde otros usuarios que iniciaron sesión o túneles a través del mismo host tendrían acceso no autenticado a la interfaz de administración del conmutador. Este problema puede mitigarse ejecutando los scripts desde un host de gestión dedicado. El uso de una LAN de gestión fuera de banda dedicada también podría ofrecer protección, pero es poco probable que estos interruptores se usen en un entorno tan elaboradamente estructurado.
Peter Smode
psmode [at] kitsnet.us