Горбатов Аттестационные испытания автоматизированных систем от 2014
.pdf391
Рис. 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 |