Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Правильный Вася
Member

Откуда:
Сообщений: 379
Пытаюсь разобраться, зачем нужны и как использовать эти параметры в, например,
PROCEDURE add_policy( ...
  namespace       IN VARCHAR2 := NULL,
  attribute       IN VARCHAR2 := NULL );

Ни по слишком округлой справке, ни по скудному описанию в тексте пакета никак не пойму, что туда передавать?

Просмотрел множество всяких туториалов, так они вообще ловко обходят именно эти параметры, ни разу о них не вспоминая и уж тем более не объясняя.

Подскажите сабж, кто пользовался?
20 ноя 20, 02:15    [22235815]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
Правильный Вася,


Я не пользовался, но я заметил что эти параметры задаются только в add_policy_context и drop_policy_context.

Security context описывается здесь довольно подробно.
https://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm#DBSEG011
20 ноя 20, 03:18    [22235822]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Правильный Вася
Member

Откуда:
Сообщений: 379
НеофитSQL,

Что такое контекст, я знаю.
Меня интересуют конкретно параметры для создания политик. При попытке что-то передать в них банально ругается
ORA-28104: input value for namespace is not valid

Пробовал и просто имена контекстов, и заранее добавленные через add_policy_context() контексты.
20 ноя 20, 03:35    [22235826]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
Правильный Вася,


Если ошибка происходит при вызове add_policy, у которой нет этих параметров, контекст/атрибут, то возможно вы столкнулись с ситуацией описанной здесь.

https://blog.tuningsql.com/ora-28104-input-value-for-statement_types-is-not-valid/

А если нет, может кто-то опытный скоро откликнется.
20 ноя 20, 03:57    [22235828]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Правильный Вася
Member

Откуда:
Сообщений: 379
НеофитSQL
происходит при вызове add_policy, у которой нет этих параметров, контекст/атрибут

У неё ЕСТЬ эти параметры, описаны в документации и в декларации пакета.
Вот только описание настолько скудное, что ничего не проясняет. Или я настолько туп, что не понимаю его.
20 ноя 20, 04:15    [22235831]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Передавать туда контекст и его переменную
Как минимум, это запретит доступ, если эта переменная контекста не установлена
Насколько я понял -- основное предназначение оптимизировать вызов функции возвращения предиката для *CONTEXT_SENSITIVE политики, т.е. вызывать только в случае изменения значения конкретного атрибута. До 12.2 (?) этого не было и, насколько понимаю, предикат пересчитывался при любом изменении любого контекста (?)
+
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

tst> create context rls_ctx using rls_ctx_pkg;

Context created.

tst> create package rls_ctx_pkg as
  2  procedure set(name varchar2, value varchar2);
  3  function get_pred(owner varchar2, name varchar2) return varchar2;
  4  end;
  5  /

Package created.

tst> create package body rls_ctx_pkg as
  2  procedure set(name varchar2, value varchar2) is
  3  begin
  4   dbms_session.set_context('RLS_CTX', name, value);
  5  end;
  6  
  7  function get_pred(owner varchar2, name varchar2) return varchar2 as
  8  begin
  9   return 'id='||sys_context('RLS_CTX', 'ID');
 10  end;
 11  end;
 12  /

Package body created.

tst> create table t1 as select rownum id, rownum value from dual connect by level <= 3;

Table created.

tst> exec dbms_rls.add_policy(user, 'T1', 'T1_POLICY', user, 'RLS_CTX_PKG.GET_PRED', -
>                             policy_type=>dbms_rls.SHARED_CONTEXT_SENSITIVE, namespace=> 'RLS_CTX', attribute=> 'ID')

PL/SQL procedure successfully completed.
tst> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-42801: Value is not set for context attribute ("RLS_CTX", "ID") which is associated with the Row Level Security (RLS) policy "T1_POLICY".


tst> exec rls_ctx_pkg.set('ID', 2)

PL/SQL procedure successfully completed.

tst> select * from t1;

        ID      VALUE
---------- ----------
         2          2

Ну и посмотреть текст ошибок 42800, 42801

PS. Что-то у меня в 18.12 перестал работать event 10730, там можно было посмотреть применение RLS. В 11.2 работало :-(
20 ноя 20, 06:44    [22235838]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Правильный Вася
Member

Откуда:
Сообщений: 379
Вячеслав Любомудров,

Спасибо. Оказалось, я при создании контекста его привязывал не к тому пакету.

Но теперь другая непонятка.
Я считал, что add_policy_context() просто дополнительно расширяет список контекстов для уже созданной с контекстом политики. Однако, судя по
SELECT * FROM all_policy_contexts;
SELECT * FROM all_policy_attributes;
это не так. В первую вьюху попадают те, что идут от add_policy_context(), а во вторую те, что идут от add_policy().

И вот тут ступор. А что тогда делает add_policy_context() и как потом используются эти контексты? Они вообще как-то соотносятся между собой?
По описанию опять же не пойму.
20 ноя 20, 23:02    [22236261]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Я так понимаю -- add_policy_context используется для группы политик -- т.е. управляется приложением, оно выбирает, какую именно группу политик применять через значение данного аттрибута конкретного контекста

Т.е. в зависимости от изменения этого аттрибута выбирается та или иная группа политик ну и, соответственно, скорее всего надо обновить предикаты

Дальше решение об обновлении предикатов применяется на основании контекстных атрибутов, назначенных данной [*CONTEXT*] политике (если не назначено, обновляется действительно при любом изменении любого контекста " If there is a change in any attribute of any application context during the user session, then by default the database re-executes the policy function to ensure that it captures all changes to the predicate since the initial parsing. This results in unnecessary re-executions of the policy function if none of the associated attributes have changed. You can restrict the evaluation to a specific application context by including both the namespace and attribute parameters.")

Тут еще надо понимать виды политик:
-- DYNAMIC -- всегда вызывается функция вычисления предиката -- соответственно постоянные, накладные расходы
-- *STATIC -- функция вычисления предиката вызывается один раз, предикат один и тот же, но за счет использования [контекстных] переменных могут быть разные результаты
-- *CONTEXT_SENSITIVE -- функция вычисления предиката вызывается каждый раз при смене ассоциированного с ней аттрибута/ов или любого значения любого контекста. Надо четко понять, что это для случаев, когда меняется именно строка предиката в зависимости от значения контекста. Т.е. для предиката типа "ID=SYS_CONTEXT('RLS_CTX', 'ID')" использовать такой тип не надо, для этого существует *STATIC. И, тут уже функция должна быть чистой, т.е. переменные допускаются только контекстные, PL/SQL-ные запрещены

PS. И да, конечно, все возможности я не тестировал. Но, ведь можно обратиться к первоисточнику, на который ссылка, кстати, дана из описания самого пакета
21 ноя 20, 09:52    [22236328]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_RLS - назначение параметров namespace и attribute у процедур пакета  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
И, для добавлении/удалении ассоциации политики с атрибутом контекста, т.е. когда значение предиката меняется на основании, в том числе, и этой переменной контекста, для данной политики надо использовать DBMS_RLS.ALTER_POLICY

Соответственно, для ассоциации изменения выбора группы политик с конкретной контекстной переменной надо юзать DBMS_RLS.ALTER_GROUPED_POLICY
21 ноя 20, 10:06    [22236333]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить