Afstandmonitering en beheer van Linux/OpenWrt/Lede-toestelle via poort 80, vervolg

Dit is die laaste deel van die artikel, hier is die begin habr.com/en/post/445568
Laas toe ek geskryf het oor hoe ek toestelmonitering geïmplementeer het, sal ons nou oor bestuur praat. In gesprekke met "tegnologie" aan die kant van die kliënt, ontmoet ek dikwels 'n beperkte persepsie van die vermoëns van sulke klein toestelle (met lae geheue hulpbronne en werkverrigting), baie glo dat "die maksimum wat ons nodig het, is om 'n herlaai te stuur , vir iets ernstiger - ons sal 'n brigade stuur" .
Maar die praktyk wys dat dit nie heeltemal waar is nie. Hier is 'n klein lys van algemene tipiese take:

  1. Netwerk diagnostiek en probleemoplossing. Agter die Ethernet-poort van jou router "leef" gewoonlik 'n ander stuk yster, wat sy eie interne IP-adres het. Soms kan (moet) dit "geping" word. Of tonnelbestuur - as die tonnel skielik nie styg op die router wat deur die 3G-modem werk nie, maar ons sien die router self.
  2. Stelsel diens. Firmware-opdatering, diensskrifte-opgradering.
  3. Ekwilibristiek. Dit kan "perversies" genoem word, maar die konsep van "tightrope walker" soos ek haal aan, "die vermoë van 'n sirkuskunstenaar om balans te handhaaf in 'n onstabiele liggaamsposisie" - pas beter. Sulke situasies ontstaan ​​as gevolg van die beperkte begroting van die kliënt. Ek het 'n paar voorbeelde hieronder gegee, maar sedertdien hulle hou nie direk verband met die onderwerp van die storie nie, ek sit dit in die notas

wifi monitering'n Modieuse onderwerp vir die afgelope vyf jaar, hoofsaaklik onder federale kleinhandelkettings. Jy loop stadig op die handelsvloere rond, en jou selfoon met Wi-Fi aangeskakel, in 'n poging om aan een of ander draad van die netwerk te "kleef", stuur gereeld Probe Request-pakkies uit wat ontleed kan word om vir jou te bereken : hoe gereeld kom jy na hierdie winkel, vir watter bane jy loop ensovoorts. Verder word die data ingesamel, ontleed, hittekaarte geteken, en bestuurders "klop" geld van bestuur of beleggers vir sulke foto's. Intussen .... “daar is nie geld nie, maar jy hou vas ...”, en die resultaat (regte) moet reeds gewys word, die goeie ou liedjie “Ja, ja, dan verskaf ons natuurlik cisco’s en wat jy ook al wil hê, maar nou moet ons die resultaat vir die kliënt wys! Terloops, hulle het vergeet om te sê dat die Kliënt toegelaat het dat ons toerusting via Wi-Fi aan sy hotspot gekoppel word, maar op 'n algemene basis, net asof ons gaskliënte is. En nou moet jy ekwilibristiese routers maak - verskeie WiFi-subkoppelvlakke styg, waarvan een aan die hotspot vasklou, en die tweede monitor die omgewing, laai die resultaat van tcpdump verwoed in homself af, pak dan die inhoud van die lêer in 'n argief en loop die risiko om te sterf as gevolg van "ooreet" en probeer om die inhoud na die ftp-bediener uit te spoeg. Dit is nie verbasend dat die ekwilibristiese roeteerder dikwels "afbreek" en op een of ander manier op 'n afstand "gereanimeer" moet word nie.

radiusHier is dit makliker om die situasie te beskryf met iets soos hierdie stelling van die kliënt: “Ons wil 'n gedesentraliseerde netwerk van brandpunte hê wat sal werk op toerusting waarvan die model nie vooraf bekend is nie, deur kanale, maar watter ons nog nie ken nie. O, ons het vergeet om te sê, ons wil nie net advertensies aan kliënte wys nie, maar ook alles rondom die hotspot-installasiewerf ontleed. Nee, ons weet nog nie hoekom nie, maar ons sal daarmee vorendag kom, moenie huiwer nie, ons kon met hierdie idee vorendag kom.”

En ons moet nie vergeet dat as gevolg van baie onsekere omstandighede vooraf, bestuur uitgevoer moet word in nie-standaard toestande, wanneer ons nie direk met die router via ip:-poort kan koppel nie en gedwing word om bloot te wag vir aktiwiteit om te verskyn vanaf Dit. As ons abstraheer, dan kan die dialoog tussen die bediener en die router soos volg voorgestel word:

  • router: Hallo. Ek is so en so 'n router, is daar enige take vir my?
  • Bediener: so en so 'n router, ek het jou geregistreer dat jy lewe. Hier is die uitdaging: wys my die uitvoer van die ifconfig-opdrag?
  • router: Hallo. Ek is so en so 'n router, laas toe jy gevra het om die resultaat van ifconfig te wys, hier is dit. Is daar take vir my?
  • Bediener: so en so 'n router, ek het jou geregistreer dat jy lewe. Daar is geen take vir jou nie.

Die interessantste vraag is: hoe kan 'n afgeleë router 'n sekere hoeveelheid inligting stuur? In die laaste deel het ek beskryf dat die router, as gevolg van beperkte hulpbronne, slegs 'n "gestroopte" wget het, wat slegs deur GET werk en niks anders nie, daar is geen ftp-kliënt of krul nie. Meer presies, ons het 'n universele manier nodig, ongeag die kenmerke van die beeldsamestelling. Ek het besluit om wget te gebruik. Meer presies, hoe "gestop" - ek het net geen keuse gehad nie 🙂

Onmiddellik besprekingMy bestuursoplossing werk, nie baie beperk nie, en ek is seker dit is skeef, al pas dit die meeste van my kliënte. Hoe SAL dit moontlik wees om dit verstandig te doen - skryf 'n klein hulpprogram wat binêre data via POST deur die 80ste poort stuur. Sluit dit (nut) by die firmware van die router in en gebruik bash om toegang daartoe te verkry. Maar die realiteit is dat: a) jy vinnig moet b) jy waarskynlik alles op die bestaande "dieretuin van routers" moet doen c) "geen skade doen nie!" - as die router werk en ander take verrig, probeer om veranderinge aan te bring wat nie die bestaande funksionaliteit sal beïnvloed nie.

Kom ons gaan oor na die implementering. Kom ons sê jou kliënt wil van zabbix hê om die router maklik en natuurlik te herlaai, met 'n "muisklik". Vandag begin ons die beskrywing van die implementering met zabbix.
Voeg 'n nuwe skrif by in die kieslys "Administrasie" -> "Skripte". Ons noem dit "Reboot", as 'n opdrag skryf ons "php /usr/share/zabbix/reboot.php {HOST.HOST}"

Afstandmonitering en beheer van Linux/OpenWrt/Lede-toestelle via poort 80, vervolg

Volgende: Kieslys "Monitoring" -> "Jongste data" -> "Regskliek op die verlangde gasheer". Dit is hoe die spyskaart sal lyk nadat die skrif bygevoeg is.

Afstandmonitering en beheer van Linux/OpenWrt/Lede-toestelle via poort 80, vervolg
Gevolglik plaas ons die reboot.php-skrip in die /usr/share/zabbix-gids (dit kan vir jou anders wees, ek gebruik die zabbixa-wortelgids).

VeiligheidsvrywaringVir duidelikheid van verduideliking in die skrif, gebruik ek slegs die ID van die router, maar gebruik nie die wagwoord nie. In die werkende weergawe word dit nie aanbeveel nie! Hoekom het ek dit gedoen: want die groot vraag is waar om wagwoorde vir routers te stoor? In zabbixe self in "inventaris"? Teenstrydige praktyk. As 'n opsie: beperk eksterne toegang tot die reboot.php-lêer self

reboot.php lêer

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

Eintlik alles. Die vraag "hoe om die resultaat van die opdraguitvoering vanaf die toestelkant te kry" bly oop. Kom ons kyk na die taak deur die ifconfig-opdrag as voorbeeld te gebruik. Die volgende opdrag kan na die toestel gestuur word:

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

waar:
message=`ifconfig` - ons ken die resultaat van die uitvoer van die ifconfig-opdrag toe aan die $message-veranderlike
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - ons a.php-skrip wat routers registreer en boodskappe van hulle ontvang
u=gebruiker&p=wagwoord!&m=$boodskap - geloofsbriewe en die waarde van die navraagveranderlike m - ken die inhoud van die $boodskapveranderlike toe
-O /tmp/out.txt - ons het in hierdie geval nie uitvoer na die /tmp/out.txt-lêer nodig nie, maar as hierdie parameter nie gespesifiseer is nie, werk wget nie

Hoekom werk dit verkeerdOmdat dit 'n potensiële sekuriteitsgat is. die mees onskuldige fout wat kan gebeur, is as die uitvoer van jou opdrag, byvoorbeeld, die simbool "&" bevat. Daarom is dit nodig om alles te filter wat vanaf die routers gestuur word en alles wat na die bediener toe kom. Ja, ek is skaam, regtig. In my verdediging kan ek net skryf dat die hele artikel gewy word aan hoe om routers te bestuur met ongedefinieerde firmware, met ongedefinieerde kommunikasiekanale.

Wel, ek het die toekoms aangeraak: ek het nog nie uitgepluis hoe om die resultate (byvoorbeeld die resultaat van 'n opdraguitvoering) wat na die bediener kom met behulp van standaard zabbix-nutsmiddels, te weerspieël nie.

Ek herinner u daaraan dat alle bronne uit die Git-bewaarplek geneem kan word by: github.com/BazDen/iotnet.online.git

Bron: will.com

Voeg 'n opmerking