Не хочу откладывать до традиционной пятницы
Задача:
1. Ситуация.Есть некое ПО, реализованное в схеме XXX.
С ним работают пользователи БД (например, YYY).
Вызывая функционал ПО с помощью методов объектных типов и пакетов (XXX.OT%, XXX.PCK%), пользователи получают выборки, описанные в метаданных ПО (запросы). Вызов происходит с помощью execute immediate, dbms_sql, причем (в связи с наследованием) сам вызов execute immediate происходит глубоко в потрохах ПО (цепочка вызовов XXX.OT_4 -> (parent) XXX.OT_3 ->... XXX.OT_1.DoExecuteImmediate).
Пользователь XXX обладает большими правами, по крайней мере, в его схеме валяется куча таблиц (например, XXX.T1).
2. Проблема.Допустим, пользователь YYY имеет права создавать новые выборки в системе. Таким образом, они могут создать выборку "select * from T1". Выборки создаются в предположении, что текущая схема - XXX.
Допустим, что пользователь YYY не имеет прав на выборку из таблицы T1 (с помощью грантов). Но, выполняя выборку с помощью объектного метода XXX.OT_4 (права на методы - отдельный уровень метаданных, но выборку пользователь создал сам и имеет не нее права), пользователь выполняет ее с правами XXX, и, естественно, все видит.
3. Вопрос.Как заставить систему функционировать так, чтобы вызов произвольного SQL происходил с правами вызвавшего XXX.OT_4 пользователя?
Hint: authid current_user на OT_1 не сработает, т.к. его вызывает OT_2, который уже не authid, и права будут от XXX.
Т.е. пользователь YYY должен иметь возможность создать запрос к таблице T1, сервереная часть должна под пользователем YYY проверить корректность запроса (как будто под XXX) а вот посмтореть данные пользователю YYY не судьба. Только имея грант на T1, можно получить данные из запроса.
4. ОграниченияНе подходит:
- Всем объектным типам, наследникам OT_1, включая его, назначить authid current_user.
- Положиться на решение на основе RLS (OLS тоже не предлагать)
- Перенести логику выборок в отдельный пакет в схеме XXX и дать ему authid current_user - для этого придется менять внешний интерфейс ПО.
5. Возможный вариант.Все пользователи регистрируются в метаданных ПО, иначе не имеют доступа к базовому функционалу. В момент регистрации предполагается в схеме пользователя создавать пакет (права XXX это позволяют), который выполняет execute immediate и возвращает SYS_REFCURSOR (+ еще пару методов для execute immediate без выборки и работы с dbms_sql). Базовые методы ОТ_1 вместо вызова execute immediate переписать так, чтобы они вызывали пакет в схеме текущего пользователя, который и производит выполнение SQL - в таком случае права проверяются для него, а не для XXX.
Недостаток - нужна некоторая доработка по генерации этих пакетов при регистрации и контролю нормального состояния пакетов - не поменялись ли. Предполагается кэшировать LAST_DDL_TIME (или TIMESTAMP) из dba_objects для спецификации и тела сгенерированных пакетов. От SYS'а, кто это может поменять, не закрываемся
DisclaimerКГ/АМ - не принимаются, ибо не конструктифф.
Переписать все - аналогично.
Ограничения отменить нельзя.
Аффтар к истокам архитектуры отношения не имеет, так что памидорами не кидаться. Изначально система полностью рулилась через RLS, теперь надо и через гранты, причем ведущиеся
вне метаданных системы.