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

Лабораторный практикум по НСД 2013

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

341

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

342

Работа выполняется копированием нижеприводимых команд в окно 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 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);

343

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

 

 

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

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

«sysdba» в СУБД Oracle

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

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

Connect sys/sys@orcl as sysdba

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

Show parameter audit_trail

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

344

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»: 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» в сеансе, но не регистрируется каждая из

345

этих команд. Это объясняется тем, что команда «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$»:

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#» фиксируются коды выполняемых ко-

346

манд, значение которых представлены в таблице словаря «audit_actions». Для регистрации выполняемых пользователем команд, а также − действий пользователя по созданию других объектов схемы (например, триггеров, процедур) выполним следующие команды:

Connect sys/sys@orcl as sysdba

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

ALTER SESSION SET NLS_DATE_FORMAT='yyyy.mm.dd:hh:mi';

347

В столбце «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

 

 

 

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

 

 

348

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

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

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

Connect sys/sys@orcl as sysdba

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;

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

349

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

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

PROCEDURE

BY ACCESS BY ACCESS

TRIGGER

BY ACCESS BY ACCESS

ROLE

BY ACCESS BY ACCESS

Проверим включенные опции.

Connect ch_cert/ch_cert@orcl CREATE ROLE r1;

CREATE USER user1 IDENTIFIED BY user1; 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

350

NULL

END;

/

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

BEGIN

NULL;

END;

/

Alter system set nls_language=’RUSSIAN’; Alter system set nls_language= RUSSIAN; Connect sys/sys@orcl as sysdba

SELECT userid,name name_for_audit,obj$name FROM aud$,audit_actions WHERE aud$.action#=audit_actions.action;

USERID

NAME_FOR_AUDIT

OBJ$NAME

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

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

---------

CH_CERT

CREATE ROLE

R1

CH_CERT

CREATE USER

USER1

CH_CERT

CREATE PROCEDURE

PR1

CH_CERT

CREATE TRIGGER

TR1

CH_CERT

CREATE TRIGGER

TR2

CH_CERT

CREATE TRIGGER

TR2

CH_CERT

ALTER SYSTEM

 

CH_CERT

ALTER SYSTEM

 

Несмотря на то, что отдельные действия выполнялись с ошибкой, аудит зарегистрировал все действия пользователя «ch_cert»/ Соединимся теперь пользователем «scott» и выполним те же действия, что и пользователь «ch_cert».

Connect scott/scott@orcl CREATE ROLE r2;

CREATE USER user2 IDENTIFIED BY user2; 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]