Zabbix - poszerzanie granic makr

Podczas tworzenia rozwiązania dla klienta pojawiły się 2 zadania, które chciałem rozwiązać pięknie i przy normalnej funkcjonalności Zabbix.

Zadanie 1. Śledzenie aktualnej wersji oprogramowania na routerach Mikrotik.

Zadanie można łatwo rozwiązać - dodając agenta do szablonu HTTP. Agent otrzymuje aktualną wersję ze strony Mikrotik, a wyzwalacz porównuje aktualną wersję z aktualną i generuje alert w przypadku rozbieżności.

Gdy masz 10 routerów, taki algorytm nie jest krytyczny, ale co zrobić z 3000 routerów? Wysłać 3000 żądań do serwera? Oczywiście taki schemat się sprawdzi, jednak sam pomysł 3000 żądań nie przypadł mi do gustu, chciałem znaleźć inne rozwiązanie. Poza tym taki algorytm nadal miał wadę: druga strona może policzyć taką liczbę żądań z jednego adresu IP na atak DoS, że może go po prostu zablokować.

Zadanie 2. Korzystanie z sesji autoryzacyjnej w różnych agentach HTTP.

Gdy agent musi otrzymywać informacje z „zamkniętych” stron za pośrednictwem protokołu HTTP, potrzebny jest plik cookie autoryzacji. Aby to zrobić, zwykle służy standardowy formularz autoryzacji z parą „login / hasło” i ustawieniem identyfikatora sesji w pliku cookie.

Istnieje jednak problem, nie można uzyskać dostępu do danych innego elementu z jednego elementu agenta HTTP w celu zastąpienia tej wartości w nagłówku.

Istnieje również „skrypt sieciowy”, ma on jeszcze jedno ograniczenie, nie pozwala na pobieranie treści do analizy i dalszego zapisywania. Możesz jedynie sprawdzić obecność niezbędnych zmiennych na stronach lub przekazać wcześniej otrzymane zmienne pomiędzy krokami skryptu internetowego.

Po krótkim zastanowieniu się nad tymi zadaniami zdecydowałem się zastosować makra, które są doskonale widoczne w dowolnej części systemu monitorującego: w szablonach, hostach, wyzwalaczach czy elementach. Możesz także aktualizować makra za pośrednictwem interfejsu API interfejsu internetowego.

Zabbix posiada dobrą i szczegółową dokumentację API. Do wymiany danych poprzez API używany jest format danych Json. Szczegóły można znaleźć w oficjalna dokumentacja.

Sekwencję działań mających na celu pozyskanie potrzebnych nam danych i zapisanie ich w makrze przedstawia poniższy diagram.

Zabbix - poszerzanie granic makr

Krok 1

Pierwszy krok może składać się z pojedynczego działania lub wielu działań. Cała główna logika jest zawarta w pierwszych krokach, a ostatnie 3 kroki są głównymi.

W moim przykładzie pierwszym krokiem było uzyskanie plików cookie autoryzacyjnych w centrali PBX dla pierwszego zadania. Do drugiego zadania dostałem numer aktualnej wersji oprogramowania Mikrotika.

Adres URL aktualnych wersji oprogramowania Mikrotik

Dostęp do tych adresów uzyskuje sam sprzęt Mikrotik po otrzymaniu najnowszej dostępnej wersji oprogramowania sprzętowego.

Pierwszy krok jest całkowicie indywidualny dla każdego przypadku i logika jego działania może być inna. Wszystko zależy od Twojego zadania.

Pracując ze skryptami internetowymi, śledź, jakiej metody reakcji potrzebujesz. Nagłówki Odpowiedź HTTP lub self тело odpowiedź bez nagłówków?
Jeśli potrzebne są pliki cookie autoryzacyjne, ustaw metodę odpowiedzi Nagłówki podobnie jak w przypadku Asteriska.

Jeśli potrzebujesz danych, tak jak w przypadku odpowiedzi serwera mikrotik, umieść ciało odpowiedź bez nagłówków.

Krok 2

Przejdźmy do drugiego kroku. Uzyskiwanie sesji autoryzacyjnej:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin"
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

jsonrpc to wersja używanego protokołu JSON-RPC;
Zabbix implementuje JSON-RPC w wersji 2.0;

  • metoda – metoda, która jest wywoływana;
  • params - parametry przekazywane przez metodę;
  • id to dowolny identyfikator żądania;
  • au - klucz uwierzytelniający użytkownika; ponieważ jeszcze go nie mamy, ustawmy go na null.

Aby pracować z API, utworzyłem osobne konto z ograniczonymi uprawnieniami. Po pierwsze, nie musisz udzielać dostępu tam, gdzie nie musisz. Po drugie, przed wersją 5.0 można było odczytać hasło ustawione za pomocą makra. W związku z tym, jeśli użyjesz hasła administratora Zabbix, konto administratora będzie łatwe do kradzieży.

Będzie to szczególnie prawdziwe podczas pracy z API za pomocą skryptów innych firm i przechowywania poświadczeń na boku.

Od wersji 5.0 istnieje możliwość ukrycia hasła zapisanego w makrze.

Zabbix - poszerzanie granic makr

Tworząc osobne konto do aktualizacji danych poprzez API, koniecznie sprawdź, czy potrzebne Ci dane są dostępne poprzez interfejs WWW i czy istnieje możliwość ich aktualizacji. Nie sprawdzałem, a potem długo nie mogłem zrozumieć, dlaczego potrzebne mi makro nie jest widoczne w API.

Zabbix - poszerzanie granic makr

Po otrzymaniu autoryzacji w API przystępujemy do uzyskania listy makr.

Krok 3

Interfejs API nie pozwala na aktualizację makra hosta według nazwy, należy najpierw uzyskać identyfikator makra. Co więcej, aby uzyskać listę makr dla konkretnego hosta, musisz znać identyfikator tego hosta, a jest to dodatkowa prośba. Użyj domyślnego makra {ID HOSTA} we wniosku jest niedozwolone. Postanowiłem ominąć to ograniczenie w ten sposób:

Zabbix - poszerzanie granic makr

Utworzyłem makro lokalne z identyfikatorem tego hosta. Znalezienie identyfikatora hosta jest bardzo łatwe z poziomu interfejsu internetowego.

Odpowiedź zawierającą listę wszystkich makr na danym hoście można filtrować według wzorca:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{$MIKROTIK_VERSION}"

Zabbix - poszerzanie granic makr

W ten sposób otrzymujemy identyfikator potrzebnego makra, gdzie MIKROTIK_VERSION to nazwa makra, którego szukamy. W moim przypadku przeszukiwane jest makro MIKROTIK_VERSIONTo, które zostało przypisane do hosta.

Samo żądanie wygląda następująco:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.get",
    "params":{
        "output":"extend",
        "hostids":"{$HOST_ID}"
    },
    "auth":"{sid}",
    "id":1
}

Zmienna {sid} uzyskany w drugim kroku i będzie używany stale tam, gdzie trzeba pracować z interfejsem API.

Ostatni 4 KROK - aktualizacja makra

Teraz znamy identyfikator makra, który należy zaktualizować, plik cookie autoryzacji lub wersję oprogramowania routera. Możesz zaktualizować samo makro.

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.update",
    "params":{
        "hostmacroid":"{hostmacroid}",
        "value":"{mikrotik_version}"
    },
    "auth":"{sid}",
    "id":1
}

{mikrotik_wersja} jest wartością uzyskaną w pierwszym kroku. W moim przykładzie wersja aktualnego oprogramowania mikrotik
{hostmacroid} - wartość uzyskano w kroku trzecim - identyfikator makra, które aktualizujemy.

odkrycia

Podejście do rozwiązania problemu za pomocą standardowej funkcjonalności jest znacznie bardziej skomplikowane i dłuższe. Zwłaszcza jeśli znasz się na programowaniu i potrafisz szybko dodać niezbędną logikę w skrypcie.

Oczywistą zaletą takiego podejścia jest „przenośność” rozwiązania pomiędzy różnymi serwerami.

Dla mnie osobiście dziwne jest to, że agent HTTP nie może uzyskać dostępu do danych innego elementu i zastąpić ich treścią żądania lub nagłówkami [ ZBXNEXT-5993].

Gotowy szablon może pobierz na GitHubie.

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

Dodaj komentarz