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