Разграничение группового доступа 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

cos

atom

Профиль привилегий для исходящих вызовов (код)

cor

atom

Профиль ограничений для входящих вызовов (код)

provider

cos

atom

Профиль привилегий для вызовов, входящих из внешней сети (код)

vectorrule

call_type

[atom]

Типы направлений (например: international, national, local, internal, cross)

restriction_level

integer

Требуемый минимальный уровень доступа (для реализации мандатной модели ограничения направления).

modify_cos

atom

Переназначение CoS в контексте текущего вызова. По умолчанию '*' оставляет CoS без изменения.

featurecode

type

atom

Тип сервиса (поле уже существует и задано)

2.2. Классы групповой политики

cor_cos_classes

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. Общая последовательность

  1. Определение CoS инициатора в контекст звонка:

    • пользователь → sipuser.opts.cos

    • провайдер → provider.opts.cos

    • IVR → пустой CoS (всё разрешено)

  2. Поиск подходящих правил маршрутизации (vectorrule).

  3. Опциональное переназначение CoS (vectorrule.opts.modify_cos). Применяется перед проверкой политик текущего правила.

  4. CoS контекста вызова пустой → вызов групповой политикой разрешен.

  5. Фильтрация правил:

    1. По restriction_level: если у правила установлен vectorrule.opts.restriction_level > 0, то требуется наличие профиля CosProfile с не меньшим значением CosProfile.restriction_level. Иначе вызов групповой политикой запрещен.

    2. По call_types: пересечение vectorrule.opts.call_type и CosProfile.call_types (или CosProfile.toll_listsTollList.call_types, или CosProfile.toll_listsTollLinks.{toll_list, call_type}). Применяется, если задан 'vectorrule.opts.call_type'. При отсутствии пересечения вызов групповой политикой запрещен.

    3. Отказ правила → переход к следующему правилу в домене.

    4. По матрице: CorPolicy(src_cos, dst_cor, 'call'), где dst_cor пользователя-владельца набираемого номера, FeatureType=call. Применяется, если вызываемый абонент является пользователем системы, и задан его 'sipuser.opts.cor'.

    5. Отказ правила → отказ абоненту в вызове.

3.2. Проверка featurecode

  1. Для featurecode дополнительно:

    1. CosProfile.feature_access vs featurecode.type, где FeatureType: pickup, grouppickup, monitor, prompt, mesh, voicemail, parking, replace, barge, intercom.. Применяется, если объект 'CosProfile' существует, иначе применение сервисного featurecode не ограничивается непосредственно групповой политикой.

    2. CorPolicy(src_cos, postfix/extension dst_cor, featurecode.type), где dst_cor пользователя-владельца набираемого номера, FeatureType: callwaiting, pickup, intercom, barge, replace, monitor, prompt, mesh. Применяется, если постфикс сервисного номера является номером пользователя системы, и задан его 'sipuser.opts.cor'.

    3. Отказ → отказ абоненту в вызове.

Шаг Проверка Источник Назначение

1

CosProfile.restriction_level >= vectorrule.opts.restriction_level

CoS

VectorRule

2

CosProfile.call_types vs vectorrule.opts.call_type or CosProfile.toll_lists vs vectorrule.opts.call_type

CoS

VectorRule

3

CosProfile.feature_access vs featurecode.type

CoS

FeatureCode

4

CoS vs user(с номером из featurecode.postfix).cor (CorPolicy.feature=featurecode.type)

CoS

CoR

5

Стандартная проверка featurerule

3.3. Кросс-доменные вызовы

При передаче вызова между доменами:

  1. CoS инициатора сохраняется в контексте.

  2. Может быть изменён правилом принимающего домена (modify_cos).

  3. По умолчанию остаётся исходным.

  4. Сопоставляется с CosProfile принимающего домена и проверяется политиками принимающего домена.

  5. Вызов разрешается или запрещается групповой политикой на общих основаниях в принимающем домене, как если бы этот вызов был инициирован внутри домена.

3.4. Перевод на номер

Применяется в одношаговом переводе на номер (без подмены плеча), если целевой номер для перевода является номером пользователя системы, и для него задан 'sipuser.opts.cor'.

  1. Для перевода на номер:

    1. CorPolicy(src_cos, dst_cor, 'call_forward'), где src_cos инициатора перевода, dst_cor пользователя-владельца номера для перевода, feature='call_forward'.

    2. Отказ групповой политики → отказ абоненту в переводе.

3.5. Переадресация на номер

Применяется при обнаружении любого вида переадресации, если целевой номер для переадресации является номером пользователя системы, и для него задан 'sipuser.opts.cor'.

  1. Для переадресации на номер:

    1. CorPolicy(src_cos, dst_cor, 'call_redirect'), где src_cos владельца переадресации, dst_cor пользователя-владельца номера назначения, feature='call_redirect'.

    2. Отказ групповой политики → прекращение инициации нового форка на номер переадресации.

3.6. Создание ad-hoc конференции

Применяется при вызове номера фабрики ad-hoc конференций (в момент создания ad-hoc конференции, а не подключения к уже существующей), если объект 'CosProfile' существует.

  1. Для создания ad-hoc конференций:

    1. CosProfile.feature_access vs 'adhoc_conference'.

    2. Отказ групповой политики → отказ абоненту в вызове без создания ad-hoc конференции.

4. Определение CoS инициатора

Сценарий CoS в контексте

Вызов от пользователя

sipuser.opts.cos или пустой (всё можно).

Вызов от провайдера

provider.opts.cos или пустой (всё можно).

Вызов от IVR

Пустой CoS (всё можно).

Перевод вызова

CoS переводящего абонента

Переадресация

CoS переадресующего абонента

Кросс-домен

CoS инициатора. Может быть изменён через vectorrule.opts.modify_cos

Правилом маршрутизации может быть изменен 'cos' в контексте любого вызова, в том числе назначен 'cos' для вызова из IVR.

5. Поведение по умолчанию

Ситуация Результат

Свойства не заданы (cos, cor, call_type)

Всё разрешено

Пара cos-cor не найдена в CorPolicy

Вызов разрешён

CosProfile не существует

Ограничения feature_access не применяются, разрешены правила маршрутизации с нулевым уровнем доступа и неназначенным направлением (и то и другое является значением по умолчанию).

CosProfile.restriction_level не задан

0 (разрешены только правила маршрутизации с нулевым уровнем доступа (restriction_level = 0 — это значение по умолчанию).

CosProfile.call_types не задан

[all] (никакие направления вызова не блокируется на основании сопоставления кодов).

CosProfile.toll_lists не задан

[] (ни один TollList не назначен).

CosProfile.feature_access не задан

[all] (все предустановленные и ограничиваемые системой функции и сервисы разрешены)

CorPolicy.src_cos не задан

any (любой)

CorPolicy.dst_cor не задан

any (любой)

CorPolicy.feature не задан

any (любой)

CorPolicy.action не задан

allow (разрешено)

CorPolicy.time_mask не задан

all (всегда активно)

CorPolicy.priority не задан

1000 (базовый приоритет)

TollList.call_types не задан

[] (никакое направление для списка не задано явно).

TollLink не существует

Направления со списками не сопоставлены.

TollLink.allow не задан

true (связка TollList и CallType активна, обладателям CoS, для которых данный TollList задан, вызов направления разрешен).

vectorrule.opts.call_type не задан

Направление не задано, ограничения на использование правила на основании сопоставления имен не применяется.

vectorrule.opts.restriction_level не задан

0 Требуется минимальный уровень доступа, доступный всем по умолчанию. То есть ограничение на использование правила на основании мандатной модели не применяется.

vectorrule.opts.cos_modify не задан

* (оставляет CoS в контексте без изменения)

sipuser.opts.cos не задан

Контекст входящего вызова от этого пользователя не ограничивается групповыми политикой доступа CoS/CoR.

sipuser.opts.cor не задан

Вызовы на этого пользователя и абонентские сервисы в направлении этого пользователя не ограничиваются групповой политикой доступа CoS/CoR.

provider.opts.cos не задан

Контекст входящего вызова с этой учетной записи не ограничивается групповой политикой доступа CoS/CoR.

Отсутствие СosProfile при заданном cos для пользователя означает запрет всех направлений (правил маршрутизации), для которых установлен call_type или ненулевой restriction_level.

Пустой список CosProfile.feature_access означает запрет всех предустановленных ограничиваемых функций и сервисов.

Пустые списки CosProfile.call_types и CosProfile.toll_lists означают запрет всех настроенных направлений, для которых установлен call_type.

6. Минимально необходимая настройка

Чтобы ограничить доступ вызовов и сервисных функций между группами абонентов, минимально необходимо:

  1. Задать CoS объекту-источнику.

  2. Задать CoR объекту-назначения.

  3. Создать CorPolicy с action: deny для пары.

Чтобы ограничить доступ по направлениям вызова, минимально необходимо: . Задать CoS объекту-источнику. . Создать CosProfile с ограниченным списком call_types И/ИЛИ ограниченным уровнем доступа restriction_level. . Назначить для правила маршрутизации vectorrule код направления call_type И/ИЛИ минимальный уровень доступа restriction_level.

7. Требования к новым сущностям

Сущность Обязательные поля Необязательные поля

CosProfile

code

restriction_level,

feature_access,

call_types,

toll_lists

CorProfile

code

CorPolicy

src_cos,

dst_cor,

feature

priority (1000),

action (allow),

time_mask (all)

toll_list

code

call_types ([])

toll_link

toll_list,

call_type

allow (true))

PolicyCallTypes

code

Валидация

  • 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})