Соната — SIP сървър за осигуряване

Не знам с какво да сравня provisioning. Може би с котка? Вижда се, че може и без нея, но с нея е малко по-добре. Особено, ако тя работи))

Формулировка на проблема:

  1. Искам да настройвам SIP телефони бързо, лесно и безопасно. При инсталация на телефона и особено при неговото реконфигуриране.
  2. Много производители имат свои формати на конфигурации, свои инструменти за генериране на конфигурации, свои начини за защита на конфигурациите. А да се занимавам с всеки не ми се ще.
  3. Много решения за provisioning, а) са ориентирани към един производител или една телефонна система, б) са достатъчно тромаво реализирани, куп скриптове, параметри, по д-рн…

По точка 3 ще направя коментар, че има отлични системи за провижън. за FreePBX, за FusionPBX, за Kazoo, където в открит достъп има шаблони за телефони от различни производители. Има и търговски решения, където също може да настроите в модула за провижън работа на телефони от различни производители, например, IP централи Yeastar.

На Хабра също има много рецепти как да се настроят устройства на различни производители: едно, две. Но както се казва, всичките системи имат фатален недостатък. Затова ще направим нашия велосипед.

наш формат

Както се казва в xkcd, не искаш да се занимаваш с 14 формата — измисли 15-ти.. Затова използваме общи настройки за всеки телефон и ще направим свой json-формат на конфигурацията.

Приблизително нещо такова:

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

Така че, във всеки телефон е необходимо да се настрои локалното време, sip линии. Тук всичко е просто. Още примери могат да се видят тук.

наш сървър за провижън

В ръководствата на производителя обикновено има точка, където се казва: вземете csv, запишете там логин-парола-mac-адрес, с нашия фирмен скрипт генерирайте файловете, поставете ги под уебсървър Apache и всичко ще бъде наред.

В следващата точка на ръководството обикновено се разказва как още може да се криптира генерираният файл на конфигурацията.

Но това е класика. Съвременният подход със смузи и туитър казва, че трябва да направим готов уебсървър, който няма да е толкова мощен като Apache, а ще върши само една малка работа. Да форматира и предоставя конфигурации по линк.

Тук ще спрем и ще си припомним, че почти всички SIP-телефони в момента могат да получат конфигурации по http/https, затова не разглеждаме други реализации (ftp, tftp, ftps). Следователно, всеки телефон знае своя мак-адрес. Затова ще направим две връзки: една лична — по ключа на устройството, втората обща, която работи по комбинацията общ токен и мак-адрес.

Също така няма да спирам на zero-config, т.е. настройката на телефона «от нулата», т.е. вие просто го включвате в мрежата и той хоп работи. Не, в моя сценарий, вие го свързвате в мрежата, правите предварителна настройка (настройвате го да получава конфиг от сървъра за провижн), а след това пиете пиняколада и пренастройвате телефона както трябва през провижн. Раздаването на Option 66 е задача на DHCP-сървъра.

Между другото, наистина се уморих да кажа «provisioning», затова думата се съкрати до «провижн», моля, не ритайте с крака.

И още нещо: нашият сървър за провижн няма UI, т.е. потребителски интерфейс. Може би засега, но не съм сигурен, тъй като не ми е необходимо. Затова имаме API за запазване/изтриване на настройки, получаване на списък с поддържани производители, модели, всичко е описано според спецификациите на swagger.

Защо API, а не UI? Тъй като вече имам собствена телефонна система, имам източник на идентификационни данни, от който ми е достатъчно да взема тези данни, да композира нужния json и да публикувам на сървъра за провижн. А самият сървър за провижн по правилата, посочени в json-файла, ще издаде нужному устройство неговата конфигурация или няма да я издаде, ако устройството не е това или не отговаря на критериите, посочени също в този json.

Соната — SIP сървър за осигуряване

Получихме такъв микросервис за провижн. Нарача се sonata, изходният код е достъпен в GitHub, също така има готов docker-образ, пример за използване на docker тук.

Ключови функции:

  • във всеки случай ограничен достъп до конфигурацията по време, по подразбиране 10 минути. Ако искате отново да направите конфигурацията достъпна — публикувайте конфигурацията отново.

  • един формат за всички производители, всичко подстрояване е премахнато в sonata, изпращате стандартизиран json, настройвате всяко налично оборудване.

  • Всички конфигурации, издавани на устройствата, се логват, всички проблемни места могат да бъдат прегледани в лог файла и да се видят грешките.

  • Възможно е да се използва една обща връзка с токен, всеки телефон получава своя конфигурация, като посочва MAC адрес. Или персонализирана връзка чрез ключ.

  • API за управление и за издаване на конфигурации на телефоните са разделени по портове.

  • Тестове. За мен беше много важно да фиксирам формата на издавания конфиг и всички обичайни ситуации на издаване на конфигурации да бъдат покрити с тестове. За да работи всичко точно.

Минуси:

В момента не се използва криптиране в рамките на sonata. Тоест, разбира се, можете да започнете да използвате HTTPS, поставяйки например Nginx пред sonata. Но фирмените методи досега не са активирани. Защо? Проектът все още е млад, само преди малко е конфигурирал своята първа стотица устройства. И, разбира се, събирам идеи, обратна връзка. За да направим всичко безопасно, за да не бъде възможно конфигурациите да бъдат подслушвани в мрежата, вероятно е важно да помислим за ключове за криптиране, TLS и подобни, но това ще бъде в бъдеще.

Липса на потребителски интерфейс. Вероятно това е съществен минус за крайния потребител, но за системния администратор по-скоро е важна конзолна утилита, отколкото пълноценно приложение. Направата на конзолна утилита беше в плановете, но не съм сигурен, дали е необходима?

Какво в крайна сметка?

Небольшой и прост уеб-сервер за конфигуриране на няколко модела телефони с API за управление.

Още веднъж, как трябва да работи всичко?

  1. Инсталираме sonata.
  2. Създаваме JSON конфигурация и я публикуваме в sonata.
  3. След това получаваме от sonata връзка за конфигуриране.
  4. След това посочваме тази връзка в телефонния апарат.
  5. Устройството изтегля конфигурацията

в последваща експлоатация само два стъпки:

  1. Създаваме JSON конфигурация и я публикуваме в sonata.
  2. Устройството изтегля конфигурацията

Кои телефони ще се конфигурират?

Производители Grandstream, Fanvil, Yealink. Конфигурациите в рамките на производителя са повече или по-малко сходни, но могат да се различават в зависимост от фърмуера — може да се наложи допълнително тестване.

Какви правила могат да се задават?

По време. Можете да посочите времето, до което конфигурацията ще бъде достъпна.
По MAC адрес. При издаване на конфигурация чрез персонална връзка, устройството също ще бъде проверено по MAC адрес.
По IP. По IP адреса, от който е направен запитването.

Как да взаимодействаме с sonata?

Чрез API, правете http заявки. API ще бъде налично във вашата инсталация. Тъй като API поддържа swagger спецификация, може да се възползвате онлайн инструмент за тестови заявки към API.

Добре, супер. Яко нещо, как да го опитам?

Най-лесно е да разгрънете docker-образ на базата на репозитория sonata-sample. В репозитория има инструкции за инсталация.

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

Ако имате опит с JavaScript, бързо ще разберете как е всичко тук.

Ще има ли развитие на sonata?

Частично съм постигнал целите си. По-нататъшното развитие е въпрос на задачите ми по темата автоматизация на настройките на телефоните. Има още възможност да се разширят конфигурациите за настройка на бутоните на телефона, да се добави адрес на provision за адресни книги, може би нещо още, пишете в коментарите.

Резюме и благодарности

Ще се радвам на конструктивни предложения/възражения/коментари и въпроси, тъй като може да бъде нещо неясно описано.

Също така благодаря на всички колеги, които помогнаха, консултираха, тестват, предоставиха/подариха телефони за тестове. Наистина, в проекта са ангажирани в различна степен много хора, с които съм взаимодействал на работа, на AsterConf‘е, в чатове и имейли. Благодаря за идеите и мислите.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster