Материал: Горбатов Аттестационные испытания автоматизированных систем от 2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

лице Professor, чтобы в начале работы ознакомиться с тем, какой результат мы должны получить при выполнении запроса к таблице Error разными пользователями из таблицы Professor.

Таблица 12.1

Политика

пользователяИмя ,

которыйсоздает политику

Таблица, для создаетсякоторой политика

Функция, реалиполитикузующая

Контекстс инфорреализую,мацией - политикущей для функции

Процедура, устанавливающаяконтекст

 

 

 

 

 

 

 

 

 

 

 

 

 

Преподаватель

 

t2

t2.Error

t2.f2_1

t2.

t2.

(таблица Professor)

 

 

 

 

prof_sec_ctx

get_prof_id

может просматри-

 

 

 

 

 

 

вать в таблице Error

 

 

 

 

 

 

записи, касающиеся

 

 

 

 

 

 

неисправностей

 

 

 

 

 

 

компьютеров только

 

 

 

 

 

 

в тех аудиториях, в

 

 

 

 

 

 

которых этот пре-

 

 

 

 

 

 

подаватель прово-

 

 

 

 

 

 

дит занятия

 

 

 

 

 

 

SELECT DISTINCT error.*,professor.prof_f FROM error,computer,auditory,schedule,professor WHERE

error.comp_id=computer.comp_id and computer.aud_id=auditory. aud_id and

auditory.aud_id=schedule.aud_id and schedule.prof_id=professor. prof_id

ORDER BY professor.prof_f;

ERR_ID

ERR_DESCRIPTION

CLASS_ID

 

PROF_F

ERR_TYPE

REPAIRED

COMP_ID

----- -----

-----------------------

--------------

----------

-------- ----------

2

Неисправен процессор

-

1

16

Зотов

3

Сгорел монитор

 

+

8

30

Лаврентьев

1

Сломался USB порт

+

5

1

Лаврентьев

 

 

311

 

 

 

 

Из последнего запроса видно, что в соответствии с введенной политикой (см. табл. 12.1) запрос:

SELECT * FROM Error;

Для пользователя «Зотов» должен вывести одну строку:

ERR_ID

ERR_DESCRIPTION

CLASS_ID

 

ERR_TYPE

REPAIRED

COMP_ID

----- -----

----------------------- --------------

--------------

----------------

2

Неисправен процессор

-

1

16

Для пользователя «Лаврентьев» - две строки:

ERR_ID

ERR_DESCRIPTION

CLASS_ID

 

ERR_TYPE

REPAIRED

COMP_ID

----- -----

-----------------------

--------------

--------------

----------------

3

Сгорел монитор

+

8

30

1

Сломался USB порт

+

5

1

Для пользователя «Беззубцев» строки не найдены.

3. Создание контекста приложения

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

Лаврентьев, Зотов, Беззубцев с паролями l, z, b соответственно

сролью Resource, привилегией create session и с квотой 1m на tablespace users.

Connect t2/t2@orcl

CREATE USER Зотов IDENTIFIED BY z DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 1m ON users;

GRANT RESOURCE, CREATE SESSION TO Зотов;

Аналогично для пользователей «Лаврентьев», «Беззубцев». После создания пользователей дадим им возможность работать

сотдельными таблицами пользователя «t2».

GRANT SELECT, INSERT, UPDATE, DELETE ON error TO PUBLIC;

CREATE PUBLIC SYNONYM error FOR t2.error;

312

GRANT SELECT ON professor TO PUBLIC;

CREATE PUBLIC SYNONYM professor FOR t2.professor;

Контекст приложения должен создавать пользователь «t2».

Connect t2/t2@orcl

CREATE OR REPLACE CONTEXT prof_sec_ctx USING GET_PROF_ID;

После этого создадим процедуру, устанавливающую контекст и триггер, заставляющий выполниться эту процедуру при соединении с базой данных любого пользователя

Connect t2/t2@orcl

CREATE OR REPLACE PROCEDURE get_prof_id AS v_prof_id NUMBER;

BEGIN SELECT prof_id INTO

v_prof_id FROM professor

WHERE UPPER(prof_f)=SYS_CONTEXT('USERENV', 'SESSION_USER');

DBMS_SESSION.SET_CONTEXT('prof_sec_ctx','prof_id1',v_prof_id); EXCEPTION

WHEN NO_DATA_FOUND THEN NULL;

END get_prof_id;

/

Дадим возможность всем пользователям выполнять эту процедуру.

GRANT EXECUTE ON GET_PROF_ID to public;

CREATE PUBLIC SYNONYM get_prof_id FOR t2.get_prof_id;

Если процедура «GET_PROF_ID» выполняется, то в контексте «prof_sec_ctx» (являющемся частью системного контекста пользователя) в ячейке с именем «prof_id1» содержится идентификатор того преподавателя из таблицы «Professor», который выполнил процедуру «GET_PROF_ID». Если же процедуру выполняет пользователь, не представленный в таблице «Professor», то в ячейке с именем «prof_id1» будет находиться NULL значение.

313

Триггер создадим пользователем «sys»:

Connect syst/sys@orcl as sysdba

CREATE OR REPLACE TRIGGER db_trigger AFTER LOGON ON DATABASE

BEGIN t2.get_prof_id; END;

/

4. Создание функции, воплощающей политику (правило) безопасности

Connect t2/t2@orcl

CREATE OR REPLACE FUNCTION f2_1

(obj_schema IN VARCHAR2, obj_name IN VARCHAR2) RETURN VARCHAR2

IS

v_return VARCHAR2(500); BEGIN v_return:='comp_id in ( SELECT comp_id FROM

computer,auditory,schedule,professor WHERE computer.aud_id=auditory.aud_id and auditory.aud_id=schedule.aud_id and schedule.prof_id=professor.prof_id and

professor.prof_id=SYS_CONTEXT(''prof_sec_ctx'', ''prof_id1''))'; RETURN v_return;

END;

/

Функция вернет идентификаторы (comp_id) тех компьютеров из таблицы computer, которые установлены в дисплейных классах (таблица auditory), занятия в которых по расписанию (таблица shedule) проводил преподаватель с идентификатором prof_id из таблицы professor (professor.prof_id). Этот идентифика-

тор извлекается из ячейки prof_id1 контекста prof_sec_ctx, созданного как часть системного контекста sys_context (это извлечение

314

задается частью выражением «sys_context(''prof_sec_ctx'', ''prof_id1'')». Полезно проверить возвращаемое функцией значение.

SET SERVEROUTPUT ON

EXEC DBMS_OUTPUT.PUT_LINE(f2_1('T2', 'ERROR'));

Для пользователя «t2» функция вернет: comp_id in (

SELECT comp_id FROM computer,auditory,schedule,professor WHERE computer.aud_id=auditory.aud_id and auditory.aud_id=schedule.aud_id and schedule.prof_id=professor.prof_id and

professor.prof_id=SYS_CONTEXT('prof_sec_ctx', 'prof_id1'))

Теперь полезно выполнить SELECT, содержащийся в возвращаемом значении, чтобы убедиться в правильности его выполнения:

SELECT comp_id FROM computer,auditory,schedule,professor WHERE computer.aud_id=auditory.aud_id and auditory.aud_id=schedule.aud_id and schedule.prof_id=professor.prof_id and

professor.prof_id=SYS_CONTEXT('prof_sec_ctx', 'prof_id1');

Ответ «строки не выбраны» свидетельствует о правильности работы функции (пользователя «t2» действительно нет в таблице

«Professor»).

Осталось еще:

GRANT EXECUTE ON f2_1 TO PUBLIC; CREATE PUBLIC SYNONYM f2_1 FOR t2.f2_1;

чтобы все пользователи могли выполнять эту функцию.

5. Создание политики (правила) безопасности – обеспечение связи функции с таблицей, для которой сформулирована политика безопасности

Connect t2/t2@orcl

BEGIN

315