РЕШЕНИЕ СПЕЦИФИЧЕСКИХ ЗАДАЧ АУДИТА БАЗЫ ДАННЫХ

advertisement
РЕШЕНИЕ СПЕЦИФИЧЕСКИХ ЗАДАЧ АУДИТА БАЗЫ ДАННЫХ
Г.Ю. Громов, Д.А. Дорохин, В.С. Черемухин
Рассматриваются новые средства СУБД Oracle и предлагается их использование для расширения
стандартных возможностей, связанных с механизмом сбора данных по функционированию
информационной системы, обработкой исключительных ситуаций и повышению производительности
системы.
Вопросы, связанные с аудитом базы данных, в СУБД Oracle решены давно и
вполне успешно. В СУБД Oracle существует стандартный, довольно громоздкий, но
при этом обладающий большими возможностями механизм сбора информации аудита
базы данных. На любом уровне детализации можно отследить события, происходящие
в базе данных, вплоть до конкретных запросов, выполняемых определенным
пользователем. Однако использование средств аудита, помимо естественно
возникающих накладных расходов, связанных с дополнительной загрузкой базы
данных, вызывает и ряд административных сложностей. Обязательно должна быть
тщательным образом разработана и отлажена стратегия аудита базы данных, которая
должна предусматривать своевременную очистку системной таблицы SYS.AUD$,
размещенную в табличном пространстве SYSTEM. Если не уделить этому вопросу
должного внимания, постоянное изменение размера системной таблицы SYS.AUD$
может привести к фрагментации табличного пространства SYSTEM, что просто
недопустимо, так как избавиться от него можно только пересозданием базы данных.
Наилучшим решением этой проблемы было бы перемещение системной таблицы
SYS.AUD$ в другое табличное пространство, однако Oracle официально заявляет о
непредсказуемых последствиях данного шага.
К тому же, несмотря на все возможности по сбору информации аудита,
предоставляемые стандартными средствами Oracle, возникают специфические задачи,
решение которых с использованием стандартных средств невозможно.
Однако в Oracle, начиная с версии 8i, появилось средство, которое и должно
помочь администраторам и разработчикам решить большинство проблем,
возникающих при сборе специфической информации аудита. Это средство называется
"триггера событий".
В отличии от "классических" триггеров базы данных, срабатывающих в случае
выполнения операций INSERT, UPDATE, DELETE, триггера событий срабатывают при
возникновении как-либо системных событий, среди которых SERVERERROR, AFTER
LOGON, BEFORE LOGOFF, AFTER/ BEFORE ALTER/CREATE/DROP, AFTER/
BEFORE GRANT/REVOKE и так далее. По сути, данный тип триггеров позволяет,
помимо сбора информации аудита, выполнять набор необходимых действий, связанных
с тем или иным системным событием. Триггера событий могут создаваться на двух
уровнях – на уровне базы данных и на уровне конкретной схемы. Также только в
триггерах событий доступен набор атрибутов этих событий, например, стек ошибок
(ora_server_error) для события SERVERERROR или ip-адрес компьютера пользователя
(ora_client_ip_address) для события AFTER LOGON.
В качестве простейшего примера можно привести два триггера, выполняющих
сбор информации аудита в созданную администратором базы данных таблицу. Таблица
создается не в табличном пространстве SYSTEM, и помимо информации, которую
можно собрать стандартными средствами (время начала и окончания работы с базой
данных), в нее заносится информация о том, какая программа используется
пользователем для работы, и ip-адрес компьютера, с которого он работает.
DROP TABLE adm_connections;
CREATE TABLE adm_connections
102
( s_id NUMBER ,
user_name
VARCHAR2(30),
host_ip
VARCHAR2(200),
progr
VARCHAR2(200),
begin_date
DATE DEFAULT sysdate,
end_date
DATE)
TABLESPACE tools;
CREATE OR REPLACE TRIGGER OnLogon AFTER LOGON ON DATABASE
DECLARE
-- описываем служебную переменную
pr VARCHAR2(64);
BEGIN
BEGIN
-- выбираем из представления v$session информацию о программе пользователя
SELECT program INTO pr FROM sys.v_$session t where audsid =
sys_context('USERENV','SESSIONID');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END;
-- вставляем всю необходимую информацию в нашу таблицу
INSERT INTO adm_connections(s_id,user_name,host_ip,progr)
VALUES (sys_context('USERENV','SESSIONID'), ora_login_user,
ora_client_ip_address, pr);
END;
CREATE OR REPLACE TRIGGER OnLogoff BEFORE LOGOFF ON DATABASE
BEGIN
-- обновляем нашу таблицу сведениями об окончании работы с базой данных
данного пользователя
UPDATE adm_connections SET end_date = sysdate WHERE s_id =
sys_context('USERENV','SESSIONID');
END;
Триггера событий также очень полезны и разработчикам. При использовании
многоуровневых архитектур не так просто организовать детальный сбор информации о
возникающих при работе приложения ошибок. Здесь также неоценимую помощь
оказывают триггера событий. Вместо того, чтобы включать программный код каждой
процедуры/функции/пакета в обработчик исключений команды по сохранению
возникшей ошибки, достаточно написать триггер на событие SERVERERROR на
уровне схемы или базы данных. С его помощью возможно, например, сохранять все
ошибки возникающие при работе приложения на уровне базы данных.
CREATE OR REPLACE TRIGGER OnError AFTER SERVERERROR ON
DATABASE
BEGIN
INSERT INTO adm_errors(user_name,host_ip, error_nom)
VALUES (ora_login_user, SYS_CONTEXT('USERENV','IP_ADDRESS'),
SYS_CONTEXT('USERENV','CLIENT_INFO'), 'ORA'||TO_CHAR(ora_server_error(1),'00000'));
END;
103
Рассмотренные примеры использования триггеров событий лишь частично
иллюстрируют их возможности. Использование их в полном объеме позволяет
администраторам и разработчикам находить простые и гибкие решения практически
любых специфических задач, связанных с аудитом базы данных.
Литература
1. Васильев В.Н. Принципы создания интегрированной информационноаналитической системы управления вузом // Тезисы докладов Международной
конференции "Интернет, Общество, Личность - ИОЛ-2000" Институт "Открытое
общество", Санкт-Петербург, 2000.
2. Кириллов В.В., Громов Г.Ю. Применение CASE-технологии при создании
интегрированной информационной системы университета // Тез. докл. Юбилейной
научно-технической конференции профессорско-преподавательского состава,
посвященной 100-летию университета, 29-31 марта 2000 года, Санкт-Петербург,
2000.
3. Кириллов В.В., Громов Г.Ю., Штивельман Я.Е. Первый опыт проектирования
несколькими вузами подсистемы "Учебный процесс" // Тезисы докладов
Международной конференции "Интернет, Общество, Личность - ИОЛ-2000"
Институт "Открытое общество", Санкт-Петербург, 2000.
4. Кириллов В.В., Громов Г.Ю., Черемухин В.С., Вотинцев А.А., Романенко В.А,
Работа с одним репозиторием Oracle Designer территориально распределенных
разработчиков // Тезисы докладов Международной научно-методической
конференции "Телематика'2000", Санкт-Петербург, 2000.
104
Download