Аудит доступа к объектам на файловых серверах - это одна из головных болей администратора. Как часто к вам вбегает взлохмаченный пользователь и в панике спрашивает, кто удалил важный файл с сетевого ресурса?
Думаю, бывает...
Я предлагаю свой способ логирования этих событий, в виде службы Windows и хранением истории в БД MS SQL Server.
Сперва в политиках включаем Аудит на доступ к объектам ("Control Panel -> Administrative Tools - > Local Security Settings")
Затем на папках, за которыми мы будем "следить", включаем аудит (допустим только удаление)
После этого, при удалении файла, в журнале событий Windows (Security) появляется соответствующая запись (EventID=560)
Прежде, чем приступить к установке моей службы, опишу на какой параметр необходимо смотреть (http://support.microsoft.com/kb/299475/ru):
Код события: 560 (0x0230)
Тип: Аудит успехов
Описание: Открытие объекта
Сервер объекта: %1 Тип объекта: %2
Имя объекта: %3 Код дескриптора: %4
Код операции:{%5,%6} Код процесса: %7
Основной пользователь: %8 Основной домен: %9
Основной код входа: %10 Пользователь-клиент: %11
Домен клиента: %12 Код входа клиента: %13
Доступ %14 Привилегии %15
Нам необходимо отслеживать 15-ый параметр "Привилегии".
Вот список основных значений этого параметра:
- 1537 = Delete
- 1538 = Read_CONTROL
- 1541 = synchronize
- 4416 = ReadData(or List Directory)
- 4417 = WriteData(or Add File)
- 4418 = AppendData (or AddSubdirectory or CreatePipeInstance)
- 4419 = ReadEA
- 4420 = WriteEA
- 4423 = ReadAttributes
- 4424 = WriteAttributes.
На этом теории хватит. Приступаем к установке службы:
1) Создаём БД для аудита:
USE master
GO
IF DB_ID('AuditObjectAccess') IS NOT NULL DROP DATABASE AuditObjectAccess
GO
CREATE DATABASE AuditObjectAccess
GO
USE AuditObjectAccess
GO
IF OBJECT_ID('Events', 'U') IS NOT NULL DROP TABLE Events
GO
--Таблица Аудита
CREATE TABLE Events
(
id INT IDENTITY,
[Index] INT,
TimeGenerated DATETIME,
Source VARCHAR(255),
Category VARCHAR(255),
EventID VARCHAR(255),
UserName VARCHAR(255),
MachineName VARCHAR(255),
Message VARCHAR(max),
Mask VARCHAR(max),
DateAt DATETIME default GETDATE(),
HostAt VARCHAR(255) default HOST_NAME(),
UserAt VARCHAR(255) default ORIGINAL_LOGIN()
)
GO
IF OBJECT_ID('AddEvent', 'P') IS NOT NULL DROP PROCEDURE AddEvent
GO
--Процедура на добавление новой записи-события
CREATE PROCEDURE AddEvent
(
@index INT =null,
@TimeGenerated DATETIME =null,
@Source VARCHAR(255) =null,
@Category VARCHAR(255) =null,
@EventID VARCHAR(255) =null,
@UserName VARCHAR(255) =null,
@MachineName VARCHAR(255)= null,
@Message VARCHAR(max)= null,
@Mask VARCHAR(max)=null
)
AS
SET NOCOUNT ON
INSERT INTO Events
(
[Index],
TimeGenerated,
Source,
Category,
EventID,
UserName,
MachineName,
[Message],
Mask
)
SELECT
@Index,
@TimeGenerated,
@Source,
@Category,
@EventID,
@UserName,
@MachineName,
@Message,
@Mask
GO
2) Теперь создадим в реестре несколько записей для работы службы (settings.reg-файл находится в архиве вместе с ЕХЕ-шником службы):
- TimeOut-время (мс), через которое служба читает журнал
- EventID-событие, у нас это значение = 560
- Mask тот самый 15-ый параметр, если значение равно нулю (0), то записываем все привилегии.
- MachineName-имя сервера на котором читаем журнал (. - локальный компьютер) ConnectionString-строка коннекции к серверу БД, где храним наши записи.
3) Устанавливаем саму службу: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil AuditObjectAccess.exe
Загрузить установочный архив: AuditObjectAccess.rar
Утилита для работы с логами: http://www.t-sql.ru/post/AuditObjectAccessViewer.aspx