Sonata – SIP provisioning server

Nem tudom, mivel hasonlítsam össze a provisioningot. Talán egy macskával? Úgy tűnik, el lehet nélküle is, de vele kicsit jobb. Különösen, ha dolgozik. ))

A probléma felvetése:

  1. Szeretném gyorsan, egyszerűen és biztonságosan beállítani a SIP telefonokat. Telefon telepítésekor és különösen annak újrakonfigurálásakor.
  2. Sok szállítónak megvannak a saját konfigurációs formátumai, a saját konfigurációgeneráló eszközei és a saját védelmi módszerei. De nem nagyon szeretnék mindegyikkel foglalkozni.
  3. Sok provisioning megoldás a) egyetlen szállítóra vagy egy telefonrendszerre van orientálva, b) elég terjengősen valósul meg, sok szkripttel, paraméterrel, brr…

A 3. ponthoz fűznék egy megjegyzést, hogy léteznek nagyszerű provisioning rendszerek a FreePBX számára, a FusionPBX számára, a Kazoo számára, ahol az interneten elérhető sablonok vannak különböző szállítók telefonjaihoz. Léteznek kereskedelmi megoldások is, ahol a provisioning modulban beállítható a különböző gyártók telefonjainak működése, például a Yeastar PBX.

A Habrén is rengeteg recept található arról, hogyan kell beállítani a különböző szállítók készülékeit: egyszer, kétszer. De ahogy mondják, minden rendszernek van egy végzetes hibája. Ezért készítünk egy saját kerékpárt.

saját formátum

Ahogy az xkcd mondja, ha nem akarsz 14 formátummal foglalkozni — inventions 15-öt. Ezért általános beállításokat használunk bármely telefonhoz, és saját JSON konfigurációs formátumot készítünk.

Valami ilyesmi:

{
   "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"
      }
   ]
}

Szóval, bármely telefonban szükséges beállítani a helyi időt, a SIP vonalakat. Itt minden egyszerű. További példákat is megnézhetsz itt.

saját provisioning szerveredet

A gyártó kézikönyvében általában szerepel egy pont, ahol azt mondják: vegyél egy CSV-t, írd be a bejelentkezési nevet, jelszót, MAC-címet, a saját szkripteinkkel generálj fájlokat, helyezd azokat Apache webszerver alá, és minden rendben lesz.

A kézikönyv következő pontjában általában arról is szó esik, hogy a generált konfigurációs fájl titkosítható.

De ez mind klasszikus. A modern megközelítés a smoothie-kal és a Twitterrel azt mondja, hogy készíteni kell egy egyszerű webszervert, amely nem olyan erőteljes, mint az Apache, hanem csak egy apró feladatot fog végezni: konfigurációk létrehozása és szolgáltatása link alapján.

Itt álljunk meg, és emlékezzünk arra, hogy szinte minden SIP-telefon most már képes HTTP/HTTPS-en keresztül beszerezni a konfigurációkat, ezért más megvalósításokat (FTP, TFTP, FTPS) nem vizsgálunk. Emellett minden telefon ismeri a saját MAC-címét. Így két hivatkozást készítünk: egy személyeset — az eszköz kulcsa alapján, a másik egy általános, amely a közös token és a MAC-cím kombinációján működik.

A nullakonfigurációval, azaz a telefon "nulláról" történő beállításával nem fogok foglalkozni, azaz csak bedugtad a hálózatba, és már működik. Nem, az én forgatókönyvemben először bedugod a hálózatba, elvégezheted az előzetes beállítást (beállítottad, hogy a konfigurációt a provisioning szervertől kérje), majd iszogatsz egy piña coladát, és úgy állítod be a telefont, ahogyan szükséges a provisioning segítségével. Az Option 66 kiadása a DHCP-szerver feladata.

Egyébként nagyon belefáradtam a "provisioning" szót mondani, így ezt a szót lerövidítettem "provizs”-ra, kérlek, ne rugdossátok.

A provisioning szerverünknek nincs UI-ja, azaz felhasználói felülete. Lehet, hogy lesz, de nem biztos, mivel nekem erre nincs szükségem. Viszont van API a beállítások mentésére/törlésére, a támogatott gyártók és modellek listájának megszerzésére, minden a swagger specifikáció szerint van leírva.

Miért API, és nem UI? Mivel már van saját telefonos rendszerem, van egy hitelesítési adatok forrásom, ahonnan elegendő ezeket az adatokat összegyűjteni, a szükséges JSON-t összerakni és közzétenni a provisioning szerveren. A provisioning szerver pedig a JSON-fájlban megadott szabályok szerint adja ki a megfelelő eszköz konfigurációját, vagy nem adja ki, ha az eszköz nem megfelelő vagy nem felel meg a megadott kritériumoknak szintén ebben a JSON-ban.

Sonata – SIP provisioning server

Ilyen lett a provisioning mikroszolgáltatásunk. A neve sonata, a forráskód elérhető a GitHubon, emellett van egy készen lévő Docker-kép, példa a Docker használatára itt.

Kulcsfontosságú jellemzők:

  • bármilyen esetben időkorlátos hozzáférés a konfigurációhoz, alapértelmezés szerint 10 perc. Ha még egyszer el szeretnéd érni a konfigurációt — újra kell közzétenni a konfigurációt.

  • egyforma formátum minden gyártó számára, minden beállítás a sonata-ban van, és egy szabványosított JSON-t küldesz, amellyel bármilyen elérhető berendezést beállíthatsz.

  • minden kiadott konfiguráció az eszközök számára naplózva van, minden problémás helyet meg lehet nézni a naplóban és láthatók a hibák.

  • Egy közös link tokennel használható, minden telefon megkapja a saját konfigurációját, ha a MAC-címet megadjuk. Vagy egy személyre szabott linket a kulcs alapján.

  • Az API a telefonok konfigurációjának kezelésére (management) és kiadására (provisioning) portok szerint van elválasztva.

  • Tesztelés. Számomra nagyon fontos volt rögzíteni a kiadott konfiguráció formátumát, és minden szokásos konfigurálási helyzetet tesztekkel lefedni. Hogy minden világosan működjön.

Hátrányok:

Jelenleg nincs titkosítás a sonata keretein belül. Tehát természetesen elkezdheti használni a https-t, például az nginx telepítésével a sonata elé. De a hivatalos módszerek egyelőre még nincsenek alkalmazva. Miért? A projekt még fiatal, alig az első száz eszköz került beüzemelésre. És természetesen gyűjtöm az ötleteket, a visszajelzéseket. Továbbá, hogy mindent biztonságosan csináljunk, hogy a konfigurációk ne legyenek lehallgathatók a hálózaton, valószínűleg érdemes lenne kulcsokkal, tls-sel és hasonlókkal foglalkozni, de ez egy folytatás.

UI hiánya. Ez talán jelentős hátrány a végfelhasználó számára, de a rendszergazda számára inkább a konzolos eszköz fontos, mint egy teljes értékű alkalmazás. A konzolos eszköz készítése a tervben volt, de nem vagyok benne biztos, hogy szükséges-e?

Mi az összefoglaló?

Kis és egyszerű webszerver több telefonmodell provisioningjára API-val a kezeléshez.

Még egyszer, hogyan kellene ennek működnie?

  1. Telepítjük a sonata-t.
  2. Létrehozzuk a json konfigurációt, és közzétesszük a sonata-n.
  3. Ezután kapunk a sonata-tól egy linket a provisioninghoz.
  4. Ezt a linket megadjuk a telefonkészüléken.
  5. A készülék letölti a konfigurációt.

A későbbi használat során csak két lépés:

  1. Létrehozzuk a json konfigurációt, és közzétesszük a sonata-n.
  2. A készülék letölti a konfigurációt.

Milyen telefonokat provizionálunk?

A Grandstream, Fanvil és Yealink gyártók. A konfigurációk ezen gyártók számára többé-kevésbé azonosak, de eltérhetnek a firmware-től függően — lehet, hogy további tesztelés szükséges.

Milyen szabályokat lehet beállítani?

Idő alapján. Megadhatja az időt, ameddig a konfiguráció elérhető lesz.
MAC-cím alapján. Személyre szabott link alapján a konfiguráció átadása során a készülék MAC-címét is ellenőrzik.
IP cím alapján. Az IP-címre, ahonnan a kérést tették.

Hogyan lépjünk kapcsolatba a sonata-val?

API-n keresztül, http kérések végrehajtásával. Az API elérhető lesz az Ön telepítésében. Mivel az API támogatja a swagger specifikációt, érdemes használni online eszközt a tesztkérésekhez az API-hoz.

Oké, nagyszerű. Jól néz ki, hogyan próbálhatom ki?

A legkönnyebb docker képet telepíteni egy repository alapjaira sonata-sample. A repository tartalmazza a telepítési útmutatót.

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

Ha van tapasztalata a JavaScript használatában, gyorsan megérti, hogyan működik itt minden.

Lesz fejlesztés a sonata-n?

Részben elértem a céljaimat. A további fejlesztés a telefonok beállításának automatizálásával kapcsolatos feladataim kérdése. Még van lehetőség a telefon gombok beállításának konfigurációinak bővítésére, címjegyzékek provisioning címek hozzáadására, esetleg még valami másra, írjon a megjegyzésekbe.

Összegzés és köszönetnyilvánítás

Örömmel várom a konstruktív javaslatokat/visszajelzéseket/megjegyzéseket és kérdéseket, mivel lehet, hogy van valami, amit nem érthetően írtam le.

Köszönetet mondok minden kollégának, aki segített, tanácsolt, tesztelt, telefonokat biztosított/ajándékozott a teszteléshez. Valóban, a projekthez számos ember kapcsolódik különböző mértékben, akikkel munkám során, a AsterConf‘e, csevegésekben és e-mailekben beszélgettem. Köszönöm az ötleteket és gondolatokat.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster