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

#sql #oracle

Вопрос:

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

Ваши ответы могли бы оказать большую помощь. Спасибо.

Обновить:

 SCOTT > CREATE FUNCTION POLICY (
p_schema IN VARCHAR2,
p_object IN VARCHAR2
)
RETURN VARCHAR2
AS
BEGIN
if(SYS_CONTEXT('userenv', 'SESSION_USER') = 'SYS' ) THEN RETURN '';
else 
RETURN 'NAME = SYS_CONTEXT ("USERENV", "SESSION_USER")';
END IF;


SYS AS SYSDBA> EXECUTE DBMS_RLS.ADD_POLICY (object_schema=>'SCOTT', OBJECT_NAME=>'RATING', POLICY_NAME=>'FIRST_POLICY', FUNCTION_SCHEMA=>'SCOTT', POLICY_FUNCTION=>'POLICY', STATEMENT_TYPES=>'SELECT', UPDATE_CHECK=>TRUE);

PL/SQL procedure successfully completed.

 

ошибка:
SCOTT > SELECT * FROM RATING;

ВЫБЕРИТЕ * ИЗ РЕЙТИНГА * ОШИБКА в строке 1: ORA-28113: предикат политики содержит ошибку

Комментарии:

1. О какой политике вы говорите? Вы буквально описали положение безопасности по умолчанию для каждой базы данных Oracle, когда-либо. Связано ли это с Хранилищем базы данных?

2. это всего лишь задание начального уровня, поэтому я думаю, что общая команда будет в порядке@pmdba

3. Что подразумевается под «пользователем»? Пользователь базы данных или пользователь приложения (что не обязательно одно и то же)?

4. По умолчанию пользователи базы данных могут видеть только свои собственные таблицы, и sysdba нельзя ограничить. Пользователи приложений (получающие доступ к базе данных через ту же учетную запись службы) могут защитить свои индивидуальные данные с помощью sys_context и функции виртуальной частной базы данных, прикрепленной к таблице. Это также не ограничило бы sysdba.

5. Если вы изучаете VPD, пожалуйста, опубликуйте здесь код, который вы пробовали и который мы можем оценить. Мы здесь не для того, чтобы делать за тебя домашнее задание. Тем временем ознакомьтесь с документацией и ознакомьтесь с примерами: docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/…

Ответ №1:

Если я правильно понял, вы хотите ограничить данные в своей таблице для пользователей и не хотите ограничивать данные для системы. Вам нужно иметь столбец в таблице, чтобы указать, какие строки принадлежат какому пользователю. В качестве примера я взял ПОЛЬЗОВАТЕЛЯ столбца, и это может быть что-то другое.

 CREATE FUNCTION SCOTT_POLICY(schema_in in VARCHAR2, table_in in VARCHAR2)
RETURN VARCHAR2
AS
  RESTRICTION VARCHAR2(100);
  SESSION_USER VARCHAR2(50);
BEGIN
      SELECT sys_context('USERENV', 'SESSION_USER') INTO SESSION_USER FROM DUAL;
    
      RESTRICTION := 'UPPER(USER) = '||DBMS_ASSERT.ENQUOTE_LITERAL(SESSION_USER);
      RETURN RESTRICTION;
END;
/
 

Обновить:

После создания этой функции политики, которая вернет предикат, если ПОЛЬЗОВАТЕЛЬ СЕАНСА не является системным. Затем предикат ограничит строки для пользователей, и запрос покажет только те строки, в которых удовлетворяет условию USER = (ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ СЕАНСА). Если пользователь является SYS, то функция не будет вызываться, и к запросу не добавляется предикат, поэтому получаются все строки. Политики RLS не применяются к пользователям системы. Чтобы присоединить функцию политики к политике, используйте пакет DBMS_RL

 BEGIN
  DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA => 'SCOTT', OBJECT_NAME => 'YOURTABLENAME', POLICY_NAME => 'SCOTT_POLICY', FUNCTION_SCHEMA => 'SCOTT', POLICY_FUNCTION => 'SCOTT_POLICY');
END;
 

Это еще не все, но это соответствует вашему основному требованию.
Возможно, вам захочется проверить статические и динамические политики, группы политик или параметр sec_relevant_col.

Комментарии:

1. Ваша проверка SESSION_USER=’SYS’ не нужна, так как система по определению освобождена от политики VPD. Если пользователь является SYS, SYSDBA и т.д., То функция никогда не будет вызвана.

2. Да, правильно. Я внес изменения в ответ. Спасибо, что упомянули об этом.