AuditObjectAccess (служба Windows)

Источник: t-sql

Аудит доступа к объектам на файловых серверах - это одна из головных болей администратора. Как часто к вам вбегает взлохмаченный пользователь и в панике спрашивает, кто удалил важный файл с сетевого ресурса? Думаю, бывает…
Я предлагаю свой способ логирования этих событий, в виде службы 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) Создаём БД для аудита:

 
01.USE master
02.GO
03.  
04.IF DB_ID('AuditObjectAccess') IS NOT NULL DROP DATABASE AuditObjectAccess
05.GO
06.  
07.CREATE DATABASE AuditObjectAccess
08.GO
09.  
10.USE AuditObjectAccess
11.GO
12.  
13.IF OBJECT_ID('Events', 'U') IS NOT NULL DROP TABLE Events
14.GO
15.  
16.--Таблица Аудита
17.CREATE TABLE Events
18.(
19.id INT IDENTITY,
20.[Index] INT,
21.TimeGenerated DATETIME,
22.Source VARCHAR(255),
23.Category VARCHAR(255),
24.EventID VARCHAR(255),
25.UserName VARCHAR(255),
26.MachineName VARCHAR(255),
27.Message VARCHAR(max),
28.Mask VARCHAR(max),
29.DateAt DATETIME default GETDATE(),
30.HostAt VARCHAR(255) default HOST_NAME(),
31.UserAt VARCHAR(255) default ORIGINAL_LOGIN()
32.)
33.GO
34.  
35.IF OBJECT_ID('AddEvent', 'P') IS NOT NULL DROP PROCEDURE AddEvent
36.GO
37.  
38.--Процедура на добавление новой записи-события
39.CREATE PROCEDURE AddEvent
40.(
41.@index INT =null,
42.@TimeGenerated DATETIME =null,
43.@Source VARCHAR(255) =null,
44.@Category VARCHAR(255) =null,
45.@EventID VARCHAR(255) =null,
46.@UserName VARCHAR(255) =null,
47.@MachineName VARCHAR(255)= null,
48.@Message VARCHAR(max)= null,
49.@Mask VARCHAR(max)=null
50.)
51.  
52.AS
53.  
54.SET NOCOUNT ON
55.  
56.INSERT INTO Events
57.(
58.[Index],
59.TimeGenerated,
60.Source,
61.Category,
62.EventID,
63.UserName,
64.MachineName,
65.[Message],
66.Mask
67.)
68.  
69.SELECT
70.@Index,
71.@TimeGenerated,
72.@Source,
73.@Category,
74.@EventID,
75.@UserName,
76.@MachineName,
77.@Message,
78.@Mask
79.  
80.GO

2) Теперь создадим в реестре несколько записей для работы службы (settings.reg-файл находится в архиве вместе с ЕХЕ-шником службы):
TimeOut-время (мс), через которое служба читает журнал
EventID-событие, у нас это значение = 560
Mask тот самый 15-ый параметр, если значение равно нулю (0), то записываем все привилегии.
MachineName-имя сервера на котором читаем журнал (. - локальный компьютер)
ConnectionString-строка коннекции к серверу БД, где храним наши записи.

3) Устанавливаем саму службу:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil AuditObjectAccess.exe


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22767