Surveillance et gestion à distance des périphériques basés sur Linux / OpenWrt / Lede via le port 80, suite

Ceci est la dernière partie de l'article, voici le début .

La dernière fois que j'ai écrit sur la façon dont j'ai implémenté la surveillance des appareils, nous allons maintenant nous concentrer sur la gestion. Dans les discussions avec les "technophiles" de la part du client, je rencontre souvent une perception limitée des capacités de ces petits appareils (avec de faibles ressources mémoire et performances), beaucoup de gens pensent que "le maximum dont nous avons besoin est d'envoyer un redémarrage, pour quelque chose de plus sérieux - nous enverrons une équipe" .

Mais la pratique montre que ce n'est pas entièrement vrai.

Voici une courte liste des tâches courantes courantes:

  1. Diagnostics et dépannage du réseau. Derrière le port Ethernet de votre routeur, un autre matériel a généralement sa propre adresse IP interne. Parfois, il peut (avoir besoin) de "ping". Ou la gestion des tunnels - si un routeur qui ne monte pas soudainement sur un routeur passant par un modem 3G, mais nous voyons le routeur lui-même.
  2. Service système. Mise à niveau du micrologiciel, mise à niveau du script de service.
  3. Acte d'équilibre. Cela pourrait être appelé "perversions", mais le concept de "balancer" comme, je cite, "la capacité d'un artiste de cirque à maintenir l'équilibre dans une position instable du corps" est plus approprié. Des situations similaires se produisent en raison du budget limité du client. Voici quelques exemples, mais parce que ils n'ont aucun rapport direct avec le sujet du récit, mettez-les dans des notes

Surveillance Wifi
Un sujet à la mode au cours des cinq dernières années concerne principalement les chaînes de vente au détail fédérales. Vous vous promenez lentement à travers les parquets, et votre téléphone mobile avec Wi-Fi activé, dans une tentative de «coller» à un thread réseau, envoie régulièrement des paquets de demande de sonde qui peuvent être analysés pour calculer la fréquence à laquelle vous venez dans ce magasin, pour quoi marcher les trajectoires et ainsi de suite. Ensuite, les données sont collectées, analysées, des cartes thermiques sont dessinées et les gestionnaires pour de telles images "coupent" l'argent de la direction ou des investisseurs. En attendant .... "il n'y a pas d'argent, mais vous tenez bon ...", et le résultat (réel) doit déjà être montré, la bonne vieille chanson est incluse "Oui, oui, alors bien sûr nous mettrons tsiska et tout ce que nous voulons, mais maintenant nous avons besoin montrez le résultat au client! Soit dit en passant, ils ont oublié de dire que le client a permis à notre équipement d'être connecté à son hotspot via le Wi-Fi, mais de manière générale, c'est comme si nous étions des clients invités. " Et maintenant, vous devez créer des routeurs-équilibreurs - plusieurs sous-interfaces WiFi montent, dont l'une s'accroche à un hotspot, et la seconde surveille l'environnement, décharge frénétiquement le résultat de tcpdump en elle-même, puis le contenu du fichier est compressé dans l'archive et risque de mourir de "suralimentation" essayer de cracher le contenu sur le serveur ftp. Il n'est pas surprenant que le routeur-équilibreur "tombe en panne" et doive être ressuscité à distance.

Rayon
Ici, il est plus facile de décrire la situation avec quelque chose comme cette déclaration du client: «Nous voulons un réseau décentralisé de hotspots qui fonctionnent sur des équipements dont le modèle n'est pas connu à l'avance, via des canaux, mais que nous ne connaissons pas encore. Ah, ils ont oublié de dire, nous voulons non seulement montrer des publicités aux clients, mais aussi analyser tout autour du lieu d'installation du hotspot. Non, nous ne savons pas encore pourquoi, mais nous arriverons, n’en doutons pas, nous avons pu trouver cette idée »

Et nous ne devons pas oublier qu'en raison de la masse de circonstances incertaines à l'avance, le contrôle doit être effectué dans des conditions non standard, lorsque nous ne pouvons pas nous connecter directement au routeur via ip: le port et sommes obligés d'attendre simplement une activité de celui-ci. Si nous l'ignorons, le dialogue entre le serveur et le routeur peut être représenté comme ceci:

  • Routeur : salut. Je suis un tel routeur, y a-t-il des tâches pour moi?
  • Serveur : tel ou tel routeur je vous ai enregistré que vous êtes vivant. Voici la tâche: montrez-moi le résultat de la commande ifconfig?
  • Routeur : salut. Je suis un tel routeur, la dernière fois que vous m'avez demandé de montrer le résultat d'ifconfig, le voici. Y a-t-il des tâches pour moi?
  • Serveur : tel ou tel routeur je vous ai enregistré que vous êtes vivant. Il n'y a pas de tâches pour vous.

La question la plus intéressante: comment un routeur distant peut-il envoyer une certaine quantité d'informations? Dans la dernière partie, j'ai décrit que sur le routeur en raison de ressources limitées, il n'y a qu'un wget "dépouillé" qui ne fonctionne que via GET et rien d'autre, il n'y a pas de client ftp ou curl. Plus précisément, nous avons besoin d'une méthode universelle, quelles que soient les caractéristiques de l'assemblage d'images. J'ai décidé d'utiliser wget. Plus précisément, comment j'ai «arrêté» - je n'avais tout simplement pas le choix :)

Réservation immédiate
Ma solution de gestion fonctionne, mais très limitée et je suis sûre qu'elle est tordue, même si elle convient à la plupart de mes clients. Comment il serait possible de le faire judicieusement - d'écrire un petit utilitaire qui envoie des données binaires via le 80e port. Incluez-le (utilitaire) dans le firmware du routeur et utilisez bash pour y accéder. Mais la réalité est que: a) vous devez rapidement b) peut-être que vous devez tout faire sur le "zoo du routeur" existant c) "ne faites pas de mal!" - si le routeur fonctionne et effectue d'autres tâches, essayez d'apporter des modifications qui affecteront les fonctionnalités existantes.

Passons à la mise en œuvre. Supposons que votre client veuille de zabbix redémarrer le routeur facilement et naturellement, en un «clic de souris». Aujourd'hui, nous allons commencer la description de la mise en œuvre avec zabbiksa.

Dans le menu "Administration" -> "Scripts" ajoutez un nouveau script. Nous l'appelons «Reboot», en tant que commande, nous écrivons «php /usr/share/zabbix/reboot.php {HOST.HOST}»



Plus loin: Menu "Surveillance" -> "Données récentes" -> "Faites un clic droit sur le nœud du réseau." Voici à quoi ressemblera le menu après l'ajout d'un script.


En conséquence, nous mettons le script reboot.php dans le répertoire / usr / share / zabbix (vous pouvez en avoir un autre, j'utilise le répertoire racine zabbixa).

Clause de non-responsabilité pour la sécurité
Pour plus de clarté dans le script, j'utilise uniquement l'ID du routeur, mais je n'utilise pas le mot de passe. Dans la version de travail, ce n'est pas recommandé! Pourquoi ai-je fait cela: parce que la grande question est de savoir où stocker les mots de passe des routeurs? Dans zabbixe lui-même dans "l'inventaire"? Pratique contradictoire. En option: restreindre l'accès externe au fichier reboot.php lui-même

Fichier Reboot.php

<?php //      $user = $argv[1]; // .      -   !            . //$password = $argv[2]; $conn=new mysqli("localhost","db_user","db_password","db_name"); if (mysqli_connect_errno()) { exit(); } $conn->set_charset("utf8"); // ""  reboot     task  users.   task    . $sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';"); $sql_users->bind_param('s', $user); $sql_users->execute(); $sql_users->close(); ?> 

En fait, tout. La question «comment obtenir le résultat de l'exécution d'une commande du côté de l'appareil» reste ouverte. Considérez le problème en utilisant la commande ifconfig comme exemple. Cette commande peut être envoyée à l'appareil:

 message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt 

où:
message = `ifconfig` - nous affectons le résultat de la sortie de la commande ifconfig à la variable $ message
wget " xn - 80abgfbdwanb2akugdrd3a2e5gsbj.xn - p1ai / a.php - notre script a.php qui enregistre les routeurs et reçoit des messages d'eux
u = utilisateur & p = mot de passe! & m = $ message - informations d'identification et la valeur de la variable de demande m - attribue le contenu de la variable $ message
-O /tmp/out.txt - nous n'avons pas besoin de sortie dans le fichier /tmp/out.txt dans ce cas, mais si vous ne spécifiez pas ce paramètre, wget ne fonctionne pas

Pourquoi ça marche de travers
Parce que c'est un trou de sécurité potentiel. l'erreur la plus inoffensive qui puisse se produire est, par exemple, si le symbole «&» apparaît dans la sortie de votre commande. Par conséquent, il est nécessaire de filtrer tout ce qui est envoyé par les routeurs et tout ce qui arrive au serveur. Ouais, j'ai vraiment honte. Pour ma défense, je peux seulement écrire - que l'article entier est consacré à la façon de gérer les routeurs avec un firmware non défini à l'avance, avec des canaux de communication non définis à l'avance.

Eh bien, j'ai touché l'avenir: je n'ai pas compris comment refléter les résultats (par exemple, le résultat de la commande) qui arrivent sur le serveur à l'aide des outils zabbix standard.

Je vous rappelle que toutes les sources peuvent être extraites du dépôt Git

Source: https://habr.com/ru/post/fr446230/


All Articles