Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Глава 32. Репликация модели безопасности

32.1. Когда одной системы уже недостаточно

В распределённой системе данные одного логического объекта могут использовать несколько сервисов.

Например:

Service A
    ↓
owns object

Service B
    ↓
searches object

Service C
    ↓
builds report

Возникает вопрос:

Как сервис B должен узнать, какие пользователи имеют доступ к объектам сервиса A?

Простой ответ:

Каждый запрос отправлять обратно в сервис A.

Но тогда доступ к данным становится зависимым от удалённого вызова.


32.2. Локальная модель доступа

Более устойчивый вариант — иметь локальное представление необходимой части security model:

Central source facts
       ↓
Security change
       ↓
Service B projection
       ↓
Local authorization

Сервис получает не всю модель, а только её необходимую часть.

Это важное ограничение.

Не нужно реплицировать весь граф отношений во все сервисы.


32.3. Данные и модель безопасности — разные вещи

В распределённой системе могут отдельно распространяться:

Domain data

и:

Security facts

Например, сервис может получить информацию:

User A can access Project P

не получая сам проект.

И наоборот, сервис может владеть проектом, но не хранить все организационные отношения компании.

Поэтому репликация security model — самостоятельная архитектурная задача.


32.4. Что именно реплицировать

Есть принципиальная разница между:

Security facts

и:

Final ALLOW/DENY

Например, можно передать:

User A
Role = Reviewer
Scope = Project P

а локальная система сама построит производное состояние.

Так правила остаются частью локальной модели.

Передача готового:

ALLOW(User A, READ, Object X)

сильнее связывает сервисы.

Это может быть оправдано в отдельных системах, но не должно автоматически считаться универсальным решением.


32.5. Локальная проекция должна быть ограниченной

Сервису не обязательно знать:

все пользователи;
все группы;
все проекты;
все объекты;
все роли.

Ему нужна только часть модели, которая влияет на его данные.

Например:

Service A
    ↓
Objects A1..An

Security projection
    ↓
only facts relevant to A1..An

Так уменьшаются:

  • объём данных;

  • стоимость обновления;

  • радиус ошибки;

  • зависимость между сервисами.


32.6. Задержка становится частью модели

После изменения отношения может существовать состояние:

Source model = new
Local projection = old

Поэтому распределённая authorization model требует явного ответа на вопрос:

Что происходит в этот промежуток времени?

Особенно важен отзыв.

Если локальная проекция отстаёт, пользователь может временно видеть уже закрытый ресурс.

Поэтому допустимая задержка — не просто технический параметр.

Это часть security semantics.


32.7. Порядок и повторная обработка

Изменения могут:

  • прийти повторно;

  • прийти не по порядку;

  • потеряться;

  • быть обработаны частично.

Поэтому механизм распространения должен обеспечивать свойства вроде:

idempotence

и возможность обнаружить пропуск.

При этом сама security model не должна зависеть от конкретного транспорта сообщений.

Транспорт — инфраструктурный механизм.

Модель отношений и разрешений — самостоятельный слой.


32.8. Снимок и последующие изменения

Для восстановления локальной проекции удобна комбинация:

Snapshot
    +
Incremental changes

Например:

Security snapshot at T0
        ↓
changes T1
changes T2
changes T3

Если локальная проекция потеряна, её можно восстановить из снимка и изменений.

Но и здесь остаётся важным наличие исходной модели или возможности полного rebuild.


32.9. Локальное применение важнее удалённого решения

Запрос к данным желательно обслуживать локально:

Request
   ↓
Local security projection
   ↓
Local authorization
   ↓
Local data

а не:

Request
   ↓
Remote authorization service
   ↓
Remote response
   ↓
Local data

Второй вариант создаёт дополнительную зависимость от сети, задержки и доступности другого сервиса.

Это не делает централизованную авторизацию невозможной.

Но при большом количестве запросов локальная проекция часто позволяет лучше отделить runtime-доступ к данным от доступности внешнего сервиса.


32.10. B2B добавляет ещё одну границу

В межорганизационном доступе появляется отношение:

Company A
    ↓ grants
Company B

Но оно само по себе не означает:

Company B can read everything from Company A

Остаются:

  • конкретный объект;

  • конкретная область;

  • конкретное действие;

  • уровень разрешения;

  • локальные ограничения.

Поэтому B2B-отношение является одним из оснований доступа, а не универсальным разрешением.


32.11. Главный вывод

В распределённой системе security model может иметь:

Central source facts
       ↓
Security changes
       ↓
Local security projection
       ↓
Local authorization
       ↓
Local data enforcement

Главный принцип:

сервис должен получать достаточно security state для локального принятия решения, но не обязан владеть всей моделью безопасности системы.

Это позволяет разделить владение данными, моделью безопасности и физическое применение доступа.