Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
79
Добавлен:
12.11.2022
Размер:
12.47 Mб
Скачать

391

Рис. 15.1 ERD диаграмма предметной области (English)

На схеме видно, что два пользователя: Certif_mgr и Licns_mgr имеют «общую» таблицу «Manufctr», с которой оба эти пользователя могут выполнять однотипные действия изменения данных в этой таблице. Для того чтобы знать, какой пользователь, какие действия по изменению данных выполнял, создадим таблицу manufactr_audit. В эту таблицу будем также заносить информацию о прежнем и новом значении строк таблицы manufctr, формируемых пользователями, имеющими право работы с ней.

Работа выполняется копированием нижеприводимых команд в окно SQL*Plus.

CREATE TABLE manufctr_audit ( CHANGE_TYPE CHAR(1) NOT NULL, CHANGED_BY VARCHAR2(10) NOT NULL, TIMESTAMP DATE NOT NULL, Old_ManuID NUMBER(5),

Old_Name VARCHAR2(25),

Old_Address VARCHAR2(35),

Old_Phone VARCHAR2(12),

New_ManuID NUMBER(5),

New_Name VARCHAR2(25),

New_Address VARCHAR2(35),

New_Phone VARCHAR2(12) );

Создадим синоним этой таблицы, чтобы к ней можно было обращаться без ввода имени схемы:

CREATE PUBLIC SYNONYM manufctr_audit FOR ch_cert.manufctr_audit;

Теперь создадим триггер, обеспечивающий занесение информации аудита в таблицу manufctr_audit:

CREATE OR REPLACE TRIGGER LogManufctr

BEFORE INSERT OR DELETE OR UPDATE ON Manufctr FOR EACH ROW

DECLARE v_ChangeType CHAR(1); BEGIN

IF INSERTING THEN v_ChangeType := 'I'; ELSIF UPDATING THEN

392

v_ChangeType := 'U'; ELSE

v_ChangeType := 'D'; END IF;

INSERT INTO Manufctr_audit (change_type, changed_by, timestamp,

old_manuid, old_name, old_address, old_phone, new_manuid, new_name, new_address, new_phone) VALUES

(v_ChangeType, USER, SYSDATE,

:old.manuid, :old.name, :old.address, :old.phone, :new.manuid, :new.name, :new.address, :new.phone); END LogManufctr;

/

Проверим выполнение аудита изменений в таблице manufctr_audit.

connect licns_mgr/licns_mgr@orcl

insert into manufctr values(3,'Наши друзья','Территория МИФИ','324-34-54');

update manufctr

set manuid=4, name='Их люди',address='Коломенское',phone='112-11-21'

where manuid=3;

delete from manufctr where manuid=4;

Так как привилегия просмотра таблицы «manufctr_audit» пользователям licns_mgr и certif_mgr не предоставлялась, просматривать таблицу manufctr_audit может ее «хозяин» ch_cert.

connect ch_cert/ch_cert@orcl select * from manufctr_audit;

C CHANGED_BY TIMESTAM OLD_MANUID OLD_NAME OLD_ADDRESS OLD_PHONE NEW_MANUID NEW_NAME NEW_ADDRESS NEW_PHONE

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

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

 

 

I LICNS_MGR

21.05.10

 

3

Наши друзья

Территория МИФИ

324-34-54

 

 

 

U LICNS_MGR 21.05.10

 

3

Наши друзья

Территория МИФИ

324-34-54 4

Их люди Коломенское

112-11-21

 

D LICNS_MGR

21.05.10 4

Их люди Коломенское

112-11-21

 

393

Выводимая информация позволяет проконтролировать выполнение аудита действий пользователей и показывает, кто, когда, какие действия по изменению таблицы «manufctr» выполнял и, что особенно важно, прежние и новые значения изменяемых строк этой таблицы.

2. Настройка и проверка в работе аудита действий пользователя встроенными средствами аудита СУБД Oracle, аудит действий пользователя с привилегией «sysdba»

в СУБД Oracle

Регистрация действий пользователей с объектами. Для регистра-

ции таких действий надо задействовать аудит – установить инициализационный параметр audit_trail в значение «DB» или «TRUE».

Connect sys/sys@orcl as sysdba

Проверим значение этого параметра командой:

Show parameter audit_trail

Если значение параметра «TRUE» или «DB», для очистки таблицы аудита Oracle выполним команду:

delete from aud$;

Теперь мы освободились от записей аудита предыдущих сеансов и можем продолжать работу «с чистого листа».

Если значение параметра «NONE», установим этот параметр в значение «TRUE» или «DB» и перестартуем инстанцию:

ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE; Shutdown immediate

Startup

Проверим еще раз значение параметра audit_trail:

Show parameter audit_trail

Теперь выполним команду, включающую аудит таблицы

«manufctr»:

AUDIT select,insert,update,delete ON manufctr;

Убедимся, что таблица «aud$», регистрирующая аудит, пуста:

SELECT userid,ses$actions,obj$name FROM aud$;

Если же в ней есть записи, удалим их:

DELETE FROM aud$;

И проверим, как выполняется аудит действий с таблицей

«manufctr»:

394

connect licns_mgr/licns_mgr@orcl SELECT * FROM manufctr;

Посмотрим, зарегистрирован ли этот «select»:

Connect sys/sys@orcl as sysdba

SELECT userid,ses$actions,obj$name FROM aud$;

USERID

SES$ACTIONS

OBJ$NAME

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

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

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

LICNS_MGR

---------S-------

MANUFCTR

Знак «S» в столбце таблицы «aud$» говорит о том, что зареги-

стрирован успешный «SELECT» к этой таблице; отметим, что этот знак занимает седьмую позицию справа в этом столбце; проверим выполнение двух команд «select» к таблице «manufctr» в одном сеансе, предварительно очистив таблицу aud$:

delete from aud$;

connect licns_mgr/licns_mgr@orcl

SELECT * FROM manufctr WHERE manuid=0; SELECT * FROM manufctr WHERE manuid=1;

Посмотрим, как зарегистрированы эти «SELECT»:

Connect sys/sys@orcl as sysdba

SELECT userid,ses$actions,obj$name FROM aud$; USERID SES$ACTIONS OBJ$NAME

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

LICNS_MGR ---------S------ MANUFCTR

Отсутствие новых строк в таблице «aud$» говорит о том, что в ней регистрируется факт выполнения «SELECT» в сеансе, но не регистрируется каждая из этих команд. Это объясняется тем, что команда «AUDIT select, insert, update, delete ON manufctr;» по умолчанию выполняется с опцией «BY SESSION». Выполним теперь эту команду с опцией «BY ACCESS», предварительно очистив таблицу «aud$»:

Connect sys/sys@orcl as sysdba DELETE FROM aud$;

AUDIT select, insert, update, delete ON manufctr BY ACCESS; connect licns_mgr/licns_mgr@orcl

SELECT * FROM manufctr WHERE manuid=0; SELECT * FROM manufctr WHERE manuid=1; Connect sys/sys@orcl as sysdba

Немного изменим запрос к таблице «aud$»:

395

SELECT userid,ACTION#,OBJ$NAME FROM aud$;

USERID

ACTION#OBJ$NAME

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

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

LICNS_MGR

3

MANUFCTR

LICNS_MGR

3

MANUFCTR

Из таблицы словаря «audit_actions» мы найдем, что значению «3» столбца «ACTION#» соответствует команда «SELECT». В столбце «ses$actions» появляются значения при аудите таблицы «manufctr» только с опцией «BY SESSION» (устанавливаемой по умолчанию). Отметим здесь, что разным операциям с таблицей «manufctr» соответствуют символы в столбце «ses$actions» на разных позициях, значения этих символов также могут быть разными: «S» успешное выполнение команды, «F» неудачное выполнение команды, «B» сочетание успешного и неуспешного выполнения команды и др.

Убедимся в этом:

Connect sys/sys@orcl as sysdba

AUDIT select,insert,update,delete ON manufctr; connect licns_mgr/licns_mgr@orcl

INSERT INTO manufctr VALUES(2,'ooooooo','iiiiiii','111111'); UPDATE manufctr SET manuid='3',name='eeee',address='wwwww' WHERE manuid=2;

UPDATE manufctr SET manuid='4',name='eeee',address='wwwww' WHERE manuid=3;

DELETE FROM manufctr WHERE manuid=4; Connect sys/sys@orcl as sysdba

SELECT userid,ses$actions,obj$name FROM aud$;

USERID

SES$ACTIONS

OBJ$NAME

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

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

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

LICNS_MGR

---S--S---S-----

MANUFCTR

При аудите с опцией «BY ACCESS» информация в столбце «ses$actions» не записывается. Но зато в столбце «action#» Фиксируются коды выполняемых команд, значение которых представлены в таблице словаря «audit_actions». Для регистрации выполняемых пользователем команд, а также действий пользователя по созданию других объектов схемы (например, триггеров, процедур) выполним следующие команды:

Connect sys/sys@orcl as sysdba

396

AUDIT select, insert, update, delete ON manufctr BY ACCESS; AUDIT procedure, trigger by ch_cert;

ALTER SYSTEM SET audit_trail= db,extended SCOPE=SPFILE;

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

shutdown immediate startup

DELETE FROM aud$; connect ch_cert/ch_cert@orcl SELECT * FROM manufctr;

SELECT * FROM manufctr WHERE manuid=0; CREATE OR REPLACE PROCEDURE pr1 AS BEGIN

NULL;

END;

/

CREATE OR REPLACE TRIGGER tr1 BEFORE insert OR update ON item FOR EACH ROW

BEGIN

NULL;

END;

/

CREATE OR REPLACE TRIGGER tr2 BEFORE insert OR update ON item FOR EACH ROW

BEGIN

NULL

END;

/

Последний триггер создается с ошибкой, так как после команды

«NULL» нет знака «;».

DELETE PROCEDURE pr1; DELETE TRIGGER tr1; DELETE TRIGGER tr2; Connect sys/sys@orcl as sysdba

397

ALTER SESSION SET NLS_DATE_FORMAT='yyyy.mm.dd:hh:mi'; В столбце «extenden_timestamp» представления «dba_audit_ object», к которому мы будем обращаться, есть расширенный формат

даты, но с большими подробностями, чем нам сейчас требуется.

set linesize 300

 

 

SELECT user_name, audit_option,

success, failure FROM

dba_stmt_audit_opts;

 

 

USER_NAME

AUDIT_OPTION

SUCCESS FAILURE

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

CH_CERT

PROCEDURE

BY ACCESS BY ACCESS

CH_CERT

TRIGGER

BY ACCESS BY ACCESS

В столбцах «SUCCESS» и «FAILURE» после выполнения ко-

манды «AUDIT procedure, trigger by ch_cert;» установлены значе-

ния «BY ACCESS», что означает регистрацию каждого из поворяющихся действий пользователя «ch_cert» при создании процедур и триггеров, будь эти действия успешны или неуспешны. Опция «BY ACCESS» устанавливается для DDL команд по умолчанию. Отметим здесь также, что команда «AUDIT procedure, trigger by ch_cert;» задает аудит сразу нескольких вариантов DDL предложений, связанных с процедурами и триггерами (не только «CREATE»,

но и «DELETE», «ALTER TRIGGER …ENABLE (DISABLE)»).

SELECT username, timestamp, action_name, sql_text FROM dba_audit_object;

USERNAME TIMESTAMP ACTION_NAME SQL_TEXT

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

CH_CERT 2010.05.22:09:50 CREATE TRIGGER CREATE OR REPLACE TRIGGER tr2 BEFORE insert OR

update ON item FOR EACH ROW BEGIN

NULL

END;

CH_CERT 2010.05.22:09:49 CREATE TRIGGER CREATE OR REPLACE TRIGGER tr1 BEFORE insert OR

update

398

ON item

FOR EACH ROW

BEGIN

NULL;

END;

CH_CERT 2010.05.22:09:49 CREATE PROCEDURE CREATE OR

 

 

REPLACE

 

 

PROCEDURE pr1 AS

 

 

BEGIN

 

 

NULL;

 

 

END;

CH_CERT

2010.05.22:09:49 SELECT

SELECT * FROM manufctr

 

 

WHERE manuid=0

CH_CERT 2010.05.22:09:49 SELECT

SELECT * FROM manufctr

CH_CERT

2010.05.22:09:51

DROP TRIGGER

CH_CERT

2010.05.22:09:51

DROP TRIGGER

CH_CERT

2010.05.22:09:51

DROP PROCEDURE

Отключим аудит действий пользователя в схеме «ch_cert», а также – расширенный аудит:

Connect sys/sys@orcl as sysdba

NOAUDIT select, insert, update, delete ON manufctr; NOAUDIT procedure, trigger by ch_cert;

ALTER SYSTEM SET audit_trail= db SCOPE=SPFILE; Shutdown immediate

Startup

3. Общие настройки аудита для регистрации действий обычных и с привилегией «sysdba» пользователей

с базой данных

Действия пользователя «SYS» с привилегией «SYSDBA» не регистрируются в таблице словаря «AUD$». Для регистрации в системном журнале ОС всех действий этого пользователя установим параметр «audit_sys_operations» в значение «TRUE» и перестартуем инстанцию Oracle.

Connect sys/sys@orcl as sysdba

399

ALTER SYSTEM SET audit_sys_operations=true SCOPE=SPFILE; Shutdown immediate

Startup

DELETE FROM aud$;

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

SELECT 'audit ',name||';' FROM system_privilege_map;

Он выведет более полутора сотен строк – по всем системным привилегиям. При выполнении всех выведенных строк, как команд аудита (для этого надо скопировать выведенные предыдущим запросом строки и вставить в окно SQL*Plus, как выполняемые команды), они будут выполнены успешно, и в таблице

«dba_stmt_audit_opts» мы по запросу:

SELECT audit_option, success, failure FROM dba_stmt_audit_opts;

увидим включенный аудит практически по всем системным привилегиям. Не забудьте, затем выполнить запрос:

SELECT 'noaudit ',name||';' FROM system_privilege_map;

после которого скопировать все выведенные строки и выполнить их, как команды, отменяющие аудит.

На практике нет необходимости задействовать аудит в таком широком диапазоне. Мы проверим аудит действий всех пользователей по нескольким системным привилегиям:

AUDIT alter system, user,procedure, trigger, role;

Аудит таких общих (в команде аудита не указан конкретный пользователь) действий регистрируется для случая, когда параметр «audit_trail» установлен в значение «DB».

Для значения этого параметра «db,extended» аудит в таблице «aud$» не регистрируется.

Посмотрим, какие опции аудита у нас сейчас установлены:

SELECT audit_option, success, failure FROM dba_stmt_audit_opts;

AUDIT_OPTION

SUCCESS FAILURE

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

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

ALTER SYSTEM

BY ACCESS BY ACCESS

USER

BY ACCESS BY ACCESS

 

400