Материал: Горбатов Аттестационные испытания автоматизированных систем от 2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

SMITH

SELECT sal FROM scott.emp

2010-май-29:06:20:25

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',

416

STATEMENT_TYPES => 'select, insert, update, delete', AUDIT_COLUMN_OPTS => dbms_fga.all_columns, HANDLER_SCHEMA=>null, HANDLER_MODULE=>null,

ENABLE=>true);

END;

/

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;

2. Проверка выполнения запросов, включающих переменные привязки, ретроспективных запросов, с использованием

FGAudit

В предыдущем разделе был приведен пример политики FGAudit, в котором вводилось условие «sal>1500». Если в запросе в явном виде присутствует предикат, включающий это условие, запрос будет зарегистрирован детальным аудитом. Но ведь запрос может быть написан с использованием переменных привязки.

417

Сможет ли детальный аудит зарегистрировать такие запросы? Да, такая возможность есть.

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

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

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

418

Запрос с 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;

/

Затем:

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,

419

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( OBJECT_SCHEMA => ‘scott’, OBJECT_NAME => ‘emp’, POLICY_NAME => ‘chk_empa’,

AUDIT_CONDITION => ‘sal >1500’, AUDIT_COLUMN => ‘ename,sal’, STATEMENT_TYPES => ‘select, insert, update, delete’,

420