Разграничение группового доступа CoS/CoR
Введение
Цель: компактная настройка групповых доступов и ограничений на совершение телефонных вызовов без увеличения количества или размера правил маршрутизации.
-
Разрешение выполнять вызовы на определенные направления (международные, междугородные, городские, мобильные, разные провайдеры, и т.п.)
-
Настройка запрета вызовов между группами абонентов.
-
Групповое разрешение определенных абонентских функций.
Добавляются классы сущностей, чтобы уменьшить зацепленную сложность массовой настройки.
Учетные записи пользователей получают привязку к группам CoS и CoR, настраивается матрица доступов между группами. Профиль CoS получает доступы к направлениям вызова и к сервисным функциям.
Такой способ настройки является опциональным и может не применяться при отсутствии соответствующей необходимости. По умолчанию настройка отсутствует и политика групповых доступов не применяется.
1. Общие принципы
Система основана на разделении привилегий и ограничений:
-
CoS (Class of Service) — определяет, что разрешено инициатору вызова (пользователь, провайдер).
-
CoR (Class of Restriction) — определяет, кто может достичь объект назначения (пользователь, правило маршрутизации, сервис).
-
Policy — единая таблица разрешений, определяющая доступность связи между группами CoS и CoR.
-
Toll List — может определять какие направления вызовов разрешены (ограничивает соответствующие правила маршрутизации).
-
Toll Link — матрица связей между Toll List и направлениями вызовов.
Базовое правило: Если свойства не заданы — доступ открыт. Ограничение применяется только при явной настройке.
2. Модель данных
2.1. Изменения в учетных записях и правилах
| Сущность | Поле | Тип | Назначение |
|---|---|---|---|
sipuser |
|
|
Профиль привилегий для исходящих вызовов (код) |
|
|
Профиль ограничений для входящих вызовов (код) |
|
provider |
|
|
Профиль привилегий для вызовов, входящих из внешней сети (код) |
vectorrule |
|
|
Типы направлений (например: international, national, local, internal, cross) |
|
|
Требуемый минимальный уровень доступа (для реализации мандатной модели ограничения направления). |
|
|
|
Переназначение CoS в контексте текущего вызова. По умолчанию '*' оставляет CoS без изменения. |
|
featurecode |
|
|
Тип сервиса (поле уже существует и задано) |
2.2. Классы групповой политики
Class: CosProfiles
Профиль привилегий абонента, инициирующего вызов.
-
code(atom) — Уникальный код в домене (обязательно). -
restriction_level(integer) — Уровень доступа текущей группы CoS для реализации мандатной модели разграничения направлений. -
call_types([atom]) — Перечень явно разрешенных направлений вызова (например: international, national, local, mobile, internal или all). -
toll_lists([atom]) — Перечень подключенных toll-списков, каждый из которых в свою очередь сам содержит направления или связан с направлениями с помощью матрицы связей. Может использовать для настройки схем с большим разнообразием разграничиваемых направлений (малое изменение реализуется малой модификацией). -
feature_access([atom]) — Перечень доступных для ограничения сервисных функций (возможные варианты: pickup, grouppickup, intercom, barge, voicemail, parking, replace, monitor, prompt, mesh, adhoc_conference или all). -
comment(string) — Произвольный комментарий.
Class: CorProfiles
Профиль защиты абонента, принимающего вызов.
-
code(atom) — Уникальный код в домене (обязательно). -
comment(string) — Произвольный комментарий.
Class: CorPolicies
Матрица политик сервисного доступа между группами абонентов.
-
src_cos(atom) — Код CoS источника (обязательно). Значение 'any' покрывает любое значение CoS в контексте вызова, кроме пустого значения. -
dst_cor(atom) — Код CoR назначения (обязательно). Значение 'any' покрывает любое значение CoR, кроме пустого значения. -
feature(atom) — Проверяемая ограничиваемая функция от источника к назначению (возможные варианты: call, call_redirect, call_forward, callwaiting, pickup, intercom, barge, replace, monitor, prompt, mesh, any). Значение 'any' покрывает любую функцию. -
priority(integer) — Приоритет правила (по умолчанию 1000). Применяется в случае, если подходит несколько правил с разными условиями применения. -
time_mask( all | work | non-work | atom ) — Профиль времени (по умолчаниюall).workиnon-work— рабочее и нерабочее время домена на коммуникационном слое. Прочие значения — код расписания продуктового слоя в домене. -
action(allow | deny) — Тип действия записи (обязательно). -
comment(string) — Произвольный комментарий.
Class: TollLists
Список одновременно разрешенных направлений вызова (для настройки схем с большим разнообразием разграничиваемых направлений).
-
code(atom) — Уникальный код Toll-списка в домене (обязательно). -
call_types([atom]) — Список разрешенных направлений вызова (например: international, national, local, mobile, internal или all). -
comment(string) — Произвольный комментарий.
Class: TollLinks
Матрица двусторонних связей между TollList и CallType (для настройки схем с большим разнообразием разграничиваемых направлений).
-
toll_list(atom) — Код TollList в домене. -
call_type(atom) — Код CallType в домене. -
allow(boolean) — Ожидается true, то есть связь между конкретным TollList и конкретным CallType установлена. -
comment(string) — Произвольный комментарий.
2.3. Справочные данные групповой политики
| Справочник | Тип | Назначение |
|---|---|---|
PolicyCallTypes (для vectorrule.opts.call_type, CosProfile.call_types, TollList.call_types, TollLink.call_type) |
Read-Write |
Примеры: all, local, national, international, internal, mobile, … |
Важно: Справочники используются для удобства подстановки значений в интерфейсе.
Ошибки нет, если значение 'cos' или 'cor' назначено напрямую в объектах sipuser, provider и CorPolicy, даже если отсутствует в справочнике CosProfiles и CorProfiles.
|
3. Алгоритм проверки вызова
3.1. Общая последовательность
-
Определение CoS инициатора в контекст звонка:
-
пользователь →
sipuser.opts.cos -
провайдер →
provider.opts.cos -
IVR → пустой CoS (всё разрешено)
-
-
Поиск подходящих правил маршрутизации (
vectorrule). -
Опциональное переназначение CoS (
vectorrule.opts.modify_cos). Применяется перед проверкой политик текущего правила. -
CoS контекста вызова пустой → вызов групповой политикой разрешен.
-
Фильтрация правил:
-
По
restriction_level: если у правила установленvectorrule.opts.restriction_level> 0, то требуется наличие профиля CosProfile с не меньшим значениемCosProfile.restriction_level. Иначе вызов групповой политикой запрещен. -
По
call_types: пересечениеvectorrule.opts.call_typeиCosProfile.call_types(илиCosProfile.toll_lists→TollList.call_types, илиCosProfile.toll_lists→TollLinks.{toll_list, call_type}). Применяется, если задан 'vectorrule.opts.call_type'. При отсутствии пересечения вызов групповой политикой запрещен. -
Отказ правила → переход к следующему правилу в домене.
-
По матрице:
CorPolicy(src_cos, dst_cor, 'call'), где dst_cor пользователя-владельца набираемого номера, FeatureType=call. Применяется, если вызываемый абонент является пользователем системы, и задан его 'sipuser.opts.cor'. -
Отказ правила → отказ абоненту в вызове.
-
3.2. Проверка featurecode
-
Для featurecode дополнительно:
-
CosProfile.feature_accessvsfeaturecode.type, где FeatureType: pickup, grouppickup, monitor, prompt, mesh, voicemail, parking, replace, barge, intercom.. Применяется, если объект 'CosProfile' существует, иначе применение сервисного featurecode не ограничивается непосредственно групповой политикой. -
CorPolicy(src_cos, postfix/extension dst_cor, featurecode.type), где dst_cor пользователя-владельца набираемого номера, FeatureType: callwaiting, pickup, intercom, barge, replace, monitor, prompt, mesh. Применяется, если постфикс сервисного номера является номером пользователя системы, и задан его 'sipuser.opts.cor'. -
Отказ → отказ абоненту в вызове.
-
| Шаг | Проверка | Источник | Назначение |
|---|---|---|---|
1 |
|
CoS |
VectorRule |
2 |
|
CoS |
VectorRule |
3 |
|
CoS |
FeatureCode |
4 |
|
CoS |
CoR |
5 |
Стандартная проверка featurerule |
— |
— |
3.3. Кросс-доменные вызовы
При передаче вызова между доменами:
-
CoS инициатора сохраняется в контексте.
-
Может быть изменён правилом принимающего домена (
modify_cos). -
По умолчанию остаётся исходным.
-
Сопоставляется с
CosProfileпринимающего домена и проверяется политиками принимающего домена. -
Вызов разрешается или запрещается групповой политикой на общих основаниях в принимающем домене, как если бы этот вызов был инициирован внутри домена.
3.4. Перевод на номер
Применяется в одношаговом переводе на номер (без подмены плеча), если целевой номер для перевода является номером пользователя системы, и для него задан 'sipuser.opts.cor'.
-
Для перевода на номер:
-
CorPolicy(src_cos, dst_cor, 'call_forward'), где src_cos инициатора перевода, dst_cor пользователя-владельца номера для перевода, feature='call_forward'. -
Отказ групповой политики → отказ абоненту в переводе.
-
3.5. Переадресация на номер
Применяется при обнаружении любого вида переадресации, если целевой номер для переадресации является номером пользователя системы, и для него задан 'sipuser.opts.cor'.
-
Для переадресации на номер:
-
CorPolicy(src_cos, dst_cor, 'call_redirect'), где src_cos владельца переадресации, dst_cor пользователя-владельца номера назначения, feature='call_redirect'. -
Отказ групповой политики → прекращение инициации нового форка на номер переадресации.
-
3.6. Создание ad-hoc конференции
Применяется при вызове номера фабрики ad-hoc конференций (в момент создания ad-hoc конференции, а не подключения к уже существующей), если объект 'CosProfile' существует.
-
Для создания ad-hoc конференций:
-
CosProfile.feature_accessvs 'adhoc_conference'. -
Отказ групповой политики → отказ абоненту в вызове без создания ad-hoc конференции.
-
4. Определение CoS инициатора
| Сценарий | CoS в контексте |
|---|---|
Вызов от пользователя |
|
Вызов от провайдера |
|
Вызов от IVR |
Пустой CoS (всё можно). |
Перевод вызова |
CoS переводящего абонента |
Переадресация |
CoS переадресующего абонента |
Кросс-домен |
CoS инициатора. Может быть изменён через vectorrule.opts.modify_cos |
| Правилом маршрутизации может быть изменен 'cos' в контексте любого вызова, в том числе назначен 'cos' для вызова из IVR. |
5. Поведение по умолчанию
| Ситуация | Результат |
|---|---|
Свойства не заданы (cos, cor, call_type) |
Всё разрешено |
Пара cos-cor не найдена в |
Вызов разрешён |
|
Ограничения feature_access не применяются, разрешены правила маршрутизации с нулевым уровнем доступа и неназначенным направлением (и то и другое является значением по умолчанию). |
|
0 (разрешены только правила маршрутизации с нулевым уровнем доступа ( |
|
[all] (никакие направления вызова не блокируется на основании сопоставления кодов). |
|
[] (ни один TollList не назначен). |
|
[all] (все предустановленные и ограничиваемые системой функции и сервисы разрешены) |
|
any (любой) |
|
any (любой) |
|
any (любой) |
|
allow (разрешено) |
|
all (всегда активно) |
|
1000 (базовый приоритет) |
|
[] (никакое направление для списка не задано явно). |
|
Направления со списками не сопоставлены. |
|
true (связка TollList и CallType активна, обладателям CoS, для которых данный TollList задан, вызов направления разрешен). |
|
Направление не задано, ограничения на использование правила на основании сопоставления имен не применяется. |
|
0 Требуется минимальный уровень доступа, доступный всем по умолчанию. То есть ограничение на использование правила на основании мандатной модели не применяется. |
|
* (оставляет CoS в контексте без изменения) |
|
Контекст входящего вызова от этого пользователя не ограничивается групповыми политикой доступа CoS/CoR. |
|
Вызовы на этого пользователя и абонентские сервисы в направлении этого пользователя не ограничиваются групповой политикой доступа CoS/CoR. |
|
Контекст входящего вызова с этой учетной записи не ограничивается групповой политикой доступа CoS/CoR. |
Отсутствие СosProfile при заданном cos для пользователя означает запрет всех направлений (правил маршрутизации), для которых установлен call_type или ненулевой restriction_level.
Пустой список CosProfile.feature_access означает запрет всех предустановленных ограничиваемых функций и сервисов.
Пустые списки CosProfile.call_types и CosProfile.toll_lists означают запрет всех настроенных направлений, для которых установлен call_type.
6. Минимально необходимая настройка
Чтобы ограничить доступ вызовов и сервисных функций между группами абонентов, минимально необходимо:
-
Задать CoS объекту-источнику.
-
Задать CoR объекту-назначения.
-
Создать CorPolicy с
action: denyдля пары.
Чтобы ограничить доступ по направлениям вызова, минимально необходимо:
. Задать CoS объекту-источнику.
. Создать CosProfile с ограниченным списком call_types И/ИЛИ ограниченным уровнем доступа restriction_level.
. Назначить для правила маршрутизации vectorrule код направления call_type И/ИЛИ минимальный уровень доступа restriction_level.
7. Требования к новым сущностям
| Сущность | Обязательные поля | Необязательные поля |
|---|---|---|
CosProfile |
|
|
CorProfile |
|
— |
CorPolicy |
|
|
toll_list |
|
|
toll_link |
|
|
PolicyCallTypes |
|
Валидация
-
vectorrule-
call_typeможет существовать в справочникеPolicyCallTypes, или отсутствовать там (строгая ссылочная целостность в рамках API не требуется).
-
-
provider-
cosможет существовать в справочникеCosProfiles(при отсутствии блокируются вызовы на именованные направления, если значениеcosустановлено).
-
-
sipuser-
cosможет существовать в справочникеCosProfiles(при отсутствии блокируются вызовы на именованные направления, если значениеcosустановлено). -
corможет существовать в справочникеCorProfiles, или отсутствовать там (строгая ссылочная целостность в рамках API не требуется).
-
-
CosProfile-
restriction_level- целое число от 0 и выше. -
call_types- список из значений, используемых вvectorrule.opts.call_type. Или из одного элементаall. -
toll_lists- может существовать в справочникеtoll_lists, или отсутствовать там (строгая ссылочная целостность в рамках API не требуется). -
feature_access- список из одного или нескольких предустановленных вариантов. В том числе из одного элементаall.
-
-
CorPolicy-
feature- один из предустановленных вариантов. В том числеany. -
src_cosиdst_corмогут существовать в справочникахCosProfilesиCorProfilesсоответственно, или отсутствовать там (строгая ссылочная целостность в рамках API не требуется). -
actionтолькоallowилиdeny.
-
-
TollList-
call_types- список из значений, используемых вvectorrule.opts.call_type. Может быть пустым.
-
-
TollLink-
toll_listможет существовать в справочникеtoll_lists, или отсутствовать там (строгая ссылочная целостность в рамках API не требуется). -
call_typeодно из значений, используемых вvectorrule.opts.call_type.
-
-
PolicyCallTypes.codeдолжны иметь уникальные значения.
8. Пример конфигурации
// CoS профили
CosProfile:create({code: basic, call_types: [local, internal], feature_access: [voicemail]})
CosProfile:create({code: premium, call_types: [all], feature_access: [all]})
CosProfile:create({code: secretary, call_types: [all], feature_access: [all]})
CosProfile:create({code: middle, call_types: [], toll_lists: [1,2], feature_access: [all]})
// CoR профили
CorProfile:create({code: users})
CorProfile:create({code: managers})
CorProfile:create({code: special})
CorProfile:create({code: middle})
// Матрица политик
CorPolicy:create({src_cos: basic, dst_cor: managers, action: deny, feature: any, time_mask: off_hours})
CorPolicy:create({src_cos: premium, dst_cor: any, action: allow, feature: any, time_mask: all}) % и без этого по умолчанию разрешено
CorPolicy:create({src_cos: secretary, dst_cor: special, action: allow, feature: any, time_mask: all, priority: 1})
CorPolicy:create({src_cos: any, dst_cor: special, action: deny, feature: any, time_mask: all, priority: 2})
// Toll-списки одновременно разрешенных именованных направлений
TollList:create({code: 1, call_types: [local, internal]})
TollList:create({code: 2, call_types: []})
// Матрица связывания Toll-списков и именованных направлений
TollLink:create({toll_list: 2, call_type: national})
// Пользователь
sipuser:update({id: <ID_1>, cos: basic, cor: users})
sipuser:update({id: <ID_2>, cos: premium, cor: managers})
sipuser:update({id: <ID_3>, cos: middle, cor: middle})
// Маршрут
vectorrule:update({id: <ID_1>, call_type: [local], cor: users})
vectorrule:update({id: <ID_2>, call_type: [national], cor: users})
vectorrule:update({id: <ID_3>, call_type: [international], cor: special})