Bewaking en beheer op afstand van op Linux/OpenWrt/Lede gebaseerde apparaten via poort 80, vervolg

Dit is het laatste deel van het artikel, hier is het begin habr.com/en/post/445568
De vorige keer schreef ik over hoe ik apparaatmonitoring implementeerde, nu zullen we het hebben over beheer. In discussies met “technici” aan de kant van de klant kom ik vaak een beperkte perceptie tegen van de mogelijkheden van zulke kleine apparaten (met weinig geheugenbronnen en prestaties). Velen geloven dat “het meeste dat we nodig hebben is een herstart te sturen, voor iets meer serieus, we sturen een team”.
Maar de praktijk leert dat dit niet helemaal waar is. Hier is een kleine lijst met veel voorkomende typische taken:

  1. Netwerkdiagnostiek en probleemoplossing. Achter de ethernetpoort van je router bevindt zich meestal nog een stukje hardware dat een eigen intern IP-adres heeft. Soms kun je het ‘pingen’. Of tunnelbeheer - als de tunnel plotseling niet op een router komt die via een 3G-modem werkt, maar we de router zelf kunnen zien.
  2. Systeem onderhoud. Firmware-update, upgrade van servicescript.
  3. Evenwichtsoefening. Dit zou ‘perversie’ genoemd kunnen worden, maar het concept ‘evenwicht’, zoals ik citeer: “het vermogen van een circusartiest om het evenwicht te bewaren in een onstabiele lichaamshouding” - past beter. Dergelijke situaties ontstaan ​​vanwege het beperkte budget van de klant. Hieronder heb ik een paar voorbeelden gegeven, maar... Ze houden niet direct verband met het thema van het verhaal, ik heb ze in de aantekeningen gezet

Wi-Fi-bewakingEen modieus onderwerp van de laatste vijf jaar, vooral onder federale winkelketens. U wandelt op uw gemak door de handelsvloeren, en uw mobiele telefoon met Wi-Fi ingeschakeld, in een poging om aan een bepaalde draad van het netwerk te blijven ‘hangen’, verzendt regelmatig Probe Request-pakketten, die kunnen worden geanalyseerd om te berekenen voor jij: hoe vaak kom je naar deze winkel, om welke redenen, je loopt trajecten enzovoort. Vervolgens worden de gegevens verzameld en geanalyseerd, worden er heatmaps opgesteld en managers 'persen' geld af van het management of investeerders voor dergelijke foto's. Nou ja, voor nu.... “er is geen geld, maar hou vol...”, en het resultaat (echt) moet al getoond worden, het goede oude liedje begint: “Ja, ja, dan gaan we natuurlijk installeert de cis en alles wat je wilt, maar nu moeten we de klant het resultaat laten zien! We vergaten overigens te vermelden dat de klant ons toestond onze apparatuur via Wi-Fi met zijn hotspot te verbinden, maar dan in het algemeen, net alsof we gastklanten waren.” En dus moeten we balancerende routers maken - er worden verschillende WiFi-subinterfaces verhoogd, waarvan er één zich vastklampt aan de hotspot, en de tweede de omgeving bewaakt, verwoed het tcpdump-resultaat naar zichzelf uploadt en vervolgens de inhoud van het bestand in een archief verpakt en risico's loopt. Stervend door “overeten” probeert de inhoud op de FTP-server uit te spugen. Het is niet verrassend dat de balanceringsrouter vaak “kapot gaat” en op de een of andere manier op afstand moet worden “gereanimeerd”.

StraalHet is gemakkelijker om de situatie hier te beschrijven met zoiets als deze verklaring van de klant: “We willen een gedecentraliseerd netwerk van hotspots dat zou werken aan apparatuur waarvan het model op voorhand niet bekend is, via kanalen, maar welke we nog niet kennen. Oh, we vergaten nog te zeggen dat we niet alleen reclame willen tonen aan klanten, maar ook alles willen analyseren rondom de locatie waar de hotspot is geïnstalleerd. Nee, waarom weten we nog niet, maar we komen er wel achter, twijfel er niet aan, we hebben dit idee kunnen bedenken.”

En we mogen niet vergeten dat vanwege veel voorheen onbekende omstandigheden de controle moet worden uitgevoerd onder niet-standaard omstandigheden, wanneer we niet rechtstreeks via de IP-poort verbinding kunnen maken met de router en gedwongen zijn om eenvoudigweg te wachten op activiteit ervan. Als we onszelf abstraheren, kan de dialoog tussen de server en de router als volgt worden weergegeven:

  • Router: Hallo. Ik ben zo'n en zo'n router, zijn er taken voor mij?
  • Server: router zo en zo, ik heb je geregistreerd, dat je nog leeft. Hier is de uitdaging: laat me het resultaat zien van het ifconfig-commando?
  • Router: Hallo. Ik ben zo'n en zo'n router, de laatste keer dat je vroeg om het resultaat van ifconfig te laten zien, hier is het. Zijn er taken voor mij?
  • Server: router zo en zo, ik heb je geregistreerd, dat je nog leeft. Er zijn geen taken voor jou.

De meest interessante vraag: hoe kan een externe router een bepaalde hoeveelheid informatie verzenden? In het laatste deel beschreef ik dat vanwege de beperkte middelen de router slechts een “uitgeklede” wget heeft, die alleen via GET werkt en niets anders; er is geen FTP-client of curl. Om precies te zijn: we hebben een universele methode nodig, ongeacht de kenmerken van beeldmontage. Ik besloot wget te gebruiken. Om precies te zijn, hoe ik "stopte" - ik had gewoon geen keus :)

Even een disclaimerMijn beheeroplossing werkt, niet erg beperkt, en ik weet zeker dat het krom is, ook al past het bij de meeste van mijn klanten. Hoe kun je het verstandig doen: schrijf een klein hulpprogramma dat binaire POST-gegevens via poort 80 verzendt. Neem het (het hulpprogramma) op in de routerfirmware en open het met bash. Maar de realiteit is dat: a) we snel moeten b) we waarschijnlijk alles moeten doen op de bestaande “dierentuin van routers” c) “geen kwaad doen!” — als de router werkt en andere taken uitvoert, probeer dan wijzigingen aan te brengen die de bestaande functionaliteit niet beïnvloeden.

Laten we verder gaan met de implementatie. Stel dat uw klant de router eenvoudig en natuurlijk wil herstarten vanuit zabbix, met een “muisklik”. Vandaag beginnen we met het beschrijven van de implementatie met Zabbix.
Voeg in het menu “Beheer” -> “Scripts” een nieuw script toe. We noemen het “Reboot”, voer “php /usr/share/zabbix/reboot.php {HOST.HOST}” in als een commando

Bewaking en beheer op afstand van op Linux/OpenWrt/Lede gebaseerde apparaten via poort 80, vervolg

Vervolgens: Menu “Monitoring” -> “Laatste gegevens” -> “Klik met de rechtermuisknop op het gewenste netwerkknooppunt.” Zo ziet het menu eruit nadat het script is toegevoegd.

Bewaking en beheer op afstand van op Linux/OpenWrt/Lede gebaseerde apparaten via poort 80, vervolg
Dienovereenkomstig plaatsen we het reboot.php-script in de map /usr/share/zabbix (de jouwe kan anders zijn, ik gebruik de hoofdmap van zabbixa).

VeiligheidsdisclaimerOm de uitleg in het script duidelijker te maken, gebruik ik alleen het router-ID, maar niet het wachtwoord. Het wordt afgeraden om dit in de productieversie te doen! Waarom deed ik dit: omdat de grote vraag is waar wachtwoorden voor routers moeten worden opgeslagen? In zabbixe zelf in “inventarisgegevens”? Controversiële praktijk. Alternatief: beperk externe toegang tot het reboot.php-bestand zelf

Bestand opnieuw opstarten.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();
?>

Dat is alles. De vraag blijft open: “hoe het resultaat te verkrijgen van het uitvoeren van een opdracht vanaf het apparaat.” Laten we de taak bekijken met de opdracht ifconfig als voorbeeld. Dit commando kan naar het apparaat worden verzonden:

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

, Waar:
message=`ifconfig` — we wijzen het resultaat van de ifconfig-opdrachtuitvoer toe aan de variabele $message
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — ons a.php-script dat routers registreert en berichten van hen ontvangt
u=gebruiker&p=wachtwoord!&m=$bericht — inloggegevens en de waarde van de verzoekvariabele m — wijst de inhoud van de variabele $message toe
-O /tmp/uit.txt — in dit geval hebben we geen uitvoer naar het bestand /tmp/out.txt nodig, maar als deze parameter niet is opgegeven, werkt wget niet

Waarom werkt dit niet?Omdat het een potentieel veiligheidslek is. De meest onschuldige fout die kan optreden is als er bijvoorbeeld een “&”-teken in de uitvoer van uw opdracht staat. Daarom is het noodzakelijk om zowel alles wat vanaf routers wordt verzonden als alles wat naar de server komt te filteren. Ja, ik schaam me echt. Ter verdediging kan ik alleen maar schrijven dat het hele artikel gewijd is aan het beheren van routers met vooraf gedefinieerde firmware en communicatiekanalen die niet vooraf zijn gedefinieerd.

Nou, een begin voor de toekomst: ik ben er nog niet achter hoe ik standaard zabbix-tools moet gebruiken om de resultaten (bijvoorbeeld het resultaat van het uitvoeren van een opdracht) weer te geven die naar de server komen.

Ik herinner je eraan dat alle bronnen kunnen worden verkregen uit de Git-repository op: github.com/BazDen/iotnet.online.git

Bron: www.habr.com

Voeg een reactie