Лабораторный практикум по НСД 2013
.pdf361
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', HANDLER_SCHEMA=>null, HANDLER_MODULE=>null,
ENABLE=>true);
END;
/
DELETE FROM dba_fga_audit_trail;
Проверим, что зарегистрирует скорректированная политика FGA 'chk_empa'. conn king/king@orcl
--команда 1
SELECT * FROM scott.emp; conn smith/smith@orcl --команда 2
SELECT * FROM scott.emp; --команда 3
SELECT empno,job FROM scott.emp WHERE sal>1500; --команда 4
SELECT empno,job FROM scott.emp WHERE sal<1500; --команда 5
SELECT empno, deptno FROM scott.emp; --команда 6
SELECT ename FROM scott.emp; --команда 7
SELECT sal FROM scott.emp; --команда 8
UPDATE scott.emp SET sal=1600 WHERE sal<1500 AND job='CLERK'; ROLLBACK;
Посмотрим, что зарегистрировал аудит. conn main/main@orcl
Alter session set nls_date_format = 'yyyy-mon-dd:HH:MI:SS'; select db_user, sql_text, timestamp from dba_fga_audit_trail;
DB_USER |
SQL_TEXT |
TIMESTAMP |
----------------- |
-------------------------------------------------- -------------------- |
|
KING |
SELECT * FROM scott.emp |
2010-май-29:06:20:24 |
SMITH |
SELECT * FROM scott.emp |
2010-май-29:06:20:24 |
SMITH |
SELECT empno,job FROM scott.emp |
2010-май-29:06:20:25 |
|
WHERE sal>1500 |
|
SMITH |
SELECT ename FROM scott.emp |
2010-май-29:06:20:25 |
SMITH |
SELECT sal FROM scott.emp |
2010-май-29:06:20:25 |
362
SMITH UPDATE scott.emp SET sal=1600 2010-май-29:06:20:26 WHERE sal<1500 AND job='CLERK'
«UPDATE» пользователя «smits» зарегистрирован, несмотря на откат транзакции.
Извлечение только всех имен пользователей, а также в отдельном запросе только всех зарплат также регистрируется, так как эти столбцы указаны в политике и для отдельных строк таблицы с извлекаемыми значениями имен и зарплат выполняется условие sal>1500.
На самом деле извлечение по отдельности столбцов имен пользователей и зарплаты может не представлять особой угрозы безопасности, так как явной связи значений этих столбцов нет. Поэтому полезно было бы потребовать фиксировать обращение к таблице «emp» только если в запросе указаны оба столбца вместе. Такая возможность есть. В создаваемой политике FGAudit есть параметр «audit_column_opts» по умолчанию имеющий значение «dbms_fga.any_columns». Но если мы хотим потребовать фиксировать обращение к таблице «emp» только если в запросе указаны оба столбца вместе, этот пароаметр надо устанавливать в значение «dbms_fga.all_columns». Проверим настройку этого параметра с таким значением.
conn main/main@orcl 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, HANDLER_SCHEMA=>null, HANDLER_MODULE=>null,
ENABLE=>true);
END;
363
/
DELETE FROM dba_fga_audit_trail; conn smith/smith@orcl
--команда 1
SELECT ename FROM scott.emp; --команда 2
SELECT sal FROM scott.emp; --команда 3
SELECT ename, sal FROM scott.emp; conn main/main@orcl
Alter session set nls_date_format = 'yyyy-mon-dd:HH:MI:SS'; select db_user, sql_text, timestamp from dba_fga_audit_trail;
DB_USER |
SQL_TEXT |
TIMESTAMP |
---------------------- -------------------------------------------------- -------------------- |
||
SMITH |
SELECT ename, sal FROM scott.emp |
2010-май-29:07:46:49 |
Наша политика сработала верно. Зарегистрирован только один запрос с извлечением одновременно двух столбцов. В представлении словаря «dba_audit_policies» можно увидеть созданную политику.
conn main/main@orcl
SELECT * FROM dba_audit_policies;
Проверка выполнения запросов, включающих переменные привязки, ретроспективных запросов, с использованием FGAudit
В предыдущем разделе был приведен пример политики FGAudit, в котором вводилось условие «sal>1500». Если в запросе в явном виде присутствует предикат, включающий это условие, запрос будет зарегистрирован детальным аудитом. Но ведь запрос может быть написан с использованием переменных привязки. Сможет ли детальный аудит зарегистрировать такие запросы? Да, такая возможность есть.
conn main/main@orcl
DELETE FROM dba_fga_audit_trail; Conn ford/ford@orcl
var empno number
var ename varchar2(10) begin
:empno:=7900;
:ename:='JAMES';
end;
/
select ename, sal from scott.emp where empno=:empno and ename=:ename;
ENAME SAL
---------- ----------
364
JAMES 950
begin :empno:=7839; :ename:='KING'; end;
/
select ename, sal from scott.emp where empno=:empno and ename=:ename;
ENAME |
SAL |
---------- |
---------- |
KING |
5000 |
conn main/main@orcl
Alter session set nls_date_format = 'yyyy-mon-dd:HH:MI:SS'; col sql_bind format a30
col sql_text format a100
select db_user, sql_text, sql_bind, timestamp from dba_fga_audit_trail;
DB_USER SQL_TEXT |
SQL_BIND |
TIMESTAMP |
-------------- ----------------------------------- |
------------------------------ |
--------------------------- |
FORD select ename, sal from scott.emp |
#1(4):7839 #2(4):KING 2010-май-30:01:10:12 |
where empno=:empno
and ename=:ename
Запрос с ename=JAMES не зарегистрирован, так как зарплата JAMES-а < 1500, запрос с FORD-ом зарегистрирован, так как выполняется условие «sal>1500». Детальный аудит в столбце «sql_bind» зафиксировал обе переменные привязки и их значения. В столбце «sql_bind» #1 означает первую переменную привязки, #2 – вторую, (4) число символов в переменной привязки, а затем приводится само значение переменной привязки.
Возможность «ловить» переменные привязки и их значения важна не только в целях аудита, но и при решении частных задач, связанных с повышением производительности системы, когда приходится определять, какие типы значений чаще всего выбираются пользователями из базы данных.
При создании политики детального аудита возможность регистрировать переменные привязки, как и текст запроса, определяется параметром «audit_trail» процедуры «dbms_fga.add_policy», который по умолчанию имеет значение «db_extended». Для отключения возможности регистрировать переменные привязки этот параметр надо установить в значение «dbms_fga.db».
conn main/main@orcl begin
DBMS_FGA.DROP_POLICY( OBJECT_SCHEMA => ‘scott’, OBJECT_NAME => ‘emp’, policy_name => ‘CHK_EMPA’); end;
365
/
Затем:
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, HANDLER_SCHEMA=>null, HANDLER_MODULE=>null,
ENABLE=>true);
END;
/
При анализе данных детального аудита бывает полезно не только видеть запрос, выданный пользователем, но и извлеченное им значение по этому запросу. Момент анализа данных детального аудита во времени может отстоять на несколько дней от момента, когда был сделан зафиксированный детальным аудитом запрос. За эти несколько дней содержимое таблицы, к которой был сделан этот запрос, изменилось, поэтому неясно, что же именно увидел потенциальный нарушитель, выполнивший свой запрос.
Установим параметр AUDIT_TRAIL политики детального аудита в значе-
ние «dbms_fga.db_extended».
Conn main/main@orcl begin
DBMS_FGA.DROP_POLICY( OBJECT_SCHEMA => ‘scott’, OBJECT_NAME => ‘emp’, policy_name => ‘CHK_EMPA’); end;
/
Затем: begin
DBMS_FGA.DROP_POLICY( OBJECT_SCHEMA => ‘scott’, OBJECT_NAME => ‘emp’, policy_name => ‘CHK_EMPA’); end;
/
BEGIN DBMS_FGA.ADD_POLICY(
366
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, 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 |
367
Остальные строки, кроме KING-а нам неинтересны, ведь изменялось значение только в этой строке.
Для того чтобы пользователь «main» мог выполнять такое извлечение прошлого состояния строки, ему была дана привилегия «FLASHBACK ANY
TABLE».
Определение политики (правила) аудита с обработкой событий для выбранной предметной области. Проверка выполнения детального аудита с обработкой событий в соответствии с определенной политикой
В предыдущих разделах этой лабораторной работы мы в числе параметров процедуры 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), |
|
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,
|
|
368 |
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'); |
|
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,
369
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,
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;
370
/
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, HANDLER_SCHEMA=>'main', HANDLER_MODULE=>'access_flagger', ENABLE=>true);
END;
/
col sql_text format a100
Alter session set nls_date_format = 'yyyy-mon-dd:HH:MI:SS';
select db_user, sql_text, timestamp,scn from dba_fga_audit_trail WHERE db_user='SMITH';
DB_USER SQL_TEXT |
TIMESTAM |
SCN |
|
-------------- |
-------------------------------------- |
---------------------- |
----------- |
SMITH |
SELECT * FROM scott.emp |
2010-май-30:08:35:12 |
13731785 |
select |
db_user, sql_text, audit_date,scn from flagged_access |
WHERE |
||
db_user='SMITH'; |
|
|
|
|
DB_USER SQL_TEXT |
AUDIT_DATE |
SCN |
|
|
-------------- -------------------------------------- |
---------------------- |
----------- |
|
|
SMITH |
SELECT * FROM scott.emp |
2010-май-30:08:35:12 |
13731785 |
|
C данными аудита в таблице flagged_access можно выполнять любую обработку, не затрагивая словаря базы данных.
Сдача лабораторной работы
Заключается в демонстрации студентом детального аудита на индивидуальной предметной области, заданной преподавателем. Студент сам создает и обеспечивает возможность демонстрации преподавателю (совокупностью скриптов) политики детального аудита в работе:
А) без обработки событий детального аудита; Б) с регистрацией переменных привязки и выводимой по зарегистрирован-
ному детальным аудитом запросу на момент выполнения этого запроса; В) с обработкой событий детального аудита.
В ходе выполнения скриптов студент отвечает на вопросы преподавателя в связи с их (скриптов) работой.