Kontynuowano zdalne monitorowanie i zarządzanie urządzeniami opartymi na systemie Linux/OpenWrt/Lede poprzez port 80

To już ostatnia część artykułu, tu początek habr.com/en/post/445568
Ostatni raz pisałem o tym jak wdrożyłem monitorowanie urządzeń, teraz porozmawiamy o zarządzaniu. W rozmowach z „technikami” po stronie Klienta często spotykam się z ograniczonym postrzeganiem możliwości tak małych urządzeń (przy małych zasobach pamięci i wydajności), wielu uważa, że ​​„najbardziej potrzebujemy wysłać restart, aby uzyskać coś więcej poważnie, wyślemy zespół”.
Praktyka pokazuje jednak, że nie jest to do końca prawdą. Oto mała lista typowych zadań:

  1. Diagnostyka sieci i rozwiązywanie problemów. Za portem Ethernet routera zwykle znajduje się inny element sprzętu, który ma swój własny wewnętrzny adres IP. Czasami możesz (powinieneś) go „pingować”. Albo zarządzanie tunelem - jeśli nagle tunel nie podnosi się na routerze pracującym przez modem 3G, ale widzimy sam router.
  2. Konserwacja systemu. Aktualizacja oprogramowania sprzętowego, aktualizacja skryptu serwisowego.
  3. Akt równoważący. Można to nazwać „perwersją”, ale koncepcja „równoważnika”, jak cytuję, „zdolność cyrkowca do utrzymania równowagi w niestabilnej pozycji ciała” - lepiej pasuje. Takie sytuacje wynikają z ograniczonego budżetu Klienta. Poniżej podałem kilka przykładów, ale... Nie są one bezpośrednio związane z tematem opowiadania, zamieszczam je w notatkach

Monitorowanie Wi-FiModny temat od pięciu lat, głównie wśród federalnych sieci handlowych. Spacerujesz spokojnie po parkietach, a Twój telefon komórkowy z włączonym Wi-Fi, próbując „przykleić się” do jakiegoś wątku sieci, regularnie wysyła pakiety Probe Request, które można przeanalizować w celu obliczenia ty: jak często przychodzisz do tego sklepu, z jakiego powodu, chodzisz po trajektoriach i tak dalej. Następnie dane są zbierane, analizowane, rysowane są mapy cieplne, a menedżerowie „wyłudzają” pieniądze od zarządu lub inwestorów za takie zdjęcia. No cóż, na razie.... „nie ma pieniędzy, ale trzymaj się…”, a wynik (prawdziwy) już trzeba pokazać, zaczyna się stara dobra piosenka: „Tak, tak, w takim razie oczywiście zainstaluję cis i wszystko, co chcesz, ale teraz musimy pokazać klientowi wynik! Swoją drogą zapomnieliśmy dodać, że Klient pozwolił nam podłączyć nasz sprzęt do swojego hotspotu poprzez Wi-Fi, ale na zasadach ogólnych, tak jakbyśmy byli gośćmi.” I tak musimy zrobić równoważące routery - zostaje podniesionych kilka podinterfejsów Wi-Fi, z których jeden przylega do hotspotu, a drugi monitoruje środowisko, gorączkowo przesyła do siebie wynik tcpdump, po czym pakuje zawartość pliku do archiwum i ryzykuje umierający z „przejedzenia” próbuje wypluć zawartość na serwer FTP. Nic dziwnego, że router równoważący często „psuje się” i trzeba go jakoś zdalnie „reanimować”.

PromieńŁatwiej opisać tutaj sytuację za pomocą czegoś takiego jak oświadczenie klienta: „Chcemy zdecentralizowanej sieci hotspotów, która działałaby na sprzęcie, którego model nie jest z góry znany, kanałami, ale którego jeszcze nie znamy. Aha, zapomnieliśmy powiedzieć, że chcemy nie tylko wyświetlać klientom reklamy, ale także analizować wszystko wokół lokalizacji, w której zainstalowany jest hotspot. Nie, jeszcze nie wiemy dlaczego, ale się dowiemy, nie wątpcie, udało nam się wpaść na ten pomysł.

A nie zapominajmy, że ze względu na wiele nieznanych wcześniej okoliczności, sterowanie musi odbywać się w niestandardowych warunkach, kiedy nie możemy połączyć się z routerem bezpośrednio przez port IP: i zmuszeni jesteśmy po prostu czekać na aktywność z niego. Jeśli się abstrahujemy, dialog między serwerem a routerem można przedstawić w następujący sposób:

  • Routera: Cześć. Jestem takim a takim routerem, czy są dla mnie jakieś zadania?
  • Server: router taki i taki, zarejestrowałem cię, że żyjesz. Oto wyzwanie: pokazać wynik polecenia ifconfig?
  • Routera: Cześć. Jestem takim a takim routerem, ostatnim razem, gdy prosiłeś o pokazanie wyniku ifconfig, oto on. Czy są dla mnie jakieś zadania?
  • Server: router taki i taki, zarejestrowałem cię, że żyjesz. Nie ma dla Ciebie żadnych zadań.

Najciekawsze pytanie: w jaki sposób zdalny router może wysłać określoną ilość informacji? W ostatniej części opisałem, że router ze względu na ograniczone zasoby posiada jedynie „okrojony” wget, który działa tylko poprzez GET i nic więcej; nie ma tam klienta FTP ani curl. Dokładniej, potrzebujemy uniwersalnej metody, niezależnie od cech montażu obrazu. Zdecydowałem się użyć wget. A dokładniej, jak się „zatrzymałam” – po prostu nie miałam wyboru :)

Tylko zastrzeżenieMoje rozwiązanie do zarządzania działa, choć nie jest bardzo ograniczone, i jestem pewien, że jest krzywe, nawet jeśli odpowiada większości moich klientów. Jak mógłbyś to zrobić mądrze - napisz małe narzędzie, które będzie wysyłać dane binarne POST przez port 80. Dołącz je (narzędzie) do oprogramowania sprzętowego routera i uzyskaj do niego dostęp za pomocą bash. Ale rzeczywistość jest taka, że: a) musimy szybko b) prawdopodobnie będziemy musieli zrobić wszystko na istniejącym „zoo routerów” c) „nie szkodzić!” — jeśli router pracuje i wykonuje inne zadania, spróbuj wprowadzić zmiany, które nie będą miały wpływu na istniejącą funkcjonalność.

Przejdźmy do realizacji. Załóżmy, że Twój klient chce łatwo i naturalnie zrestartować router z Zabbix za pomocą „kliknięcia myszą”. Dziś zaczniemy opisywać wdrożenie w Zabbixie.
W menu „Administracja” -> „Skrypty” dodaj nowy skrypt. Nazywamy to „Reboot”, wpisz „php /usr/share/zabbix/reboot.php {HOST.HOST}” jako polecenie

Kontynuowano zdalne monitorowanie i zarządzanie urządzeniami opartymi na systemie Linux/OpenWrt/Lede poprzez port 80

Dalej: Menu „Monitorowanie” -> „Najnowsze dane” -> „Kliknij prawym przyciskiem myszy żądany węzeł sieci”. Tak będzie wyglądać menu po dodaniu skryptu.

Kontynuowano zdalne monitorowanie i zarządzanie urządzeniami opartymi na systemie Linux/OpenWrt/Lede poprzez port 80
W związku z tym umieściliśmy skrypt restart.php w katalogu /usr/share/zabbix (Twój może być inny, ja używam katalogu głównego Zabbixa).

Zastrzeżenie dotyczące bezpieczeństwaAby wyjaśnienie w skrypcie było jaśniejsze, używam tylko identyfikatora routera, ale nie używam hasła. Nie zaleca się robienia tego w wersji produkcyjnej! Dlaczego to zrobiłem: ponieważ najważniejsze pytanie brzmi: gdzie przechowywać hasła do routerów? W samym zabbixe w „danych inwentarza”? Kontrowersyjna praktyka. Alternatywnie: ogranicz dostęp zewnętrzny do samego pliku restart.php

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

To wszystko. Pytanie pozostaje otwarte: „jak uzyskać wynik wykonania polecenia z urządzenia”. Przyjrzyjmy się zadaniu na przykładzie polecenia ifconfig. Polecenie to można wysłać do urządzenia:

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

, gdzie:
wiadomość=`ifconfig` — przypisujemy wynik polecenia ifconfig do zmiennej $message
wget”xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — nasz skrypt a.php, który rejestruje routery i odbiera od nich wiadomości
u=użytkownik&p=hasło!&m=$wiadomość — dane uwierzytelniające i wartość zmiennej żądania m — przypisuje zawartość zmiennej $message
-O /tmp/out.txt — w tym przypadku nie potrzebujemy wyjścia do pliku /tmp/out.txt, ale jeśli ten parametr nie zostanie podany, wget nie zadziała

Dlaczego to nie działa?Ponieważ jest to potencjalna luka w zabezpieczeniach. Najbardziej nieszkodliwy błąd, jaki może się zdarzyć, to znak „&” na wyjściu polecenia. Dlatego konieczne jest filtrowanie zarówno wszystkiego, co jest wysyłane z routerów, jak i wszystkiego, co przychodzi do serwera. Tak, jest mi wstyd, naprawdę. Na swoją obronę mogę tylko napisać, że cały artykuł poświęcony jest sposobowi zarządzania routerami z predefiniowanym oprogramowaniem i kanałami komunikacyjnymi, które nie są z góry zdefiniowane.

Cóż, początek na przyszłość: nie wymyśliłem jeszcze, jak używać standardowych narzędzi Zabbix do odzwierciedlania wyników (na przykład wyniku wykonania polecenia), które przychodzą do serwera.

Przypominam, że wszystkie źródła można pozyskać z repozytorium Git pod adresem: github.com/BazDen/iotnet.online.git

Źródło: www.habr.com

Dodaj komentarz