Sonata — server di provisioning SIP

Non so con cosa confrontare il provisioning. Forse con un gatto? Si può anche fare a meno, ma con lui è un po' meglio. Soprattutto se funziona ))

Identificazione del problema:

  1. Voglio configurare i telefoni SIP in modo rapido, semplice e sicuro. Durante l'installazione del telefono e ancor più durante la sua riconfigurazione.
  2. Molti fornitori hanno i propri formati di configurazione, le proprie utilità per generare configurazioni e i propri modi di proteggerle. E non voglio perdermi in ognuno di essi.
  3. Molte soluzioni di provisioning sono a) orientate a un solo fornitore o a un solo sistema telefonico, b) abbastanza ingombranti nell'implementazione, con una miriade di script, parametri, e via dicendo...

Riguardo al punto 3, voglio aggiungere che esistono ottimi sistemi di provisioning per FreePBX, per FusionPBX, per Kazoo, dove sono disponibili modelli per telefoni di vari fornitori. Esistono anche soluzioni commerciali dove è possibile configurare nel modulo provisioning il funzionamento di telefoni di diversi produttori, come le centrali telefoniche Yeastar.

Su Habr ci sono anche molte ricette su come configurare i dispositivi di vari fornitori: una volta, due volte. Ma come si dice, tutti i sistemi hanno un difetto fatale. Quindi creeremo la nostra bici.

il nostro formato

Come si dice in xkcd, se non vuoi occuparti di 14 formati — inventane un quindicesimo. Perciò utilizziamo impostazioni generali per qualsiasi telefono e creeremo il nostro formato di configurazione json.

Circa così:

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

Quindi, in ogni telefono è necessario impostare l'ora locale e le linee sip. Qui è tutto semplice. È possibile vedere ulteriori esempi qui.

del nostro server di provisioning.

Nei manuali del produttore c'è di solito un punto che dice: prendi un CSV, annota lì login-password-indirizzo MAC, genera i file con il nostro script proprietario, mettimi sotto il server web Apache e sarà tutto a posto.

Nel punto successivo del manuale di solito si racconta che si può anche cifrare il file di configurazione generato.

Ma è tutta classica. L'approccio moderno con smoothie e Twitter dice che bisogna creare un server web pronto, che non sarà potente come Apache, ma farà solo una piccola cosa. Generare e fornire configurazioni tramite link.

Qui ci fermiamo e ricordiamo che quasi tutti i telefoni SIP ora possono ricevere configurazioni tramite http/https, quindi non consideriamo altre implementazioni (ftp, tftp, ftps). Inoltre, ogni telefono conosce il proprio indirizzo MAC. Pertanto, creeremo due link: uno personale — tramite la chiave del dispositivo, e uno generico, che funziona tramite la combinazione di un token generico e l'indirizzo MAC.

Inoltre, non mi soffermerò sul zero-config, cioè la configurazione del telefono "da zero", ovvero lo colleghi alla rete e puff, funziona. No, nel mio scenario, lo colleghi a rete, esegui la configurazione preliminare (configuri per ricevere la configurazione dal server di provisioning), e poi bevi una piña colada e riconfiguri il telefono come necessario attraverso il provisioning. Fornire l'Option 66 è compito del server DHCP.

A proposito, sono completamente stanco di dire "provisioning", quindi la parola è stata abbreviata in "provision", non prendetevela con me.

E ancora: il nostro server di provisioning non ha interfaccia utente, cioè un'interfaccia utente. Forse, per ora, ma non sono sicuro, perché non ne ho bisogno. Ma abbiamo un'API per salvare/rimuovere impostazioni, ottenere l'elenco dei fornitori e dei modelli supportati, tutto descritto secondo le specifiche swagger.

Perché API e non UI? Perché ho già il mio sistema telefonico, quindi ho una fonte di credenziali, dove mi basta prendere questi dati, comporre il json necessario e pubblicarlo sul server di provisioning. E già il server di provisioning, secondo le regole indicate nel file json, fornirà al dispositivo richiesto la sua configurazione o non la fornirà, se il dispositivo non è corretto o non soddisfa i criteri indicati anche in questo json.

Sonata — server di provisioning SIP

Ecco un microservizio di provisioning. Si chiama sonata, il codice sorgente è disponibile su GitHub, c'è anche un immagine Docker pronta, esempio di utilizzo di Docker qui.

Caratteristiche chiave:

  • in ogni caso accesso limitato alla configurazione per tempo, di default 10 minuti. Se desideri rendere nuovamente la configurazione disponibile — ripubblica la configurazione.

  • un formato per tutti i fornitori, tutta l'adattabilità è stata incorporata in sonata, invii il json standardizzato, configuri qualsiasi attrezzatura disponibile.

  • tutte le configurazioni fornite ai dispositivi vengono registrate, tutti i punti problematici possono essere visualizzati nel log e gli errori possono essere facilmente identificati.

  • È possibile utilizzare un unico link condiviso con un token, ogni telefono riceve la propria configurazione specificando l'indirizzo MAC. Oppure un link personale tramite chiave.

  • Le API per la gestione e la fornitura delle configurazioni ai telefoni sono separate per porta.

  • Test. Per me era molto importante registrare il formato della configurazione fornita e coprire tutte le situazioni comuni con i test. Affinché tutto funzionasse correttamente.

Contro:

Attualmente non viene utilizzata alcuna crittografia con sonata. Cioè, sì, puoi iniziare a utilizzare HTTPS impostando, ad esempio, Nginx davanti a sonata. Ma i metodi proprietari non sono ancora stati implementati. Perché? Il progetto è ancora giovane, ha appena provvigionato forse il suo primo centinaio di dispositivi. Sto anche raccogliendo idee e feedback. Inoltre, per rendere tutto sicuro, affinché le configurazioni non possano essere intercettate in rete, sarebbe probabilmente opportuno considerare chiavi di crittografia, TLS e simili, ma questo sarà un argomento da trattare in seguito.

Mancanza di UI. Questo potrebbe essere un punto critico per l'utente finale, ma per un amministratore di sistema è più importante avere uno strumento da console piuttosto che un'applicazione completa. Creare uno strumento da console era nei piani, ma non sono sicuro che sia necessario.

Quali sono i risultati finali?

Un piccolo e semplice server web per provvigionare diversi modelli di telefoni con API per la gestione.

Ancora una volta, come dovrebbe funzionare?

  1. Installiamo sonata.
  2. Formiamo la configurazione JSON e la pubblichiamo in sonata.
  3. Poi otteniamo da sonata il link per il provisioning.
  4. Poi inseriamo questo link nel telefono.
  5. Il dispositivo recupera la configurazione.

Nelle operazioni successive ci sono solo due fasi:

  1. Formiamo la configurazione JSON e la pubblichiamo in sonata.
  2. Il dispositivo recupera la configurazione.

Quali telefoni vengono provvigionati?

I fornitori Grandstream, Fanvil, Yealink. Le configurazioni all'interno del fornitore sono più o meno simili, ma potrebbero differire a seconda del firmware — potrebbe essere necessario testare ulteriormente.

Quali regole possono essere impostate?

Per tempo. Puoi specificare il tempo entro il quale la configurazione sarà disponibile.
Per indirizzo MAC. Quando si fornisce la configurazione tramite un link personale, sarà anche controllato l'indirizzo MAC del dispositivo.
Per IP. In base all'indirizzo IP da cui è stata effettuata la richiesta.

Come interagire con sonata?

Attraverso API, effettuando richieste HTTP. L'API sarà disponibile nella tua installazione. Poiché l'API supporta la specifica Swagger, puoi utilizzare uno strumento online per l'invio di richieste di test all'API.

Ok, ottimo. È interessante, come posso provarlo?

La cosa più semplice è avviare l'immagine Docker basata sul repository sonata-sample.Nel repository c'è un'istruzione per l'installazione.

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

Se hai esperienza nell'uso di JavaScript, capirai rapidamente come funziona tutto qui.

Ci sarà uno sviluppo di sonata?

In parte ho raggiunto i miei obiettivi. Lo sviluppo futuro dipenderà dalle mie necessità relative all'automazione della configurazione dei telefoni. C'è anche la possibilità di espandere le configurazioni per la personalizzazione dei tasti del telefono, aggiungere provvigioni per le rubriche, forse anche altro, scrivimi nei commenti.

Riassunto e ringraziamenti

Sarò felice di ricevere suggerimenti/obiezioni/commenti e domande costruttive, poiché può darsi che non abbia descritto qualcosa in modo chiaro.

Vorrei anche ringraziare tutti i colleghi che hanno aiutato, consigliato, testato, fornito/regalato telefoni per i test. Davvero, molte persone che conosco per lavoro sono coinvolte nel progetto in vari modi, durante AsterConfe nei chat e nelle email. Grazie per le idee e i pensieri.

Fonte: habr.com

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster