Upload
siplabs-communications
View
470
Download
3
Embed Size (px)
Citation preview
Обзор приложения CirclemakerОбзор приложения Circlemaker
Владимир Потапьев(senior software engineer, SIPLABS)
Почему Circlemaker?
Зачем?
● Поддержка работы через протокол RADIUS с ААА-серверами
● Обеспечение работы биллинга стандартными средствами
Что такое RADIUS и ААА?
RADIUS
● Стандарт де-факто● Базируется на UDP, “запрос-ответ”● Без состояний (stateless)● Использует пары атрибут/значение (с возможностью
создавать специфичные для производителя пары)● Поддерживает модель AAA● Поддерживается большинством коммерческих устройств
удалённого доступа
AAA
● Модель описания процесса предоставления доступа и контроля над ним.
● Authentication (Аутентикация) – кто ты?● логин● пароль● сертификат● смарт-карта● ...
● Authorization (Авторизация) – что тебе разрешено?● учётная запись vs. полномочия● уровень доступа
● Accounting (Аккаунтинг) – отслеживание активности● потребление ресурсов● получение доступа (логи)
Биллинг
На чём можно построить биллинг?
● Вебхуки● CDR● Шина сообщений Kazoo● Circlemaker
Вебхуки
● Не используйте вебхуки!
Прост в использованииНет гарантий доставкиНе масштабируется
CDR
● Удобно для автоматизации
Вся информация о звонкахОтчёты не в реальном времениЧем больше пользователей, тем дороже в обслуживании
Шина сообщений Kazoo
● (AMQP)● Основа для биллинга в реальном времени
Гарантированная доставка сообщений (RabbitMQ)Хорошо маштабируется (RabbitMQ!)Низкая нагрузка на систему (всё ещё RabbitMQ)Сложно взаимодействоватьСервис биллинга должен работать в реальном времени
Circlemaker
Все преимущества шины сообщений Kazoo ( ):
● Гарантированная доставка сообщений● Хорошо маштабируется● Низкая нагрузка на систему● Биллинг в реальном времени (AAA-сервера)● ...
А также ...● Поддержка протокола RADIUS
● Аутентификация● Авторизация● Аккаунтинг
● Поддержка нескольких RADIUS-серверов для аккаунта● Возможность группирования серверов по назначению● Поддержка Interim-Update● Поддержка Session-Timeout● Поддержка Disconnection Packet (свой UDP-сервис)● Модуль cf_aaa – запрос, задаваемый пользователем● Трансформация AVP● Список приложений-провайдеров AuthZ● Для каждого аккаунта:
● Выборочная блокировка AuthZ/AuthN/Accounting● RADIUS-словари
● Поддержка древовидной иерархии аккаунтов● Единые настройки для групп аккаунтов● Единые RADIUS-словари
● И многое другое...
Как работает аутентификация и авторизация в Kazoo?
Kazoo
Аутентификация
FreeSwitch ECallMgr Registrar Circlemaker
ecallmgr_fs_authn.erl(перед этим проверяется
кэш ecallmgr)reg_authn_req.erl cm_listener.erl
cm_pool_mgr.erl
cm_worker.erlreg_aaa_resp.erl
reg_authn_resp.erlecallmgr_fs_authn.erl
(обновляется кэш ecallmgr,если нужно)
INVITE
200 OKили
401 Unauthorized
wapi_authn:publish_req
wapi_aaa:publish_req
wapi_aaa:publish_resp
wapi_authn:publish_resp
Kazoo
Авторизация
FreeSwitch ECallMgr whistle_apps
ecallmgr_fs_authz.erl(перед этим проверяется
кэш ecallmgr)wh_authz_listener.erl cm_listener.erl
cm_pool_mgr.erl
cm_worker.erl
wh_authz_listener.erlОжидание авторизации
от всех приложенийПровайдеров AuthZ
ecallmgr_fs_authz.erl,и проверяется
флаг Is-Authorized
ecallmgr_fs_channel.erl
Circlemaker…
Jonny5
Командаecallmgr_fs_command:set выставляет нужныеканальные переменныеавторизующие звонок
Registrar
reg_authz_req.erl(определение
Account-ID, если егонет)
wapi_authz:publish_authz_req
wapi_authz:publish_authz_req
wapi_aaa:publish_authz_req
+ доп.флаги
wapi_authz:publish_authz_req
wapi_authz:publish_authz_resp
wapi_authz:publish_authz_resp
с флагомFinal-Authz-Response=true
Канал маркируетсякак авторизованный
CHANNEL_CREATE
Общие настройки Cieclemaker
Включение AAA для аккаунтаВключение AAA для аккаунта
{{……// может быть ”off” или “inherited”“aaa_mode”:”on”,…
}}
Список RADIUS-серверовСписок RADIUS-серверов
{{……““servers”:[servers”:[
{{"enabled": true,"enabled": true,"name": "server1","name": "server1","address": "127.0.0.1","address": "127.0.0.1","port": 1812,"port": 1812,"secret": "testing123","secret": "testing123","aaa_engine": "radius","aaa_engine": "radius","dicts": ["dictionary_voip", "dictionary_cisco", "dictionary_1"],"dicts": ["dictionary_voip", "dictionary_cisco", "dictionary_1"],"avp": "strict" | “custom”"avp": "strict" | “custom”
}}],],……
}}
Тип серверовТип серверов
{{……“authorization”:[“server_name1”, “server_name2”],“authentication”:[“server_name1”, “server_name2”],“accounting”:[“server_name3”],…
}}
Список приложений - AuthZ-провайдеровСписок приложений - AuthZ-провайдеров
{{......
"authz_apps": ["authz_apps": [ "circlemaker","circlemaker", "jonny5""jonny5" ],],
……}}
Трансляция KV AVP↔Трансляция KV AVP↔{{
……// может быть "authz_avp_translation", "accounting_avp_translation"// может быть "authz_avp_translation", "accounting_avp_translation"// и "custom_avp_translation"// и "custom_avp_translation"
"authn_avp_translation": ["authn_avp_translation": [ {{ "attribute": "User-Name","attribute": "User-Name", "request_key": "Uname","request_key": "Uname", "request_value_regexp": "^(.*)$","request_value_regexp": "^(.*)$", "attr_value_regexp": "^(.*)$""attr_value_regexp": "^(.*)$" },}, {{ "attribute": "User-Number","attribute": "User-Number", "request_key": "Unumber","request_key": "Unumber", "request_value_regexp": "^(.*)$","request_value_regexp": "^(.*)$", "attr_value_regexp": "^(.*)$","attr_value_regexp": "^(.*)$",
““cast”: “string_to_integer”cast”: “string_to_integer” }} ],],
……}}
Блокирование механизма AAA для отдельных Блокирование механизма AAA для отдельных типов каналов:типов каналов:
{{……// может быть "block_authn" и "block_accounting"// может быть "block_authn" и "block_accounting"
"block_authz": ["block_authz": [ {{ "channel": ["inbound", "external"]"channel": ["inbound", "external"] },}, {{ "channel": ["inbound", "internal"]"channel": ["inbound", "internal"] }} ]]
……}}
Disconnection packetDisconnection packet
{{……"disconnection_packet": {"disconnection_packet": {
"port": 3799,"port": 3799,"secret": "testing123""secret": "testing123"
},},……
}}
● UDP-серверUDP-сервер
Прочие настройкиПрочие настройки
{{……"nas_address": "127.0.0.1","nas_address": "127.0.0.1","nas_port": "2000","nas_port": "2000","workers": 5,"workers": 5,““local_interim_update_interval”,local_interim_update_interval”,……
}}
RADIUS-словариRADIUS-словари
{{……"name": "dictionary_1","name": "dictionary_1","value": ["value": [
{{"val": {"val": {
"vid": 11344,"vid": 11344,"id": 1080,"id": 1080,"val": 13,"val": 13,"name": "Status-Client""name": "Status-Client"
}}},},
……],],"owner": "d0b7cf8509c7f5f1c45c1c6f7bb2fc3a""owner": "d0b7cf8509c7f5f1c45c1c6f7bb2fc3a"
}}
Сложности реализации, иличто такое loopback-каналы
и почему это зло
Loopback-каналы – зло!
FreeSwitch
loopback leg → a-leg b-leg
Поск в диалплане: loopback/<exten>[/context[/dialplan]]Например: loopback/1000
1000
В результате использования loopback-ов в CDR могут появиться вот такие штуки:
from: +84991231234-bto: [email protected]
Или даже такие:
callee_id_name: Outbound Callcallee_id_number: context_2caller_id_name: 4991231234caller_id_number: 4991231235
Что говорят создатели FreeSwitch?
https://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_bridge#loopback
“… WARNING! Loopback is evil and should only be used as a last resort, when no other approach is possible.”“… ПРЕДУПРЕЖДЕНИЕ! Loopback это зло, которое должно быть использовано только как крайний случай, когда никакой другой подход не возможен.”
https://freeswitch.org/confluence/display/FREESWITCH/Loopback+Endpoint
“… If loopback is your first attempt at solving a problem, keep looking elsewhere until you have no alternatives remaining.”“… Если loopback – ваша первая попытка решить проблему, поищите решение где-нибудь ещё, пока других альтернатив не останется.”
Вариант решения – трансформация значенийВариант решения – трансформация значений
{{……"leg_fields_transformation": {"leg_fields_transformation": {
"request_fields": ["request_fields": [{{
"source": "custom","source": "custom","key": "account_name","key": "account_name","alias": "an","alias": "an","value_regexp": "^(.*)$""value_regexp": "^(.*)$"
},},{{
"source": "custom","source": "custom","key": "account_realm","key": "account_realm","alias": "ar","alias": "ar","value_regexp": "^(.*)$""value_regexp": "^(.*)$"
},},……"result_fields": ["result_fields": [{{
"dest": "dest_leg","dest": "dest_leg","event": "channel_create","event": "channel_create","key": "From","key": "From","value": "$an@$ar""value": "$an@$ar"
},},……
Circlemaker v.2
?
Что будет
● Очередь событий Kazoo (CHANNEL_CREATE, CHANNEL_DESTROY, и т.п.)● управление потоком событий● управление канальными переменными
● Поддержка скриптов на Lua● трансформация данных на любой вкус● регулярные выражения, bye-bye!● стандартная библиотека скриптов для Kazoo(?)● обработка событий Kazoo без знания Erlang(!)● … и т.д. и т.п.
● Поддержка DIAMETER● нужно больше биллинга!
● Выдача CDR через RADIUS● и звонковые логи, и биллинг – всё в одном месте