O TP-Link Easy Smart Switches é uma família de interruptores gerenciados capazes de suportar QoS, VLANs e grupos de agregação de links (LAGs). Eles são gerenciados por meio de uma interface baseada na Web, fornecendo acesso a várias funções, incluindo contadores de pacotes básicos por port. Infelizmente, esses comutadores não implementam o SNMP para acesso a esses contadores, nem parecem implementar um URL discreto para acesso direto a essas informações. Este projeto aborda esse problema para produzir estatísticas por porta a partir de uma única invocação de linha de comando com saída que pode ser divulgada trivialmente para saída formatada ou inserida em um sistema de monitoramento como o Zabbix.
Este projeto foi testado contra os modelos TP-Link Switch TL-SG1016DE e TL-SG108E. Também deve ser compatível com os outros membros desta família, incluindo o TL-SG105E e o TL-SG1024DE.
*** AVISO ***
A família Easy Switch Switch possui uma série de vulnerabilidades não resolvidas, incluindo CVE-2017-17746. Conforme descrito em https://seclists.org/fulldisclosure/2017/dec/67, uma vez que um usuário de um determinado endereço IP de origem se autentica para a interface de gerenciamento baseada na Web do comutador, qualquer outro usuário desse mesmo endereço IP de origem é tratado como autenticado.
Os scripts Python neste projeto devem ser usados apenas de um host que não possui acesso geral ao usuário.
ESSSTAT.PY é um utilitário leve é usado para extrair estatísticas da porta do comutador e saída em um formato prontamente analisável. Código adicional será adicionado à análise e saída ou armazenará essas estatísticas.
Este aplicativo leve Python executa um login rápido na interface administrativa baseada na Web do Switch e, em seguida, consulta a unidade para as estatísticas da porta atuais. As credenciais para acessar a unidade são transmitidas na linha de comando. O utilitário foi codificado com o Python 3.6 e usa a bela 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
A maneira mais simples de acumular dados dos switches é ter o essstat.py executar com a opção --1line e anexar a saída a um arquivo CSV. Em seguida, você pode retirar uma cópia do arquivo CSV e processar os dados brutos por meio desta pasta de trabalho do Excel para produzir um gráfico dinâmico que será automaticamente redimensionado com os dados disponíveis.
A primeira etapa é configurar um diretório onde os arquivos CSV acumularão os dados. Eu escolhi executar tudo isso sob o usuário do Zabbix que suporta o aplicativo de monitoramento neste host. Você pode escolher um usuário diferente, mas apenas certifique -se de que o grupo do diretório corresponda ao grupo do usuário que você usará.
$ ls -ald /var/log/essstat
drwxrwxr-x. 2 root zabbix 68 Mar 30 10:56 /var/log/essstat
Em seguida, crie o (s) trabalho (s) cron para a coleta de dados periódicos. Para fazer isso, crie o arquivo /etc/cron.d/essstat e adicione um cronograma para cada comutador que você monitorará. Para fazer isso razoavelmente autodidata, inclua o ano atual como parte da especificação do arquivo 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
No exemplo acima, há dois interruptores sendo monitorados, chamados orange e black . Para cada interruptor, a coleta de dados será executada a cada 10 minutos a partir de cada hora. Os dados para orange serão acumulados no arquivo /var/log/essstat/essstat-orange-2020.csv durante o ano civil 2020.
Esta pasta de trabalho do Excel, habilitada para macro, é provavelmente a melhor maneira de ler e traçar as estatísticas da porta. A pasta de trabalho construirá automaticamente uma consulta e executará uma operação da Web GET contra o servidor de monitoramento usando o script essstat2.cgi . Para configurar a pasta de trabalho para sua instalação local, o nome definido essstatBaseURL deve ser modificado para apontar para o servidor da web operando no seu host de monitoramento e o nome do script CGI. Para fazer esta atualização no Excel 2019 no Windows, clique na guia Fórmulas do Excel e clique no botão Name Manager na faixa de opções. Clique na entrada do essstatBaseURL e modifique a entrada para se adequar. Certifique -se de clicar no botão com a marca de seleção verde para salvar a modificação, feche a caixa de diálogo e salve a pasta de trabalho atualizada. Isso precisa ser feito apenas uma vez.
Ao usar a pasta de trabalho, o nome do comutador e os relatórios de e até a data/horários são especificados na tabela de parâmetros no canto superior esquerdo da guia Webdata . Clique na Update From Web para buscar os dados na tabela e atualize dinamicamente o gráfico na guia PPS Chart . Se o interruptor em estudo tiver apenas oito portas, as portas extras serão ocultas automaticamente.
O nome do comutador e a métrica plotada aparece no título do gráfico. Depois que as métricas forem carregadas na tabela, as diferentes métricas podem ser carregadas no gráfico selecionando -se das opções na célula suspensa ao lado do label. Moving between theses metrics for the same switch does *not* require doing another atualização da operação da Web.
A tabela na guia * LocalportNames permite substituir os nomes de porta padrão mostrados no gráfico. Esta tabela é totalmente opcional e as entradas para todas as portas em um determinado interruptor não são necessárias (é perfeitamente bom definir substituições de nome da porta para apenas algumas portas para uma determinada chave). Se você tiver vários comutadores, poderá adicionar entradas para todas elas em uma única tabela.
Este protótipo da pasta de trabalho do Excel pode ser usado para processar uma cópia da saída de dados RAW --1line do essstat.py que foi acumulada em um arquivo CSV. Comece copiando o arquivo para um novo nome, incorporando o nome do comutador que está sendo monitorado. Este será o notebook de monitoramento do Switch. Por exemplo:
C:usermeDocuments> copy essstat-TPLhost.xlsx essstat-orange.xlsx
Em seguida, faça o download de uma cópia dos dados do CSV que foram acumulados no seu host de monitoramento e abra -os no Excel, bem como na pasta de trabalho de monitoramento do Switch. Nesta fase, você precisará copiar os dados do CSV para a guia RawData do notebook de monitoramento do comutador por valor . Para fazer isso, vá para o arquivo CSV no Excel e selecione a célula superior esquerda, A1 . No Windows, você pode usar a sequência de chaves Ctrl-Shift-End para selecionar todos os dados e pressionar Ctrl-Insert para copiar tudo. Em seguida, vá para a pasta de trabalho de monitoramento do Switch e selecione a primeira célula de dados na guia RawData em A2 (célula superior esquerda, abaixo dos títulos). Clique com o botão direito do mouse e escolha a opção para colar valores. Com os dados brutos no lugar, você deve rolar para baixo para anotar a última linha povoada. O arquivo CSV original agora pode ser fechado.
Clique na guia Tabela PPS para estender a tabela de análise e selecione a métrica a ser mapeada. A chave é estender o intervalo de tabela estruturado para corresponder aos dados RawData disponíveis. Pressione Ctrl-End para localizar a extremidade da tabela. Mouse sobre o pequeno quadrado no canto inferior esquerdo da célula até que o ponteiro do mouse mude para uma mira. Clique e arraste para baixo para o mesmo número de linha que o último número da linha povoada na guia RawData . Todas as fórmulas e intervalos na tabela PPS e no gráfico PPS se estenderão automaticamente.
Existem quatro métricas que estão sendo rastreadas para cada porta: Pacotes bons TX, pacotes ruins TX, RX Good PKTS e RX Bad PKTS. O menu suspenso na célula B2 na guia PPS Tabela é usado para selecionar qual métrica deve ser preenchida na tabela e mapeada.
Este script CGI é usado para consultar os dados do CSV que foram acumulados no seu host de monitoramento e retornam entradas correspondentes. O CGI é independente, confiando apenas no acesso ao AWK para a execução de um script embutido simples. Existem três variáveis envolvidas no CGI:
Observe que as especificações parciais de data/hora são permitidas, pois as entradas correspondentes são determinadas por uma comparação simples de string. As datas de e para as datas podem abranger um limite de um ano (por exemplo, de 2019 a 2020).
Para consultar o servidor de monitoramento para estatísticas da porta para o comutador conhecido como Orange para o tempo de tempo de 23/02/2020 00:00 a 7/3/2020 11:30, o URI seria:
http://monitoring.mydomain.com/cgi-bin/essstat.cgi?esTPLhost=orange&esTo=2020-03-07%2011:30&esFrom=2020-02-23
Este script CGI foi projetado para apoiar a operação da pasta de trabalho essstat.xlsm Excel. O script suporta os mesmos parâmetros de consulta que essstat.cgi e retorna dados para as mesmas métricas. No entanto, em vez de retornar a contagem de pacotes brutos em cada registro, essstat2.cgi retornará os pacotes médios por segunda taxa desde o registro anterior. O script calculará o tempo real do delta entre o registro atual e anterior para garantir que a taxa seja precisa. O script também possui manuseio para contadores individuais, redefinindo para zero, enquanto enrolam o tamanho máximo do número inteiro para o balcão. Nesse caso, o pacote por segunda taxa do intervalo anterior será retornado para a estatística afetada.
O TP-Link Easy Smart Switch possui mais recursos do que um interruptor completamente não gerenciado. No entanto, o ambiente de gerenciamento está relativamente fechado, com apenas um cliente de gerenciamento proprietário (Utilitário Easy Smart Configuration) ou uma página de gerenciamento baseada na Web no comutador disponível. Além disso, não há suporte para monitorar o comutador com SNMP. Isso significa que nossa única entrada no Switch será através do protocolo usado pelo cliente proprietário ou da escapação da interface de gerenciamento baseada na Web no comutador.
Primeiro, um pouco de fundo do protocolo de configuração Smart Easy Smart (UDP-BASE) que este projeto não usa. O utilitário de configuração Smart Easy Interage com o Switch sobre UDP com transmissões. O cliente enviará uma transmissão UDP da porta 29809 para 29808 de um pacote de descoberta especialmente codificado. Os switches compatíveis na rede transmitirão uma resposta da porta 29808 para 29809 do que inclui o nome, modelo e endereço IP da chave. A partir deste ponto, cabe ao cliente codificar uma sequência de login e transmiti -la na rede, com a expectativa de que a chave de destino específica receba e processe a instrução. Isso pode ser enviar informações de volta em outro pacote de transmissão, modificar a configuração do comutador ou tomar alguma outra ação.
Esse design e implementação possuem vários problemas que devem causar alguma preocupação que foram destacados pelos pesquisadores de segurança (@ChrisDCMoore na vulnerabilidade de divulgação de informações em switches inteligentes fáceis de TP-link e @chmod7850 na divulgação de vulnerabilidades TP-Link multiplica os cves). Embora invadir o ESCP fosse fácil o suficiente, eu realmente não gostei da idéia de literalmente transmitir credenciais em toda a rede regularmente para obter estatísticas.
A aprovação que este projeto usa, o cliente baseado na Web, também é problemático. O uso de conexões de unicast TCP é melhor, mas o SSL não é implementado pelo comutador. Embora seja possível reconfigurar o comutador para usar um nome de usuário administrativo diferente, existe apenas um nome de usuário para acessar o comutador. Isso impede que o empregado de acesso baseado em funções com um nome de usuário dedicado apenas para a leitura de estatísticas. A credencial que usamos para pegar as estatísticas também pode ser usada para acessar a interface de gerenciamento, permitindo a redefinição de contadores, reconfigurando o comutador ou até mesmo substituindo o firmware.
Pior ainda são as vulnerabilidades relatadas no CVE-2017-17746 . Conforme descrito em https://seclists.org/fulldisclosure/2017/dec/67, uma vez que um usuário de um determinado endereço IP de origem se autentica para a interface de gerenciamento baseada na Web do comutador, qualquer outro usuário desse mesmo endereço IP de origem é tratado como autenticado. Essa condição é criada pela execução dos scripts do Python neste projeto, onde outros usuários efetuaram login ou tunelamento através do mesmo host teria acesso não autenticado à interface de gerenciamento do comutador. Esse problema pode ser mitigado executando os scripts de um host de gerenciamento dedicado. O uso de uma LAN de gerenciamento fora da banda dedicada também pode oferecer proteção, mas é improvável que esses comutadores sejam usados em um ambiente tão elaboradamente estruturado.
Peter Smode
psmode [at] kitsnet.us