Em nosso escritório, utilizamos equipamentos para telefonia IP.

Não sei com o que comparar o provisioning. Talvez com um gato? Parece que dá para viver sem ele, mas com ele é um pouco melhor. Especialmente se ele estiver trabalhando ))

Definição do problema:

  1. Quero configurar telefones SIP de forma rápida, simples e segura. Ao instalar o telefone, e ainda mais ao reconfigurá-lo.
  2. Muitos fornecedores têm seus próprios formatos de configuração, suas próprias ferramentas para gerar configurações, suas formas de proteger configurações. E não quero ter que lidar com cada um.
  3. Muitas soluções de provisioning, a) são orientadas para um fornecedor ou um sistema telefônico específico, b) são bastante complexas de implementar, com muitos scripts, parâmetros, blá-blá...

Sobre o ponto 3, gostaria de comentar que existem excelentes sistemas de provisioning para FreePBX, para FusionPBX, para Kazoo, onde templates para telefones de diferentes fornecedores estão disponíveis publicamente. Há soluções comerciais que também permitem configurar no módulo de provisioning o funcionamento de telefones de diversos fabricantes, por exemplo, o PABX Yeastar.

No Habr também há muitos tutoriais sobre como configurar dispositivos de vários fornecedores: um, dois. Mas como dizem, todos os sistemas têm um grave defeito. Então, vamos fazer nossa própria solução.

nosso formato

Como diz o xkcd, se você não quer lidar com 14 formatos — invente o 15º. Por isso, usamos configurações gerais para qualquer telefone e criaremos nosso formato de configuração json.

Mais ou menos assim:

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

Assim, em qualquer telefone, é necessário configurar o horário local e as linhas SIP. Aqui é tudo simples. Exemplos adicionais podem ser vistos aqui.

no seu servidor de provisioning

Nos manuais do fabricante, geralmente há um item que diz: pegue o csv, registre login-senha-endereço MAC, use nosso script para gerar os arquivos, coloque-os sob um servidor web Apache e tudo ficará bem.

No próximo item do manual, geralmente é mencionado que o arquivo de configuração gerado também pode ser criptografado.

Mas tudo isso é clássico. A abordagem moderna, inspirada por smoothies e Twitter, sugere que devemos criar um servidor web que não seja tão poderoso quanto o Apache, mas que realize uma única tarefa pequena: gerar e fornecer configurações por meio de um link.

Vamos parar aqui e recordar que praticamente todos os telefones SIP agora podem obter configurações via http/https, por isso não consideramos outras implementações (ftp, tftp, ftps). Além disso, cada telefone conhece seu endereço MAC. Portanto, faremos duas referências: uma pessoal — pelo identificador do dispositivo, e a segunda geral, que funciona com um token geral e o endereço MAC.

Também não vou me aprofundar na zero-config, ou seja, na configuração do telefone "do zero", ou seja, você o conecta à rede e ele, voilà, funciona. Não, no meu cenário, você conecta à rede, faz uma configuração prévia (configura para receber a configuração do servidor de provisionamento), e então você toma um piña colada e reconfigura o telefone como deve ser através do provisionamento. Disponibilizar a Opção 66 é tarefa do servidor DHCP.

Aliás, estou cansado de dizer "provisioning", portanto a palavra foi abreviada para "provision", por favor, não me critiquem.

E mais: nosso servidor de provisionamento não tem UI, ou seja, interface do usuário. Talvez, por enquanto, mas não tenho certeza, porque não é necessário para mim. No entanto, existe uma API para salvar/excluir configurações, obter uma lista de fornecedores suportados, modelos, tudo descrito segundo os padrões da especificação swagger.

Por que API e não UI? Porque eu já tenho meu próprio sistema telefônico, então tenho uma fonte de credenciais, onde posso simplesmente pegar esses dados, compor o json necessário e publicar no servidor de provisionamento. E então, o servidor de provisionamento, segundo as regras especificadas no arquivo json, fornecerá ao dispositivo solicitado sua configuração ou não fornecerá, se o dispositivo não for o correto, ou não corresponder aos critérios também especificados nesse json.

Em nosso escritório, utilizamos equipamentos para telefonia IP.

E assim, esse microserviço de provisionamento foi criado. Chama-se sonata, o código-fonte está disponível no GitHub, também há uma imagem docker pronta, exemplo de uso do docker aqui.

Características principais:

  • em qualquer caso, acesso limitado à configuração por tempo, por padrão 10 minutos. Se você quiser tornar a configuração acessível novamente — republicar a configuração.

  • um formato para todos os fornecedores, toda a configuração foi retirada para o sonata, você envia um json padronizado, configura qualquer equipamento disponível.

  • todas as configurações fornecidas aos dispositivos são registradas, todos os pontos problemáticos podem ser vistos no log e os erros podem ser visualizados.

  • é possível usar um único link com um token, cada telefone recebe sua própria configuração, especificando o endereço MAC. Ou um link pessoal pelo key.

  • API para gerenciamento e emissão de configurações para os telefones estão separados por portas.

  • Testes. Para mim, era muito importante registrar o formato da configuração emitida e cobrir todas as situações normais de emissão de configuração com testes. Para que tudo funcionasse de forma clara.

Pontos negativos:

Até agora, a criptografia não está sendo utilizada no âmbito do sonata. Ou seja, você pode começar a usar HTTPS, colocando, por exemplo, o nginx, na frente do sonata. Mas os métodos próprios ainda não foram implementados. Por quê? O projeto ainda é novo, acabou de provisionar, dificilmente, sua primeira centena de dispositivos. E claro, estou coletando ideias e feedbacks. Além disso, para garantir que tudo seja seguro, para que as configurações não possam ser interceptadas na rede, provavelmente vale a pena se dedicar a chaves de criptografia, TLS e similares, mas isso será para mais tarde.

Falta de UI. Isso pode ser uma desvantagem significativa para o usuário final, mas para o administrador de sistema uma utilidade de console é mais importante do que um aplicativo completo. Fazer uma utilidade de console estava nos planos, mas não tenho certeza se é necessária?

Qual é o resultado?

Um pequeno e simples servidor web para provisionar vários modelos de telefones com API para gerenciamento.

Mais uma vez, como isso deve funcionar?

  1. Instalamos o sonata.
  2. Formamos a configuração json e a publicamos no sonata.
  3. Depois, recebemos do sonata um link para o provisionamento.
  4. Então, colocamos esse link no aparelho telefônico.
  5. O aparelho baixa a configuração.

Na exploração posterior, apenas dois passos:

  1. Formamos a configuração json e a publicamos no sonata.
  2. O aparelho baixa a configuração.

Quais telefones estão sendo provisionados?

Fornecedores Grandstream, Fanvil, Yealink. As configurações dentro do fornecedor são mais ou menos as mesmas, mas podem variar dependendo do firmware — pode ser necessário realizar testes adicionais.

Quais regras podem ser definidas?

Por tempo. Você pode especificar um horário até o qual a configuração estará disponível.
Por endereço MAC. Ao emitir a configuração por um link pessoal, o endereço MAC também será verificado.
Por IP. Pelo endereço IP de onde a solicitação foi feita.

Como interagir com o sonata?

Através da API, fazendo requisições HTTP. A API estará disponível na sua instalação. Como a API suporta a especificação swagger, você pode usar uma ferramenta online para testes de requisições à API.

Ok, ótimo. É uma coisa legal, como experimentar?

É mais fácil implantar uma imagem Docker com base no repositório sonata-sample. O repositório contém instruções para instalação.

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

Se você tem experiência com JavaScript, logo entenderá como tudo funciona aqui.

Haverá desenvolvimento do sonata?

Parcialmente, alcancei meus objetivos. O desenvolvimento futuro é uma questão das minhas tarefas relacionadas à automação da configuração dos telefones. Há também a possibilidade de expandir as configurações para personalizar os botões do telefone, adicionar endereços de provisionamento, e talvez mais alguma coisa, escreva nos comentários.

Resumo e agradecimentos

Ficarei feliz com sugestões, objeções, comentários e perguntas construtivas, pois pode haver algo que não tenha sido bem explicado.

Também agradeço a todos os colegas que ajudaram, consultaram, testaram, forneceram ou doaram telefones para os testes. Realmente, muitas pessoas que com quem conversei por trabalho, em AsterConfchats e emails, estão envolvidas de diferentes maneiras no projeto. Obrigado pelas ideias e pensamentos.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster