Fernüberwachung und -steuerung von Linux/OpenWrt/Lede-Geräten über Port 80, Fortsetzung

Dies ist der letzte Teil des Artikels, hier ist der Anfang habr.com/en/post/445568
Als ich das letzte Mal darüber geschrieben habe, wie ich die Geräteüberwachung implementiert habe, sprechen wir jetzt über die Verwaltung. In Gesprächen mit „Technikfreaks“ seitens des Kunden stoße ich oft auf eine begrenzte Wahrnehmung der Fähigkeiten solch kleiner Geräte (mit geringen Speicherressourcen und geringer Leistung), viele glauben, dass „das Maximum, das wir brauchen, darin besteht, einen Neustart zu senden“. , für etwas Ernsthafteres – wir werden eine Brigade schicken.“
Die Praxis zeigt jedoch, dass dies nicht ganz stimmt. Hier ist eine kleine Liste häufiger typischer Aufgaben:

  1. Netzwerkdiagnose und Fehlerbehebung. Hinter dem Ethernet-Port Ihres Routers „lebt“ meist ein weiteres Stück Eisen, das über eine eigene interne IP-Adresse verfügt. Manchmal kann (sollte) es „angepingt“ werden. Oder Tunnelmanagement – ​​wenn der Tunnel plötzlich nicht mehr auf dem Router entsteht, der über das 3G-Modem läuft, wir aber den Router selbst sehen.
  2. Systemdienst. Firmware-Update, Service-Skript-Upgrade.
  3. Equilibristik. Dies könnte man als „Perversionen“ bezeichnen, aber das Konzept des „Seiltänzers“, wie ich zitiere, „die Fähigkeit eines Zirkusartisten, in einer instabilen Körperhaltung das Gleichgewicht zu halten“ - passt besser. Solche Situationen entstehen aufgrund des begrenzten Budgets des Kunden. Ich habe unten ein paar Beispiele gegeben, aber seitdem Sie haben keinen direkten Bezug zum Thema der Geschichte, ich habe sie in die Notizen geschrieben

WLAN-ÜberwachungSeit fünf Jahren ein Modethema, vor allem bei bundesstaatlichen Einzelhandelsketten. Sie gehen langsam durch die Handelsräume und Ihr Mobiltelefon sendet bei eingeschaltetem WLAN regelmäßig Probe-Request-Pakete aus, die analysiert werden können, um Berechnungen für Sie durchzuführen, um sich an einen Thread im Netzwerk zu halten : Wie oft kommen Sie in diesen Laden, auf welchen Wegen gehen Sie und so weiter. Darüber hinaus werden die Daten gesammelt, analysiert, Heatmaps erstellt und Manager „schlagen“ Geld vom Management oder von Investoren für solche Bilder aus. In der Zwischenzeit .... „Es ist kein Geld da, aber du hältst durch ...“, und das Ergebnis (echt) sollte sich bereits zeigen, das gute alte Lied „Ja, ja, dann liefern wir natürlich Ciscos und Was auch immer Sie wollen, aber jetzt müssen wir dem Kunden das Ergebnis zeigen! Übrigens haben sie vergessen zu erwähnen, dass der Kunde die Verbindung unserer Geräte mit seinem Hotspot über WLAN zugelassen hat, allerdings grundsätzlich, als wären wir Gastkunden. Und jetzt müssen Sie äquilibristische Router erstellen – mehrere WLAN-Subschnittstellen entstehen, von denen sich eine an den Hotspot klammert und die zweite die Umgebung überwacht, das Ergebnis von tcpdump hektisch in sich selbst entlädt, dann den Inhalt der Datei in ein Archiv packt und Es besteht die Gefahr, dass man an „übermäßigem Essen“ stirbt und versucht, den Inhalt auf den FTP-Server auszuspucken. Es ist nicht verwunderlich, dass der Equilibrist-Router oft „ausfällt“ und irgendwie aus der Ferne „reanimiert“ werden muss.

RadiusHier ist es einfacher, die Situation mit etwa dieser Aussage des Kunden zu beschreiben: „Wir wollen ein dezentrales Netzwerk von Hotspots, die über Kanäle auf Geräten funktionieren, deren Modell nicht im Voraus bekannt ist, von denen wir aber noch nicht wissen.“ Oh, wir haben vergessen zu erwähnen, dass wir den Kunden nicht nur Werbung zeigen, sondern auch alles rund um den Hotspot-Installationsort analysieren möchten. Nein, wir wissen noch nicht warum, aber wir werden es schaffen, zögern Sie nicht, wir konnten auf diese Idee kommen.“

Und wir dürfen nicht vergessen, dass die Verwaltung aufgrund vieler ungewisser Umstände im Vorfeld unter nicht standardmäßigen Bedingungen erfolgen muss, wenn wir keine direkte Verbindung zum Router über den IP-Port herstellen können und einfach auf das Auftreten von Aktivitäten warten müssen Es. Wenn wir abstrahieren, kann der Dialog zwischen Server und Router folgendermaßen dargestellt werden:

  • Router: Hallo. Ich bin so und so ein Router, gibt es irgendwelche Aufgaben für mich?
  • Server: So und so ein Router, ich habe dich registriert, dass du lebst. Hier ist die Herausforderung: Zeigen Sie mir die Ausgabe des ifconfig-Befehls?
  • Router: Hallo. Ich bin so und so ein Router. Als Sie das letzte Mal darum gebeten haben, das Ergebnis von ifconfig anzuzeigen, ist es hier. Gibt es Aufgaben für mich?
  • Server: So und so ein Router, ich habe dich registriert, dass du lebst. Es gibt keine Aufgaben für Sie.

Die interessanteste Frage ist: Wie kann ein Remote-Router eine bestimmte Menge an Informationen senden? Im letzten Teil habe ich beschrieben, dass der Router aufgrund begrenzter Ressourcen nur über ein „abgespecktes“ Wget verfügt, das nur über GET und sonst nichts funktioniert, es gibt keinen FTP-Client oder Curl. Genauer gesagt brauchen wir einen universellen Weg, unabhängig von den Merkmalen der Bildmontage. Ich habe mich für die Verwendung von wget entschieden. Genauer gesagt, wie „angehalten“ – ich hatte einfach keine Wahl 🙂

Sofortige ReservierungMeine Verwaltungslösung funktioniert, nicht sehr eingeschränkt, und ich bin mir sicher, dass sie schief ist, auch wenn sie für die meisten meiner Kunden geeignet ist. Wie wäre es möglich, das klug zu machen? Schreiben Sie ein kleines Dienstprogramm, das Binärdaten per POST über den 80. Port sendet. Fügen Sie es (Dienstprogramm) in die Firmware des Routers ein und verwenden Sie Bash, um darauf zuzugreifen. Aber die Realität ist: a) Sie müssen schnell sein, b) Sie müssen wahrscheinlich alles im bestehenden „Zoo von Routern“ erledigen, c) „Keinen Schaden anrichten!“ - Wenn der Router funktioniert und andere Aufgaben ausführt, versuchen Sie, Änderungen vorzunehmen, die die vorhandene Funktionalität nicht beeinträchtigen.

Kommen wir zur Umsetzung. Nehmen wir an, Ihr Kunde möchte von zabbix, dass er den Router einfach und natürlich per „Mausklick“ neu startet. Heute beginnen wir mit der Beschreibung der Implementierung mit Zabbix.
Im Menü „Administration“ -> „Skripte“ ein neues Skript hinzufügen. Wir nennen es „Reboot“, als Befehl schreiben wir „php /usr/share/zabbix/reboot.php {HOST.HOST}“

Fernüberwachung und -steuerung von Linux/OpenWrt/Lede-Geräten über Port 80, Fortsetzung

Weiter: Menü „Überwachung“ -> „Neueste Daten“ -> „Rechtsklick auf den gewünschten Host“. So sieht das Menü nach dem Hinzufügen des Skripts aus.

Fernüberwachung und -steuerung von Linux/OpenWrt/Lede-Geräten über Port 80, Fortsetzung
Dementsprechend legen wir das reboot.php-Skript im Verzeichnis /usr/share/zabbix ab (bei Ihnen kann es anders sein, ich verwende das zabbixa-Root-Verzeichnis).

SicherheitsausschlussAus Gründen der Klarheit der Erklärung verwende ich im Skript nur die ID des Routers, nicht jedoch das Passwort. In der Arbeitsversion ist dies nicht zu empfehlen! Warum habe ich das getan: Weil die große Frage ist, wo Passwörter für Router gespeichert werden sollen? In Zabbixe selbst im „Inventar“? Widersprüchliche Praxis. Als Option: Beschränken Sie den externen Zugriff auf die Datei reboot.php selbst

reboot.php-Datei

<?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();
?>

Eigentlich alles. Die Frage „wie man das Ergebnis der Befehlsausführung von der Geräteseite erhält“ bleibt offen. Betrachten wir die Aufgabe am Beispiel des Befehls ifconfig. Der folgende Befehl kann an das Gerät gesendet werden:

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

, wo:
message=`ifconfig` - Wir weisen das Ergebnis der Ausgabe des ifconfig-Befehls der Variablen $message zu
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - unser a.php-Skript, das Router registriert und Nachrichten von ihnen empfängt
u=Benutzer&p=Passwort!&m=$Nachricht - Anmeldeinformationen und der Wert der Abfragevariablen m - weist den Inhalt der Variablen $message zu
-O /tmp/out.txt - In diesem Fall benötigen wir keine Ausgabe in die Datei /tmp/out.txt, aber wenn dieser Parameter nicht angegeben ist, funktioniert wget nicht

Warum funktioniert das falsch?Weil es sich um eine potenzielle Sicherheitslücke handelt. Der harmloseste Fehler, der passieren kann, ist, wenn die Ausgabe Ihres Befehls beispielsweise das Symbol „&“ enthält. Daher ist es notwendig, alles zu filtern, was von den Routern gesendet wird und alles, was zum Server kommt. Ja, ich schäme mich wirklich. Zu meiner Verteidigung kann ich nur schreiben, dass der gesamte Artikel der Verwaltung von Routern mit undefinierter Firmware und undefinierten Kommunikationskanälen gewidmet ist.

Nun, ich habe die Zukunft angesprochen: Ich habe noch nicht herausgefunden, wie ich die Ergebnisse (z. B. das Ergebnis einer Befehlsausführung), die mit Standard-Zabbix-Tools auf dem Server eingehen, wiedergeben soll.

Ich erinnere Sie daran, dass alle Quellen dem Git-Repository entnommen werden können unter: github.com/BazDen/iotnet.online.git

Source: habr.com

Kommentar hinzufügen