Sonata — serwer provisioning SIP

Nie wiem z czym porównać provisioning. Może z kotem? Wydaje się, że można się obyć bez niego, ale z nim jest trochę lepiej. Szczególnie, jeśli działa ))

Postawienie problemu:

  1. Chcę szybko, łatwo i bezpiecznie konfigurować telefony SIP. Podczas instalacji telefonu, a tym bardziej przy jego rekonfiguracji.
  2. Wielu dostawców ma swoje formaty konfiguracji, swoje narzędzia do generowania konfiguracji i swoje sposoby zabezpieczenia konfiguracji. A nie chce mi się z każdym z nich bawić.
  3. Wiele rozwiązań do provisioning, a) jest skierowanych na jednego dostawcę lub jeden system telefoniczny, b) realizuje się dość topornie, mnóstwo skryptów, parametrów, brr...

W odniesieniu do punktu 3 dodam komentarz, że istnieją doskonałe systemy provisioning dla FreePBX, dla FusionPBX, dla Kazoo, gdzie w otwartym dostępie są szablony dla telefonów różnych dostawców. Są komercyjne rozwiązania, gdzie również można skonfigurować w module provisioning pracę telefonów różnych producentów, na przykład centrali Yeastar.

Na Habra również jest mnóstwo przepisów, jak skonfigurować urządzenia różnych dostawców: raz, dwa. Ale jak to mówią, wszystkie systemy mają jeden zasadniczy problem. Dlatego stworzymy własny rower.

swojego formatu

Jak mówi xkcd, jeśli nie chcesz bawić się w 14 formatów — wymyśl 15.. Dlatego używamy ogólnych ustawień dla każdego telefonu i stworzymy nasz własny format konfiguracji JSON.

Wygląda mniej więcej tak:

{
   "key": "sdgjdeu9443908",
   "token": "590sfdsf8u984",
   "model": "gxp1620",
   "vendor": "grandstream",
   "mac": "001565113af8",
   "timezone_offset": "GMT+03",
   "ntp_server": "pool.ntp.org",
   "status": true,
   "accounts": [
      {
         "name": "Mobilon",
         "line": 1,
         "sip_register": "sip.mobilonsip.ru",
         "sip_name": "sip102",
         "sip_user": "sip102",
         "sip_password": "4321",
         "sip_auth": "sip102"
      }
   ]
}

Tak więc w każdym telefonie należy skonfigurować lokalny czas, linie SIP. To wszystko jest proste. Jeszcze inne przykłady można zobaczyć tutaj.

swój serwer provisioning

W instrukcjach producenta zazwyczaj jest punkt, w którym mówi się: weź csv, wpisz tam login-hasło-adres-MAC, naszym firmowym skryptem wygeneruj pliki, umieść je na serwerze WWW Apache i będzie dobrze.

W następnym punkcie instrukcji zwykle mówi się, że można również zaszyfrować wygenerowany plik konfiguracyjny.

Ale to wszystko klasyka. Nowoczesne podejście ze smoothie i Twitterem mówi, że należy zrobić gotowy serwer WWW, który nie będzie tak potężny jak Apache, a będzie robił tylko jedną małą rzecz. Generować i dostarczać konfiguracje po linku.

Zatrzymajmy się i przypomnijmy, że prawie wszystkie telefony SIP mogą obecnie otrzymywać konfiguracje przez http/https, dlatego nie będziemy rozpatrywać innych realizacji (ftp, tftp, ftps). Każdy telefon zna swój adres MAC. Dlatego stworzymy dwa linki: jeden osobisty — według klucza urządzenia, drugi ogólny, który działa na podstawie wspólnego tokena i adresu MAC.

Nie będę również skupiał się na zero-config, czyli na skonfigurowaniu telefonu "od zera", co oznacza, że podłączyłeś go do sieci i nagle działa. Nie, w moim scenariuszu podłącza się go do sieci, wykonuje wstępną konfigurację (ustawia go do otrzymywania konfiguracji z serwera provisioning), a potem pijesz pina coladę i przestawiasz telefon zgodnie z potrzebami przez provisioning. Przydzielanie opcji 66 to zadanie dla serwera DHCP.

Swoją drogą, miałem dość mówienia "provisioning", więc słowo skróciło się do "prowizji", nie kopnijcie mnie proszę w kostki.

A jeszcze jedno: nasz serwer provisioning nie ma UI, tzn. interfejsu użytkownika. Może kiedyś, ale nie jestem pewny, ponieważ nie jest mi to potrzebne. Zamiast tego mamy API do zapisywania/usuwania ustawień, uzyskiwania listy obsługiwanych dostawców, modeli, wszystko opisane zgodnie z zasadami specyfikacji swagger.

Dlaczego API, a nie UI? Ponieważ już mam swój system telefoniczny, więc mam źródło danych uwierzytelniających, skąd mogę wziąć te dane, skomponować potrzebny json i opublikować na serwerze provisioning. A serwer provisioning zgodnie z zasadami podanymi w pliku json zwróci odpowiedniemu urządzeniu jego konfigurację lub nie, jeśli urządzenie nie jest odpowiednie lub nie spełnia kryteriów podanych również w tym jsonie.

Sonata — serwer provisioning SIP

Tak powstała nasza mikrousługa provisioning. Nazywa się sonata, kod źródłowy jest dostępny na githubie, jest też gotowy obraz dockera, przykład użycia dockera tutaj.

Kluczowe funkcje:

  • w każdym przypadku ograniczony dostęp do konfiguracji w czasie, domyślnie 10 minut. Jeśli chcesz ponownie udostępnić konfigurację — opublikuj ją ponownie.

  • jeden format dla wszystkich dostawców, całe dopasowanie zostało usunięte do sonata, wysyłasz ustandaryzowany json, konfigurujesz każde dostępne urządzenie.

  • wszystkie wydawane konfiguracje dla urządzeń są logowane, wszystkie problematyczne miejsca można zobaczyć w logu i zobaczyć błędy.

  • możliwe jest użycie jednego wspólnego linku z tokenem, każdy telefon otrzymuje swoją konfigurację, podając adres MAC. Lub osobisty link za pomocą klucza.

  • API do zarządzania (management) i wydawania konfiguracji telefonów (provisioning) są podzielone według portów.

  • Testy. Dla mnie bardzo ważne było zarejestrowanie formatu wydawanej konfiguracji oraz pokrycie wszystkich standardowych sytuacji wydania konfiguracji testami. Aby wszystko działało sprawnie.

Wady:

Jak na razie szyfrowanie nie jest stosowane w ramach sonata. To znaczy, oczywiście, możesz zacząć używać https, stawiając na przykład nginx przed sonata. Ale firmowe metody jeszcze nie zostały uruchomione. Dlaczego? Projekt jest jeszcze młody, skonfigurował ledwie swoją pierwszą setkę urządzeń. A oczywiście zbieram pomysły, opinie. Następnie, aby wszystko było bezpieczne, aby konfiguracje nie mogły być podsłuchiwane w sieci, prawdopodobnie warto byłoby zająć się kluczami szyfrowania, tls i innymi aspektami, ale to będzie kontynuacja.

Brak interfejsu użytkownika. Może to być istotna wada dla końcowego użytkownika, ale dla administratora systemu znacznie ważniejsza jest konsolowa narzędzie, niż pełnoprawna aplikacja. Stworzenie narzędzia konsolowego było w planach, ale nie jestem pewien, czy jest potrzebne?

Co z tego wynika?

Mały i prosty serwer WWW do provisionowania kilku modeli telefonów z API do zarządzania.

Jeszcze raz, jak to powinno działać?

  1. Instalujemy sonata.
  2. Formujemy json-konfigurację i publikujemy ją w sonata.
  3. Następnie otrzymujemy od sonata link do provisionowania.
  4. Następnie ten link podajemy w aparacie telefonicznym.
  5. Aparat pobiera konfigurację.

W późniejszej eksploatacji tylko dwa kroki:

  1. Formujemy json-konfigurację i publikujemy ją w sonata.
  2. Aparat pobiera konfigurację.

Jakie telefony są provisionowane?

Dostawcy Grandstream, Fanvil, Yealink. Konfiguracje w ramach dostawcy są mniej więcej takie same, ale mogą się różnić w zależności od oprogramowania — może być potrzebne dodatkowe testowanie.

Jakie reguły można ustalać?

Na podstawie czasu. Możesz określić czas, do którego konfiguracja będzie dostępna.
Na podstawie adresu MAC. Przy wydawaniu konfiguracji za pomocą osobistego linku również zostanie sprawdzony adres MAC urządzenia.
Na podstawie IP. Na podstawie adresu IP, z którego wykonano zapytanie.

Jak współdziałać z sonata?

Poprzez API, wykonując zapytania http. API będzie dostępne w Twojej instalacji. Ponieważ API obsługuje specyfikację swagger, możesz skorzystać z internetowego narzędzia do testowych zapytań do API.

Ok, świetnie. Fajna rzecz, jak spróbować?

Najłatwiej uruchomić obraz docker na podstawie repozytorium sonata-sample. W repozytorium znajduje się instrukcja dotycząca instalacji.

А если знаю node.js?

Jeśli masz doświadczenie w używaniu JavaScript, szybko zrozumiesz, jak wszystko tutaj działa.

Czy będą dalsze prace nad sonatą?

Częściowo osiągnąłem swoje cele. Dalszy rozwój to kwestia moich zadań związanych z automatyzacją konfiguracji telefonów. Istnieje także możliwość rozszerzenia konfiguracji dla ustawienia przycisków telefonu, dodania adresów książek, być może jeszcze czegoś, napisz w komentarzach.

Podsumowanie i podziękowania

Będę wdzięczny za konstruktywne propozycje, zastrzeżenia, komentarze i pytania, ponieważ może być coś, co opisałem niezbyt jasno.

Również dziękuję wszystkim kolegom, którzy pomagali, doradzali, testowali, dostarczyli lub podarowali telefony do testów. Naprawdę, do projektu w różnym stopniu przyczyniło się wiele osób, z którymi kontaktowałem się w pracy, na AsterConfw czatach i e-mailach. Dziękuję za pomysły i przemyślenia.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster