Перейти к содержанию

Перенос прав доступа

Перенос прав доступа назначает на объекты, которые витрины создают в базе данных, права доступа исходных таблиц, чтобы читающий представление витрины никогда не видел больше, чем ему разрешено видеть в источнике. Перенос включается для источника данных и действует при каждом создании, пересоздании и привязке представления витрины, построенной на этом источнике. Развёртывание представлений описано на странице Управление представлениями витрин.

Включение переноса

Перенос управляется параметром «Переносить права на создаваемые представления витрин» на вкладке «Параметры» источника данных (см. Источники данных). По умолчанию параметр выключен: перенос требует от сервисной учётной записи источника данных дополнительных полномочий, поэтому администратор включает его осознанно.

Пока параметр выключен, объект создаётся по скрипту без выдачи и отзыва каких-либо прав в базе данных, предпросмотр ничего не перечисляет, а материализованные представления остаются доступными.

Что переносится

Если параметр включён, DataForge читает права доступа таблиц фактов и справочников, на которых построена витрина, и применяет к объекту эквивалентные права при каждом его создании, пересоздании и привязке. Переносятся только права, действующие для всех исходных таблиц: пользователь или роль, которым разрешено читать одну исходную таблицу и запрещено другую, доступ к объекту витрины не получают. Расчётный показатель доступен для чтения только тем, кто может читать все элементы, на которые ссылается его формула, а если к одному столбцу относится несколько масок, сохраняется самая строгая.

Перенос прав никогда не изменяет сам объект: объект создаётся строго по скрипту, показанному в диалоге создания, а права доступа затем назначаются на него.

При изменении прав доступа исходных таблиц права объекта синхронизируются без его пересоздания.

Как права доступа попадают на объект

Тип объекта Как права доступа попадают на объект
«Обычное представление» Пользователям и ролям, у которых есть доступ ко всем исходным таблицам, выдаётся право чтения представления, а само представление вычисляется с правами читающего, поэтому ограничения колонок и политики защиты строк исходных таблиц база данных применяет к каждому читающему сама
«Таблица» Пользователям и ролям выдаётся право чтения таблицы. Пользователь или роль с ограничениями колонок в источнике получает права только на доступные ему колонки. Политики защиты строк исходных таблиц воссоздаются на таблице, а в MS SQL Server на колонки таблицы добавляются маски колонок источника
«Материализованное представление» Недоступно, пока перенос прав включён, — см. раздел «Материализованные представления» ниже

Защита строк на таблицах

Политики защиты строк воссоздаются на таблицах в PostgreSQL, ClickHouse и MS SQL Server и переносятся с любого числа защищённых исходных таблиц. Ограничения разных исходных таблиц действуют одновременно: читающий видит строку таблицы, только если её пропускают политики каждой защищённой исходной таблицы. Пользователь или роль, которых не допускает ни одна политика защищённой исходной таблицы, не видят ни одной строки таблицы — так же, как в источнике.

Политика защиты строк воссоздаётся на таблице, только если каждое поле её условия — колонка, отображаемая в витрине (в витрине с группировкой — поле, по которому группируются данные), а витрина не относится к типу «С группировкой и сверткой» и не объединяет несколько таблиц фактов через «UNION». В противном случае пользователям и ролям, которых ограничивает эта политика, доступ к объекту запрещается, чтобы они никогда не увидели строк, скрытых от них в источнике. Так же запрещается доступ пользователю или роли с ограничениями колонок, если ни одна колонка объекта не остаётся ему доступной или колонки объекта невозможно определить.

В MS SQL Server политика защиты строк — это функция фильтрации, которая сама решает, какие строки видит каждый пользователь, и применяется ко всем пользователям. На таблицу переносится вызов тех же функций на её собственных колонках, поэтому их логика сохраняется без изменений. Политика переносится, если каждый аргумент её функции — колонка, отображаемая в витрине (в витрине с группировкой — поле, по которому группируются данные), либо константа, а сама функция находится в той же базе данных, что и таблица; в противном случае доступ к объекту запрещается всем пользователям и ролям. Чтобы создать политику на таблице, сервисной учётной записи источника данных нужны право CREATE FUNCTION в базе данных, ALTER ANY SECURITY POLICY, ALTER на схему объекта и REFERENCES на функции политик источника.

Таблица может скрыть строку только целиком. Если читающему недоступна запись справочника, с которой соединена строка, на таблице скрывается вся строка, тогда как запрос к исходным таблицам вернул бы её с пустыми полями справочника. Читающий никогда не видит больше, чем в источнике, но может увидеть меньше строк.

Материализованные представления

Пока у источника данных включён перенос прав, материализованное представление использовать нельзя: сохранённый снимок результата невозможно фильтровать отдельно для каждого читающего. Вместо него создавайте обычное представление или таблицу.

  • В диалоге создания вариант «Материализованное представление» отображается недоступным с подсказкой «Материализованные представления недоступны для источника данных с включённым переносом прав: построчный доступ к снимку данных нельзя воспроизвести. Используйте обычное представление или таблицу»
  • Для ранее развёрнутого материализованного представления действие «Обновить представление» становится недоступным и сопровождается поясняющей подсказкой, как только у источника данных включается перенос прав
  • Создание, привязка или пересоздание материализованного представления на таком источнике — вручную или правилом обновления — отклоняется с ошибкой (см. раздел «Ошибки» ниже)

Вкладка «Перенесенные права доступа»

Вкладка «Перенесенные права доступа» в информации о представлении витрины содержит по строке на каждое право, обнаруженное на исходных таблицах:

Колонка Описание
Источник Исходная таблица, на которой обнаружено право
Тип источника «Таблица фактов» или «Справочник»
Право доступа «Права на таблицу (SELECT)», «Права на уровне колонок», «Права на уровне строк» или «Маскирование данных»
Детали Суть права: «Чтение таблицы» для прав на таблицу, «Исключены: …» для ограничения колонок, столбец и его маска для маскирования либо название политики со строками, которые она оставляет видимыми, — «только строки, где …» или «все строки (без ограничения)». Политика, которую невозможно перенести на объект, помечается: «— на объект перенести нельзя, доступ этим пользователям не выдаётся»
Кому применяется К кому относится право. Для прав на таблицу — пользователи и роли, которым они выданы. Для политики защиты строк — пользователи и роли, которых она ограничивает: перечень, «все пользователи» или «все, кроме: …». Для ограничения колонок — тот единственный пользователь или роль, которого оно ограничивает, поэтому у каждого ограниченного пользователя или роли своя строка. Для маскирования — «все пользователи» или «все, кроме: …» с перечнем тех, на кого маска не распространяется
Результат переноса «Перенесено» или «Не перенесено». Пока ничего не развёрнуто, отображается «-»

Ограничение колонок получает результат «Перенесено», если объект его воспроизводит — обычное представление средствами самой базы данных, таблица правами на колонки, — и «Не перенесено», если ограниченному им пользователю или роли вместо этого запрещается доступ к объекту. Политика защиты строк получает результат «Не перенесено», если ограниченным ею пользователям и ролям запрещается доступ.

Действия на вкладке:

  • «Проверить источники» — заново читает права доступа из целевой базы данных, чтобы список отражал их текущее состояние
  • «Создать представление» или «Обновить представление» — разворачивает объект и в той же операции переносит на него права

Кнопки «Создать представление» и «Обновить представление» на этой вкладке доступны только ролям Суперадминистратор, Администратор и Разработчик; Аналитик создаёт и обновляет представление из меню представления.

Колонка «Права доступа» календаря прошедших обновлений открывает отчёт о правах, перенесённых этой операцией (см. Обновление представлений витрин).

Предпросмотр прав доступа

Панель «Права доступа, которые будут перенесены» отображается над скриптом при создании и обновлении представления, а также в диалоге «Пересоздать представление». Она перечисляет, что получит объект:

Поле Содержимое
«Пользователи, получающие доступ» Пользователи, которые смогут читать объект
«Роли, получающие доступ» Роли, которые смогут читать объект
«Доступ к части столбцов» Каждый пользователь или роль, которым доступна только часть столбцов, с перечнем этих столбцов
«N столбцов с ограниченным доступом» Каждый столбец, который недоступен части пользователей или ролей, с пометкой «недоступен: …» и их перечнем
«Маскируемые столбцы» Каждый маскируемый столбец с его маской
«Политики защиты строк (RLS)» Каждая политика с исходной таблицей, строками, которые она оставляет видимыми, пользователями и ролями, которых она ограничивает, и способом её применения к объекту

Способ применения политики защиты строк указывается рядом с ней:

Способ Значение
«контролируется базой данных» Объект — обычное представление, и база данных применяет политику источника к каждому читающему
«политика создана на объекте» Политика воссоздана на таблице
«доступ ограниченным пользователям запрещён» Политику невозможно перенести на объект, поэтому ограниченные ею пользователи и роли доступа не получают
«не ограничивает строки, переносить нечего» Политика пропускает все строки, поэтому ограничивать нечего

Кроме того, панель может показывать:

  • Предупреждение «Правило security-first: N пользователей или ролей не получат доступ к объекту — их ограничения по строкам невозможно применить» с их перечнем
  • Сообщение «Права источников изменились с момента последнего переноса на объект»
  • «На исходных таблицах не обнаружено прав доступа», если переносить нечего, — в том числе пока перенос прав у источника данных выключен

Предпросмотр носит информационный характер: он никогда не блокирует выполнение скрипта и подтверждение «Пересоздать представление». Если предпросмотр рассчитать не удалось, панель показывает «Не удалось рассчитать предпросмотр прав доступа» с кнопкой «Повторить», а объект по-прежнему можно развернуть.

Ошибки

Если права доступа не удалось перенести на объект, представление получает статус «Ошибка обновления», а причина отображается во всплывающей подсказке значка.

Сообщение Причина
«Материализованные представления недоступны для источников данных с включённым переносом прав: построчный доступ к снимку данных нельзя воспроизвести на объекте. Создайте обычное представление или таблицу» Материализованное представление создаётся, привязывается или пересоздаётся — вручную или правилом обновления — на источнике данных с включённым переносом прав
«У служебной учётной записи «…» нет прав на чтение системных каталогов. Выдайте их или отключите перенос прав у источника данных» Права доступа исходных таблиц невозможно прочитать, поэтому их невозможно перенести
«У служебной учётной записи «…» не хватает прав, чтобы применить права доступа к объекту витрины» Сервисная учётная запись источника данных не может назначить права доступа на объект — например, ей не хватает прав, необходимых для создания защиты строк на таблице MS SQL Server