Лабораторный практикум по НСД 2013
.pdf341
Рис. 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