Время прочтения: 10 мин.
В целях обеспечения контроля доступа к информации, а также действий и операций, выполняемых пользователями на экземпляре СУБД MS SQL корпорация Microsoft предлагает штатный инструмент для аудита MS SQL, который предполагает детальное журналирование следующих событий на экземпляре MS SQL:
- Детализация и журналирование событий над объектами экземпляра СУБД MS SQL:
— создание;
— изменение;
— удаление.
- Детализация и журналирование событий над объектами БД экземпляра СУБД MS SQL:
— создание;
— изменение;
— удаление.
- Детализация и журналирование событий предоставления прав и привилегий к объектам экземпляра СУБД MS SQL;
- Детализация и журналирование событий предоставление прав и привилегий к БД экземпляра СУБД MS SQL.
В этой статье будут рассмотрены тонкости настройки инструмента для аудита MS SQL от Microsoft и его использования (получения информации для анализа событий).
ДАНО:
Установленный и настроенный экземпляр СУБД MS SQL
ЗАДАЧА:
— Обеспечить журналирование событий на экземпляре СУБД MS SQL;
— Обеспечить доступ к данным аудита для анализа;
— Обеспечить хранение журналов аудита в течении 0.5 года.
РЕШЕНИЕ:
Для начала необходимо ознакомиться с событиями аудита, которые могут регистрироваться инструментом от Microsoft. Список событий представлен в таблице 1. Знаком «+» я отметил события, которые нужны были мне, в момент настройки, но читатель может отметить интересующие его пункты и добавить их в скрипт создания спецификации аудита (но об этом позже).
Так же хочу отметить возможность настройки фильтра событий аудита, который предполагает исключение классов событий и видов событий из аудита.
Например, пользователь в дереве объектов раскрывает «Базы Данных», далее переходит в интересующую его БД и затем в дерево таблиц.
После описанных выше действий, просматривает структуру таблицы, или др. объекты Эти события нам не интересны, хотя попадают в группу DATABASE_OPERATION_GROUP.
Или, например, в события аудита попадает информация о качестве сетевого соединения пользовательской сессии из группы событий SUCCESSFUL_LOGIN_GROUP, что для меня так же не было интересно, так как это задача мониторинга работоспособности и доступности SQL Server. Кроме того, журналирование и хранение этих событий будет утилизировать вычислительные ресурсы CPU, RAM и HDD.
Итак, продолжим:
Создадим спецификацию аудита сервера. Как я уже говорил ранее, здесь перечислены события аудита, интересующие меня, но список может быть расширен.
Листинг кода создания спецификации для аудита сервера:
USE [master]
GO
ALTER SERVER AUDIT SPECIFICATION [SQL_SRV_AUDIT_SPECIFICATION]
ADD (SCHEMA_OBJECT_ACCESS_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (BACKUP_RESTORE_GROUP),
ADD (AUDIT_CHANGE_GROUP),
ADD (DATABASE_LOGOUT_GROUP),
ADD (SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP),
ADD (DBCC_GROUP),
ADD (DATABASE_PERMISSION_CHANGE_GROUP),
ADD (DATABASE_OBJECT_PERMISSION_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP),
ADD (SERVER_OBJECT_PERMISSION_CHANGE_GROUP),
ADD (SERVER_PERMISSION_CHANGE_GROUP),
ADD (DATABASE_PRINCIPAL_IMPERSONATION_GROUP),
ADD (SERVER_PRINCIPAL_IMPERSONATION_GROUP),
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (LOGOUT_GROUP),
ADD (DATABASE_CHANGE_GROUP),
ADD (DATABASE_OBJECT_CHANGE_GROUP),
ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_CHANGE_GROUP),
ADD (SERVER_OBJECT_CHANGE_GROUP),
ADD (SERVER_PRINCIPAL_CHANGE_GROUP),
ADD (DATABASE_OPERATION_GROUP),
ADD (APPLICATION_ROLE_CHANGE_PASSWORD_GROUP),
ADD (LOGIN_CHANGE_PASSWORD_GROUP),
ADD (SERVER_STATE_CHANGE_GROUP),
ADD (DATABASE_OWNERSHIP_CHANGE_GROUP),
ADD (DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP),
ADD (SERVER_OBJECT_OWNERSHIP_CHANGE_GROUP),
ADD (TRACE_CHANGE_GROUP),
ADD (USER_CHANGE_PASSWORD_GROUP)
WITH (STATE = ON)
GO
Далее создадим сам аудит
В выражении WHERE перечисленыклассы событий, исключаемые мной из АУДИТА. Подробнее о классах событий можно прочитать на MSDN.
Листинг кода для создания аудита сервера, с использованием фильтра:
USE [master]
GO
CREATE SERVER AUDIT [SQL_SRV_AUDIT]
TO FILE
( FILEPATH = N'C:\AUDIT_SQL\'
,MAXSIZE = 10240 MB
,MAX_ROLLOVER_FILES = 100
,RESERVE_DISK_SPACE = OFF
)
WITH
( QUEUE_DELAY = 1000
,ON_FAILURE = CONTINUE
,AUDIT_GUID = '4fc594e2-5f73-4190-a589-40f25e6bb0dc'
)
WHERE ([class_type]<>(22604)
AND [class_type]<>(21059)
AND [class_type]<>(19283)
AND [class_type]<>(21843)
AND [class_type]<>(16964)
AND [class_type]<>(8257))
ALTER SERVER AUDIT [SQL_SRV_AUDIT] WITH (STATE = ON)
GO
Для просмотра событий, попадающих в аудит, можно воспользоваться командой
select top 100 * from fn_get_audit_file ('C:\AUDIT_SQL\*', null, null)
Для теста выполним ряд операций на нашем MS SQL сервере:
- Создадим, изменим, удалим какой-нибудь объект на экземпляре СУБД, например, БД;
- Создадим БД, создадим в ней таблицу, наполним ее несколькими тестовыми строками, выполним команду SELECT из этой таблицы.
Теперь посмотрим, что записалось в журнале аудита с помощью команды:
select * from fn_get_audit_file ('C:\AUDIT_SQL\*', null, null)
Для тонкой настройки под конкретные задачи можно поэкспериментировать с набором DATABASE_OPERATION_GROUP и фильтром классов событий.
Чтение данных из файлов на диске, при необходимости анализа данных аудита ресурсоемко, поэтому я создал БД AUDIT_SQL с одной единственной таблицей и наполнил ее данными из текстовых файлов аудита. Создал ежедневное задание, которое собирает новые данные из текстовых файлов и дописывает их в БД AUDIT_SQL.
В результате мы получили ежедневно наполняемую реляционную БД, данные в которой хранятся нужный период времени (например, 0.5 и очищается она по заданию). Доступ к БД можно предоставить аналитикам.
В заключении хотел бы добавить, что необходимо внимательно изучить список групп событий аудита. Некоторые из них генерируют большое кол-во записей событий, которые требуют очистки средствами фильтра аудита.
Отмечу, что для включения в фильтр исключений по видам событий class_type и action_ID я использовал функции (листинг кода ниже) получения ID этих событий, т.к. в журнал аудита попадает алиас события, а в фильтре нужно указывать ID события.
---------------------------------------------------------
--Функция просмотра class_type
---------------------------------------------------------
create function dbo.GetInt_class_type ( @class_type varchar(2)) returns int
begin
declare @x int
SET @x = convert(int, convert(varbinary(1), upper(substring(@class_type, 1, 1))))
if LEN(@class_type)>=2
SET @x = convert(int, convert(varbinary(1), upper(substring(@class_type, 2, 1)))) * power(2,8) + @x
else
SET @x = convert(int, convert(varbinary(1), ' ')) * power(2,8) + @x
return @x
end
go
---------------------------------------------------------
-- пример использования функции
Select dbo.GetInt_class_type ('A') as Int_class_type
---------------------------------------------------------
--Функция просмотра action_ID
create function dbo.GetInt_action_id ( @action_id varchar(4)) returns int
begin
declare @x int
SET @x = convert(int, convert(varbinary(1), upper(substring(@action_id, 1, 1))))
if LEN(@action_id)>=2
SET @x = convert(int, convert(varbinary(1), upper(substring(@action_id, 2, 1)))) * power(2,8) + @x
else
SET @x = convert(int, convert(varbinary(1), ' ')) * power(2,8) + @x
if LEN(@action_id)>=3
SET @x = convert(int, convert(varbinary(1), upper(substring(@action_id, 3, 1)))) * power(2,16) + @x
else
SET @x = convert(int, convert(varbinary(1), ' ')) * power(2,16) + @x
if LEN(@action_id)>=4
SET @x = convert(int, convert(varbinary(1), upper(substring(@action_id, 4, 1)))) * power(2,24) + @x
else
SET @x = convert(int, convert(varbinary(1), ' ')) * power(2,24) + @x
return @x
end
go
--------------------------------------------------------------------
-- пример использования функции
select dbo.GetInt_action_id('in') as int_action_id
Группа событий | Описание | Включено в MS SQL +/- |
APPLICATION_ROLE_CHANGE_PASSWORD_GROUP | Это событие появляется при изменении пароля для роли приложения. Эквивалентно Audit App Role Change Password Event Class. | + |
AUDIT_CHANGE_GROUP | Это событие возникает при создании, изменении или удалении любого аудита. Это событие возникает при создании, изменении или удалении спецификации любого аудита. Аудит любых изменений в аудите производится в этом аудите. Эквивалентно Audit Change Audit Event Class. | + |
BACKUP_RESTORE_GROUP | Это событие вызывается командой резервного копирования или восстановления.Эквивалент класса событий Audit Backup и Restore. | + |
BROKER_LOGIN_GROUP | Это событие вызывается для составления отчета о сообщениях аудита, связанных с механизмом обеспечения безопасности транспорта компонента Service Broker.Эквивалентно Audit Broker Login Event Class. | — |
DATABASE_CHANGE_GROUP | Это событие вызывается при создании, изменении или удалении базы данных. Это событие возникает при создании, изменении или удалении любой базы данных.Эквивалентно Audit Database Management Event Class. | + |
DATABASE_LOGOUT_GROUP | Это событие возникает при выходе пользователя автономной базы данных из базы данных. | + |
DATABASE_MIRRORING_LOGIN_GROUP | Это событие вызывается для составления отчета о сообщениях аудита, связанных с механизмом обеспечения безопасности транспорта зеркального отображения базы данных. Эквивалентно Audit Database Mirroring Login Event Class. | — |
DATABASE_OBJECT_ACCESS_GROUP | Это событие вызывается каждый раз при обращении к типам сообщений, сборкам и контрактам. Это событие возникает при любом доступе к любой базе данных.Примечание. Это может привести к появлению большого количества записей аудита. | — |
DATABASE_OBJECT_CHANGE_GROUP | Это событие вызывается в тот момент, когда для объекта базы данных (например, для схемы) выполняется инструкция CREATE, ALTER или DROP. Это событие возникает при создании, изменении или удалении любого объекта базы данных. Примечание. Это приводит к очень большому количеству записей аудита. | + |
DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP | Это событие возникает при изменении владельца объекта в области базы данных.Это событие возникает при любом изменении владельца объекта в любой базе данных на сервере. Эквивалентно Audit Database Object Take Ownership Event Class. | + |
DATABASE_OBJECT_PERMISSION_CHANGE_GROUP | Это событие возникает в тот момент, когда для объекта базы данных (например, сборки или схемы) выполняется инструкция GRANT, REVOKE или DENY. Это событие возникает при любом изменении разрешения на объект для любой базы данных на сервере. Эквивалентно Audit Database Object GDR Event Class. | + |
DATABASE_OPERATION_GROUP | Это событие вызывается при выполнении различных операций в базе данных, например при создании контрольной точки или уведомлении о запросе подписки.Это событие возникает при любой операции с базой данных в любой базе данных.Эквивалентно Audit Database Operation Event Class. | + |
DATABASE_OWNERSHIP_CHANGE_GROUP | Это событие вызывается при смене владельца базы данных инструкцией ALTER AUTHORIZATION в момент проверки разрешений на эту операцию. Это событие возникает при любом изменении владельца базы данных в любой базе данных на сервере. Эквивалентно Audit Change Database Owner Event Class. | + |
DATABASE_PERMISSION_CHANGE_GROUP | Это событие возникает в случае, когда инструкции GRANT, REVOKE или DENY выдаются для разрешения на выполнение инструкции любым участником SQL Server(применяется только к событиям базы данных, например предоставлению разрешений на базу данных). | + |
DATABASE_PRINCIPAL_CHANGE_GROUP | Это событие создается при создании, изменении или удалении из базы данных участников, таких как пользователи. Эквивалентно Audit Database Principal Management Event Class. (Также эквивалентно классу событий подсистемы аудита «Add DB Principal», вызываемому устаревшими хранимыми процедурами sp_grantdbaccess, sp_revokedbaccess, sp_addPrincipal и sp_dropPrincipal). | + |
DATABASE_PRINCIPAL_IMPERSONATION_GROUP | Это событие возникает при использовании в области базы данных операции олицетворения, например EXECUTE AS <субъект> или SETPRINCIPAL. Это событие возникает при использовании олицетворения в любой базе данных. Эквивалентно Audit Database Principal Impersonation Event Class. | + |
DATABASE_ROLE_MEMBER_CHANGE_GROUP | Это событие вызывается каждый раз, когда имя входа добавляется в роль базы данных или удаляется из нее. Этот класс событий вызывается хранимыми процедурами sp_addrolemember, sp_changegroup и sp_droprolemember. Это событие появляется при изменении члена любой роли базы данных в любой базе данных.Эквивалентно Audit Add Member to DB Role, класс событий. | + |
DBCC_GROUP | Это событие появляется при вызове участником любой команды DBCC.Эквивалентно Audit DBCC Event Class. | + |
FAILED_DATABASE_AUTHENTICATION_GROUP | Указывает, что попытка участника войти в автономную базу данных завершилась ошибкой. События этого класса вызываются новыми соединениями или соединениями, которые многократно используются в пуле соединений.Эквивалентно Audit Login Failed Event Class. | — |
FULLTEXT_GROUP | Указывает, что произошло полнотекстовое событие. Эквивалентно Audit Fulltext Event Class. | — |
LOGIN_CHANGE_PASSWORD_GROUP | Это событие появляется при изменении пароля входа с помощью инструкции ALTER LOGIN или хранимой процедуры sp_password. Эквивалентно Audit Login Change Password Event Class. | + |
LOGOUT_GROUP | Указывает, что участник отключился от SQL Server. События этого класса вызываются новыми соединениями или соединениями, которые многократно используются в пуле соединений. Эквивалентно Audit Logout Event Class. | + |
SCHEMA_OBJECT_ACCESS_GROUP | Это событие возникает при применении разрешения на объект в схеме.Эквивалентно Audit Schema Object Access Event Class. | — |
SCHEMA_OBJECT_CHANGE_GROUP | Это событие вызывается в момент выполнения для схемы операции CREATE, ALTER или DROP. Эквивалентно Audit Schema Object Management Event Class. | + |
SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP | Это событие возникает при проверке разрешений на смену владельца объекта схемы (таблицы, процедуры, функции и т. д.). Возникает, когда объекту назначается владелец при помощи инструкции ALTER AUTHORIZATION. Это событие возникает при любом изменении владельца схемы в любой базе данных на сервере.Эквивалентно Audit Schema Object Take Ownership Event Class. | + |
SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP | Это событие возникает при выполнении инструкции GRANT, REVOKE или DENY для объекта схемы. Эквивалентно Audit Schema Object GDR Event Class. | + |
SERVER_OBJECT_CHANGE_GROUP | Это событие возникает при выполнении операций CREATE, ALTER или DROP с объектами сервера. Эквивалентно Audit Server Object Management Event Class. | + |
SERVER_OBJECT_OWNERSHIP_CHANGE_GROUP | Это событие возникает при изменении владельца объектов в области сервера.Эквивалентно Audit Server Object Take Ownership Event Class. | + |
SERVER_OBJECT_PERMISSION_CHANGE_GROUP | Это событие возникает в случае, когда инструкции GRANT, REVOKE или DENY выдаются для разрешений на объекты сервера любым участником SQL Server.Эквивалентно Audit Server Object GDR Event Class. | + |
SERVER_OPERATION_GROUP | Это событие возникает при использовании таких операций аудита безопасности, как изменение параметров, ресурсов, внешнего доступа или авторизации. Эквивалентно Audit Server Operation Event Class. | — |
SERVER_PERMISSION_CHANGE_GROUP | Это событие возникает в случае, когда инструкции GRANT, REVOKE или DENY выдаются для разрешений в области действия сервера. Эквивалентно Audit Server Scope GDR Event Class. | + |
SERVER_PRINCIPAL_CHANGE_GROUP | Это событие возникает при создании, изменении и удалении участников на уровне сервера. Эквивалентно Audit Server Principal Management Event Class. | + |
SERVER_PRINCIPAL_IMPERSONATION_GROUP | Это событие возникает при использовании в области действия сервера олицетворения, например команды EXECUTE AS <имя_для_входа>. Эквивалентно Audit Server Principal Impersonation Event Class. | + |
SERVER_ROLE_MEMBER_CHANGE_GROUP | Это событие появляется при добавлении или удалении имени входа из предопределенной роли сервера. Это событие вызывается хранимыми процедурами sp_addsrvrolemember и sp_dropsrvrolemember. Эквивалентно Класс событий Audit Add Login to Server Role. | + |
SERVER_STATE_CHANGE_GROUP | Это событие возникает при изменении состояния службы SQL Server . Эквивалентно Audit Server Starts and Stops Event Class. | + |
SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP | Указывает, что участник успешно выполнил вход в автономную базу данных. | + |
SUCCESSFUL_LOGIN_GROUP | Указывает, что участник успешно выполнил вход на SQL Server. События этого класса вызываются новыми соединениями или соединениями, которые многократно используются в пуле соединений. Эквивалентно Audit Login Event Class. | + |
TRACE_CHANGE_GROUP | Это событие вызывается для всех инструкций, выполняющих проверку на разрешение ALTER TRACE. Эквивалентно Audit Server Alter Trace Event Class. | + |
TRANSACTION_GROUP | Это событие вызывается для операций BEGIN TRANSACTION, ROLLBACK TRANSACTION и COMMIT TRANSACTION как при явных вызовах этих инструкций, так и при неявных операциях с транзакциями. Это событие также вызывается для операций UNDO при использовании отдельных инструкций, вызванных откатом транзакции. | — |
USER_CHANGE_PASSWORD_GROUP | Это событие возникает при изменении пароля пользователя автономной базы данных с помощью инструкции ALTER USER. | + |
USER_DEFINED_AUDIT_GROUP | Эта группа наблюдает за событиями, вызываемыми с помощью процедуры sp_audit_write (Transact-SQL). Как правило, триггеры или хранимые процедуры включают вызовы процедуры sp_audit_write для включения аудита важных событий. | — |