AUDIT_COLUMN_OPTS => dbms_fga.all_columns, AUDIT_TRAIL => dbms_fga.db_extended, HANDLER_SCHEMA=>null, HANDLER_MODULE=>null,
ENABLE=>true);
END;
/
DELETE FROM dba_fga_audit_trail;
Выполним пользователем «FORD» запрос:
Conn ford/ford@orcl SELECT * FROM scott.emp;
Затем пользователем «MAIN» изменим значение столбца «sal».
Conn main/maint@orcl
Alter session set nls_date_format = ‘yyyy-mon-dd:HH:MI:SS’; col sql_text format a100
Update scott.emp set sal= 6000 where ename=’KING’; Commit;
Теперь, если извлекать строки таблицы «emp», в строке KING зарплата будет иметь значение «6000». А что видел FORD?
Выполним запрос к представлению «dba_fga_audit_trail», в котором выведем значение SCN (sytem change number – можно сказать, соответствует отсчету внутренних часов Oracle) для запроса
FORD:
select db_user, sql_text, timestamp,scn from dba_fga_audit_trail WHERE db_user=’FORD’;
DB_USER SQL_TEXT TIMESTAM SCN
---------- -------------------------------------- ---------------------- -----------
FORD SELECT*FROM scott.emp 2010-май-30:02:55:11 13705104
А теперь выполним команду, которая позволит просмотреть строки таблицы «emp» на момент с SCN=13705104, т.е. на тот момент, когда запрос делал FORD:
select * from scott.emp as of SCN 13705104; |
|
|
EMPNO ENAME |
JOB MGR HIREDATE SAL COMM DEPTNO |
|
---------- ---------- --------- |
---------- -------- ---------- ---------- ---------- |
|
7839 KING |
PRESIDENT 17.11.81 5000 |
10 |
|
421 |
|
Остальные строки, кроме KING-а нам неинтересны, ведь изменялось значение только в этой строке.
Для того чтобы пользователь «main» мог выполнять такое извлечение прошлого состояния строки, ему была дана привилегия
«FLASHBACK ANY TABLE».
3. Определение политики (правила) аудита с обработкой событий для выбранной предметной области.
Проверка выполнения детального аудита с обработкой событий в соответствии с определенной политикой
В предыдущих разделах этой лабораторной работы мы в числе параметров процедуры DBMS_FGA.ADD_POLICY указывали, но не задавали значения, параметры «HANDLER_SCHEM», «HANDLER_MODULE». Эти два параметра задают владельца модуля обработки данных детального аудита и название этого модуля. Создадим в схеме «main» таблицу (с незначительной корректировкой) и процедуру для обработки данных детального аудита по образцу, приведенному в книге «Oracle PL/SQL для администраторов баз данных» авторов Аруп Нанда и Стивен Фейерштейн, изданной издательством «Символ-Плюс» в 2008 году.
conn main/main@orcl
CREATE TABLE flagged_access
(
fgasid NUMBER(20), entryid NUMBER(20), audit_date DATE, fga_policy VARCHAR2(30), db_user VARCHAR(30), os_user VARCHAR2(30),
authent_type VARCHAR2(30), client_id VARCHAR2(100), client_info VARCHAR2(64), host_name VARCHAR2(54), instance_id NUMBER(2),
ip VARCHAR2(30), term VARCHAR2(30),
422
schema_owner VARCHAR2(20), table_name VARCHAR2(30), sql_text VARCHAR2(64),
SCN NUMBER(10) ) ;
create or replace procedure access_flagger
(
p_table_owner in varchar2, p_table_name in varchar2, p_fga_policy in varchar2
)
is
l_fgasid number(20); l_entryid number(20); l_term varchar2(2000); l_db_user varchar2(30); l_os_user varchar2(30);
l_authent_type varchar2(2000); l_client_id varchar2(100); l_client_info varchar2(64); l_host_name varchar2(30); l_instance_id number(2);
l_ip varchar2(30); l_sql_text varchar2(4000); l_scn number;
begin
l_fgasid := sys_context('USERENV','SESSIONID'); l_entryid := sys_context('USERENV','ENTRYID'); l_term := sys_context('USERENV','TERMINAL');
l_db_user := sys_context('USERENV','SESSION_USER'); l_os_user := sys_context('USERENV','OS_USER');
l_authent_type := sys_context('USERENV','AUTHENTICATION_TYPE' );
l_client_id := sys_context('USERENV','CLIENT_IDENTIFIER'); l_client_info := sys_context('USERENV','CLIENT_INFO'); l_host_name := sys_context('USERENV','HOST');
423
l_instance_id := sys_context('USERENV','INSTANCE'); l_ip := sys_context('USERENV','IP_ADDRESS'); l_sql_text := sys_context('USERENV','CURRENT_SQL'); l_scn := sys.dbms_flashback.get_system_change_number; insert into flagged_access
(
fgasid,
entryid, audit_date, fga_policy, db_user, os_user, authent_type, client_id, client_info, host_name, instance_id, ip,
term, schema_owner, table_name, sql_text,
scn
)
values
(
l_fgasid, l_entryid, sysdate, p_fga_policy, l_db_user, l_os_user, l_authent_type, l_client_id, l_client_info, l_host_name, l_instance_id, l_ip,
424
l_term, p_table_owner, p_table_name, l_sql_text, l_scn
);
end;
/
Обратим внимание на то, что в созданную нами таблицу аудита вставляется информация из системного контекста, идентифицирующая атрибуты клиента, выполнившего запрос, в том числе и такая, какой нет в представлении «dba_fga_audit_trail». Для того чтобы использовать обработчик в приведенном варианте, пользователю «main» была дана привилегия, на основании которой при выполнении процедуры можно будет извлекать и записывать SCN
в таблицу flagged_access:
GRANT EXECUTE ON dbms_flashback TO main;
Пересоздадим политику:
begin DBMS_FGA.DROP_POLICY( OBJECT_SCHEMA => 'scott', OBJECT_NAME => 'emp', policy_name => 'CHK_EMPA'); end;
/
BEGIN DBMS_FGA.ADD_POLICY( OBJECT_SCHEMA => 'scott', OBJECT_NAME => 'emp', POLICY_NAME => 'chk_empa',
AUDIT_CONDITION => 'sal >1500', AUDIT_COLUMN => 'ename,sal', STATEMENT_TYPES => 'select, insert, update, delete', AUDIT_COLUMN_OPTS => dbms_fga.all_columns, AUDIT_TRAIL => dbms_fga.db_extended,
425