Sonata — SIP provisioning server

Jag vet inte vad jag ska jÀmföra provisioning med. Kanske en katt? Det gÄr nog utan den, men med den blir det lite bÀttre. SÀrskilt om den jobbar))

ProblemstÀllning:

  1. Jag vill kunna konfigurera SIP-telefoner snabbt, enkelt och sÀkert. Vid installation av telefon och sÀrskilt vid omkonfigurering.
  2. MÄnga leverantörer har sina egna konfigurationsformat, sina egna verktyg för att generera konfigurationer och sina sÀtt att skydda dem. Att förstÄ sig pÄ alla dem Àr inte sÄ roligt.
  3. MÄnga lösningar för provisioning, a) Àr inriktade pÄ en leverantör eller ett telefonsystem, b) implementeras ganska tungt, med massor av skript och parametrar, usch...

AngÄende punkt 3 vill jag kommentera att det finns utmÀrkta provisioning-system för FreePBX, för FusionPBX, för Kazoo, dÀr det finns mallar för telefoner frÄn olika leverantörer tillgÀngliga offentligt. Det finns kommersiella lösningar dÀr man ocksÄ kan konfigurera en modul för provisioning av telefoner frÄn olika tillverkare, exempelvis Yeastar PBX.

Det finns ocksÄ mÄnga recept pÄ Habr om hur man konfigurerar apparater frÄn olika leverantörer: ett, tvÄ. Men som man sÀger, alla system har en fatal brist. DÀrför gör vi vÄr egen cykel.

vÄrt eget format

Som det sĂ€gs i xkcd, om du inte vill förstĂ„ dig pĂ„ 14 format — kom pĂ„ en 15:e. DĂ€rför anvĂ€nder vi gemensamma instĂ€llningar för alla telefoner och skapar vĂ„rt eget JSON-format för konfigurationer.

UngefÀr sÄ hÀr:

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

SÄ, i vilken telefon som helst mÄste man konfigurera lokal tid, SIP-linjer. HÀr Àr allt enkelt. Man kan Àven kolla fler exempel hÀr.

vÄr provisioning-server

I tillverkarens manualer finns vanligtvis en punkt dÀr det stÄr: ta en CSV, skriv dit inloggning-lösenord-MAC-adress, generera filer med vÄrt proprietÀra skript och lÀgg dem pÄ din Apache-webbserver, sÄ blir det bra.

I nÀsta punkt i manualen brukar det Àven nÀmnas att man kan kryptera den genererade konfigurationsfilen.

Men det Àr allt klassiskt. Den moderna ansatsen med smoothies och Twitter sÀger att man bör göra en fÀrdig webbserver, som inte Àr lika kraftfull som Apache, men bara gör en liten sak. Att skapa och leverera konfigurationer via lÀnk.

HÀr stannar vi upp och pÄminner oss om att nÀstan alla SIP-telefoner nu kan fÄ konfigurationer via http/https, dÀrför kommer vi inte att övervÀga andra implementeringar (ftp, tftp, ftps). Varje telefon kÀnner till sin MAC-adress. DÀrför kommer vi att göra tvÄ lÀnkar: en personlig - baserad pÄ enhetens nyckel, den andra allmÀn, som fungerar med en kombination av en gemensam token och MAC-adressen.

Jag kommer inte heller att stanna vid zero-configuration, dvs. att stÀlla in telefonen "frÄn grunden", det vill sÀga att du kopplar in den i nÀtverket och den plötsligt fungerar. Nej, i mitt scenario kopplar du in den i nÀtverket, gör en förinstÀllning (stÀller in den för att hÀmta konfigurationen frÄn provisionsservern), och sedan njuter du av en piña colada och omkonfigurerar telefonen som du vill genom provision. Att distribuera Option 66 Àr DHCP-serverns ansvar.

Förresten, jag har verkligen tröttnat pÄ att sÀga "provisioning", sÄ ordet har förkortats till "provision", snÀlla sparka mig inte i sidan.

Och en till sak: vÄr provisionsserver har ingen UI, det vill sÀga anvÀndargrÀnssnitt. Kanske, för tillfÀllet, men jag Àr inte sÀker, eftersom jag inte behöver det. Men det finns en API för att spara/radera instÀllningar, fÄ en lista över stödda leverantörer, modeller, allt beskrivet enligt swagger-specifikationen.

Varför API istÀllet för UI? Eftersom jag redan har mitt eget telefonsystem, har jag en kÀlla för autentiseringsuppgifter, dÀr jag enkelt kan hÀmta dessa uppgifter, komponera det nödvÀndiga json:et och publicera det pÄ provisionsservern. Och provisionsservern kommer enligt reglerna som anges i json-filen att ge den aktuella enheten sin konfiguration, eller inte ge det om enheten inte Àr korrekt, eller inte uppfyller kriterierna som ocksÄ anges i denna json.

Sonata — SIP provisioning server

SÄ hÀr har vi fÄtt en sÄdan mikrotjÀnst för provision. Den kallas sonata, kÀllkoden Àr tillgÀnglig pÄ github, det finns ocksÄ en fÀrdig docker-image, ett exempel pÄ hur man anvÀnder docker hÀr.

Nyckelfunktioner:

  • i alla fall begrĂ€nsad tillgĂ„ng till konfigurationen över tid, som standard 10 minuter. Om du vill göra konfigurationen tillgĂ€nglig igen - publicera konfigurationen pĂ„ nytt.

  • ett format för alla leverantörer, all anpassning Ă€r borttagen i sonata, du skickar standardiserat json, och konfigurerar vilken tillgĂ€nglig hĂ„rdvara som helst.

  • alla utgivna konfigurationer till enheterna loggas, alla problemomrĂ„den kan ses i loggen och eventuella fel kan identifieras

  • Det Ă€r möjligt att anvĂ€nda en gemensam lĂ€nk med en token, varje telefon fĂ„r sin egen konfiguration genom att ange MAC-adressen. Eller en personlig lĂ€nk baserad pĂ„ en nyckel.

  • API för hantering och tilldelning av konfigurationer till telefoner Ă€r separerade efter portar.

  • Tester. För mig var det mycket viktigt att faststĂ€lla formatet pĂ„ den tilldelade konfigurationen och att tĂ€cka alla vanliga situationer med tester. SĂ„ att allt fungerar som det ska.

Nackdelar:

För nÀrvarande anvÀnds ingen kryptering inom Sonata. Det vill sÀga, ni kan sjÀlvklart börja anvÀnda https, till exempel genom att sÀtta upp Nginx framför Sonata. Men de proprietÀra metoderna anvÀnds fortfarande inte. Varför? Projektet Àr fortfarande ungt och har knappt provisionerat sin första hundra enheter. Jag samlar sÄklart in idéer och feedback. Vidare, för att göra allt sÀkert och förhindra att konfigurationerna kan sniffas i nÀtverket, kan det vara vÀrt att satsa pÄ krypteringsnycklar, TLS och liknande, men det blir en fortsÀttning.

Avsaknad av UI. Detta kan vara en betydande nackdel för slutanvÀndaren, men för systemadministratören Àr en kommandoradsverktyg troligen viktigare Àn en fullstÀndig applikation. Att skapa en kommandoradsverktyg var i planerna men jag Àr osÀker pÄ om det verkligen behövs?

Vad blir resultatet?

En liten och enkel webserver för provisioning av flera telefonmodeller med API för hantering.

Hur ska detta fungera igen?

  1. Vi installerar Sonata.
  2. Vi formar en JSON-konfiguration och publicerar den i Sonata.
  3. DÀrefter fÄr vi en lÀnk frÄn Sonata för provisioning.
  4. Denna lÀnk anger vi i telefonapparaten.
  5. Apparaten hÀmtar konfigurationen.

I den efterföljande anvÀndningen finns bara tvÄ steg:

  1. Vi formar en JSON-konfiguration och publicerar den i Sonata.
  2. Apparaten hÀmtar konfigurationen.

Vilka telefoner provisioneras?

Leverantörer sĂ„som Grandstream, Fanvil, Yealink. Konfigurationerna inom varje leverantör Ă€r mer eller mindre lika, men kan variera beroende pĂ„ firmware — det kan behövas ytterligare tester.

Vilka regler kan stÀllas?

Efter tid. Du kan ange en tidsgrÀns för nÀr konfigurationen ska vara tillgÀnglig.
Efter MAC-adress. Vid tilldelning av konfigurationer via den personliga lÀnken kommer Àven MAC-adressen att kontrolleras.
Efter IP. Baserat pÄ den IP-adress dÀr förfrÄgan görs.

Hur interagerar man med Sonata?

Genom API, genom att göra HTTP-förfrÄgningar. API kommer att finnas i din installation. Eftersom API stöder Swagger-specifikationer kan du anvÀnda ett online-verktyg för testförfrÄgningar till API.

Okej, utmÀrkt. Det lÄter som en intressant sak, hur kan jag testa?

Det Àr enklast att köra en docker-avbildning baserad pÄ ett repository sonata-sample. I repositoryt finns en installationsguide.

А ДслО Đ·ĐœĐ°ŃŽ node.js?

Om du har erfarenhet av att anvÀnda JavaScript kommer du snabbt att förstÄ hur allt hÀr fungerar.

Kommer sonata att utvecklas?

Delvis har jag nÄtt mina mÄl. Vidare utveckling Àr en frÄga om mina uppgifter gÀllande automatisering av telefoninstÀllningar. Det finns ocksÄ möjlighet att utöka konfigurationerna för att stÀlla in telefonknappar, lÀgga till provisioneringsadressböcker, och kanske nÄgot mer, skriv gÀrna i kommentarerna.

Sammanfattning och tack

Jag ser fram emot konstruktiva förslag, invÀndningar, kommentarer och frÄgor, dÄ det kan finnas nÄgot jag har beskrivit oklart.

Jag vill ocksÄ uttrycka min tacksamhet till alla kollegor som har hjÀlpt, rÄdgett, testat, samt till de som har tillhandahÄllit/givit telefoner för tester. MÄnga mÀnniskor har pÄ olika sÀtt varit involverade i projektet, med vilka jag har haft kontakt genom arbete, pÄ AsterConfi chattar och e-post. Tack för idéerna och tankarna.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster