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

Глава 34. Где RLS подходит, а где нет

34.1. Два разных вопроса

К этому моменту можно сформулировать важное различие.

Первый вопрос:

Как определить, имеет ли субъект право действовать над объектом?

Второй:

Как физически ограничить данные после того, как такое право определено?

Для первого могут использоваться разные модели авторизации.

Для второго — разные механизмы enforcement.

RLS относится прежде всего ко второму вопросу.


34.2. Relationship-Based Access Control

Один из важных классов моделей — ReBAC (Relationship-Based Access Control, управление доступом на основе отношений).

В ReBAC отношения между субъектами, объектами и другими сущностями становятся частью основания доступа.

Упрощённо:

User
  ↓ member
Group
  ↓ has access
Project
  ↓ contains
Object

Такой подход хорошо соответствует системам, где доступ нельзя описать только свойствами пользователя.

Именно эту проблему мы рассматривали в предыдущих главах.


34.3. Zanzibar

Одним из наиболее известных опубликованных примеров relationship-based подхода является Zanzibar — архитектура системы авторизации, опубликованная Google.

Её важность для рассматриваемой темы не в конкретном API или формате хранения.

Важен сам архитектурный принцип:

authorization
    ↓
relationships
    ↓
objects
    ↓
permissions

То есть авторизация рассматривается как вычисление на модели отношений.

Это очень близко к центральной идее книги:

Object
   ↓
Relationships
   ↓
Context
   ↓
Effective permission

Но это не означает, что описываемая здесь модель является реализацией Zanzibar.


34.4. OpenFGA, SpiceDB и Ory Keto

На практике существуют системы, реализующие близкий класс relationship-based подходов, например:

  • OpenFGA;

  • SpiceDB;

  • Ory Keto.

Они предлагают отдельные механизмы моделирования отношений и вычисления авторизации.

Их конкретные модели, API и эксплуатационные свойства различаются.

Но архитектурная идея пересекается:

Relationships
       ↓
Authorization decision

Это полезно сравнивать с другими архитектурами не на уровне названий продуктов, а на уровне ответственности.


34.5. Где находится наша модель

Рассмотренная в книге модель также исходит из отношений:

Subject
Object
Relationship
Area
Context
Rule
Effective permission

Но из этого ещё не следует конкретный продукт или конкретный authorization engine.

Один и тот же концептуальный уровень может быть реализован:

  • отдельным authorization service;

  • библиотекой;

  • SQL-проекциями;

  • частью приложения;

  • комбинацией этих механизмов.

Поэтому модель и реализация должны оставаться различимыми.


34.6. Где здесь PostgreSQL RLS

Теперь можно поставить RLS в эту картину.

Relationship model
        ↓
Authorization
        ↓
Effective permission
        ↓
RLS
        ↓
Physical rows

RLS находится ниже модели отношений.

Он не отвечает на вопрос:

Почему пользователь связан с объектом?

Он отвечает:

Какие строки должен пропустить текущий SQL-запрос?

Поэтому:

ReBAC ≠ RLS

И:

RLS ≠ authorization model

34.7. Почему эти подходы могут использоваться вместе

Нет необходимости выбирать между:

ReBAC

и:

RLS

как между взаимоисключающими технологиями.

Они могут находиться на разных уровнях:

Relationship-based model
        ↓
Security projections
        ↓
Object authorization
        ↓
RLS

Именно это позволяет использовать выразительную модель отношений, сохраняя физическую защиту данных на уровне базы.


34.8. Guardian как конкретный пример

Guardian реализует не «Zanzibar внутри PostgreSQL».

Его архитектура другая.

В ней security state заранее материализуется в проекциях:

effective_user_group
effective_user_permission
object_scope

После этого объектная авторизация сопоставляет:

effective_user_permission
        +
object_scope

а физические данные дополнительно защищаются RLS.

Поэтому Guardian интересен здесь не как реализация какого-либо одного промышленного стандарта.

Он является примером другой точки сборки тех же архитектурных идей:

Relations
   ↓
Projections
   ↓
Authorization
   ↓
Database enforcement

34.9. Когда RLS особенно естественен

RLS хорошо подходит, когда граница безопасности совпадает с физическими строками.

Например:

company_id
tenant_id
owner_id
object_id

могут непосредственно участвовать в ограничении строк.

Особенно полезен RLS для массовых запросов:

SELECT ...
FROM objects

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


34.10. Когда RLS недостаточен

RLS плохо подходит в качестве единственного механизма для правил вроде:

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

Такое правило относится к authorization model.

Попытка целиком перенести его в RLS смешивает:

Business semantics
Authorization
Data enforcement

и усложняет каждую из них.


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

Промышленные relationship-based системы показывают, что сложный доступ действительно можно моделировать через отношения.

RLS показывает другую сторону задачи: даже правильно вычисленное разрешение должно быть применено к физическим данным.

Поэтому полезно разделять:

Relationship model
        ↓
Authorization
        ↓
Data enforcement

Zanzibar, OpenFGA, SpiceDB и Ory Keto относятся прежде всего к первому и второму уровням.

PostgreSQL RLS — к третьему.

Эти механизмы могут дополнять друг друга, потому что решают разные задачи.