Oracle: регулирование доступа к отдельным строкам таблиц


Механизм Oracle virtual private database (VPD) в Oracle позволяет регламентировать доступ к частям таблицы, но использует для этого весьма примитивную систему понятий. В версии 8.1.7 в Oracle появилось другое средство, Oracle Label Security, система понятий которого более продумана и лучше приспособлена под задачи защиты частей таблицы. Технически оно опирается на Oracle VPD, но реализует подход, известный в ИТ под названием мандатного управления доступом, регулирующим в данном случае доступ к отдельным строкам таблиц разным категориям пользователей. Каждая строка нужной таблицы помечается специальной меткой, допускающей впоследствии изменение. Пользователям выдается разрешение работать со строками, помеченными только определенными метками. При разборе запроса к таблице СУБД выполнит проверки обычных полномочий доступа (выдаваемых командой GRANT), а при выполнении запроса отфильтрует из таблицы только строки со значениями меток, разрешенными для пользователя. Логически это выглядит как автоматическое добавление предиката AND P(метка_строки, контекст_сеанса) в конструкцию WHERE запроса. В конечном счете не предназначенные для него строки пользователь не сможет ни увидеть, ни изменить.

Label Security – дополнительная возможность Oracle. Для того, чтобы ею пользоваться, нужно (а) завести при установке ПО СУБД Oracle нужные компоненты и (б) завести необходимые структуры в БД. Первое делается установщиком OUI, а второе – конфигуратором БД DCA или простым прогоном сценария catols.sql из каталога $ORACLE_HOME/rdbms/admin. Наблюдаемый результат – новый пользователь LBACSYS и целая серия принадлежащих ему объектов, включая пакеты, имена которых начинаются с 'SA_'.

Простой пример

Данные для регламентируемого доступа

Пусть у сотрудников из таблицы EMP имеются телефоны:

CONNECT scott/tiger

CREATE TABLE phone AS SELECT empno FROM emp;

ALTER TABLE phone ADD (pno VARCHAR(20));

ALTER TABLE phone ADD PRIMARY KEY (empno, pno);

UPDATE phone
SET pno = TRUNC(dbms_random.value(100, 999))
||'-'
||TRUNC(dbms_random.value(1000, 9999));

Какие-то из них будут общедоступны, а какие-то нет, но об этом будет сообщено позже.

Заведем пользователей Oracle, представляющих сотрудника и административное лицо. Дадим им минимум необходимых для данного примера полномочий:

CONNECT / AS SYSDBA

CREATE USER employee IDENTIFIED BY employee;

CREATE USER head IDENTIFIED BY head;

CREATE ROLE minimal;

GRANT CREATE SESSION TO minimal;

GRANT SELECT ON scott.phone TO minimal;

GRANT SELECT ON scott.emp TO minimal;

GRANT minimal TO employee, head;

GRANT UPDATE ON scott.phone TO lbacsys;

GRANT UPDATE ON scott.emp TO lbacsys;
 
« Предыдущая статья   Следующая статья »