Начну серию публикаций по мониторингу сетей, серверов, сервисов, устройств и прочего в сети.
В данных статьях я приведу самые основные проблемы и пути их решения. На осове этих данных функционал легко расширяется до тех тербований, который Вам необходимы.
Начну пожалуй с мониторинга посредством PowerShell. Учитывая, что сейчас для всех ОС, начиная с Windows Server 2003 R2 и Windows XP SP3 доступен Powershell. Думаю, что данная статья окажется полезным подспорьем, т.к. не требует от администратора введения никаких дополнительных средств, т.е. по сути – мониторинг штатными средствами.
В следующих статьях я раскажу о том как централизованно мониторить сетевые устройства, сервисы, загрузку каналов связи и прочего. Так по возможности буду дополнять уже к опубликованным постам дополнительные материалы, которые так или иначе помогут более детально вникнуть в суть проблемы, либо расширить функционал имеющегося.
Итак начнем.
Первое, с чего хотелось бы начать, это пресловутый мониторинг за Active Directory.
На всех блог-комьюнити посвященных IT можно встретить множество статей по мониторингу AD, но… но больше 90% из них посвящены использованию сторонних приложений, в большинстве своем стоящих определенную сумму денег, которую не каждое предприятие готово отдать, пусть даже не большую. Наверное рекордсмен по количеству статей – это продукт от компании NetWrix Corporation. Тут и там IT-специалисты расписывают замечательные возможности данной программы. Да чего греха таить, и сам пользовался данной программой в демо-режиме. Честно скажу – понравилась, все просто и доступно, но денег на нее не дают, а значит к концу демо-периода AD снова останется без “зоркого” глаза. Что меня в корне не устраивало.
Т.к. мы правильные ITшники, то попытаемся сами сделать себе такой «зоркий» глаз.
Немного тоерии.
Как известно в политиках безопасности в ОС Windows всех мастей есть возможность вести аудит событий. Данный аудит позволяет автоматически генерировать записи в Event Log в журнале “Безопасность”. Аудит можно вести за несоколькими типами событий, например: вход в систему, доступа к обьектам, управлениями учетными записями, изменения политик и прочее. Всего 9 типов событий. Это базовый аудит. Начиная с Windows 7 и Windows Server 2008R2 уоличество событий аудита возросло до 53. С помощью которых можно более детально вести аудит только нужных событий. БОлее подробную информацию по расширенным политикам аудита можно прочитать на .
Но как известно тем, кто хоть раз заглядывал в EventLog в раздел безопасности – найти там что либо – если и не невозможно, то по крайней мере очень сложно.
И тут родилась идея… раз Windows умеет создавать запись в EventLog о произошедшем событии, значит теоретически данную инфорацмию можно получить. Одно “но”… уж больно большой этот лог, чтобы в нем искать нужное событие вручную, да и со временем если не ограничить размер лога, он может разрастись в десятки гигабайт, что само по себе уже не хорошо. Значит необходимо решить проблему по поисук нужной информации в EventLog’е автоматически. Благо, что каждый тип события (например создание учетной записи пользователя) имеет свой ID, по которому его можно найти.
Значит для решения задачи поиска нам нужно всего лишь отыскать данное событие в журнале.
Для Powershell 2.0 есть специальный командлет для работы с EventLog’ом – Get-WinEvent.
Используя данный командлет можно получить определенную запись в EventLog’е.
Допустим мы указали в групповых политиках, которые применяются на контроллеры домена, вести аудит событий связанных с учетными записями.
Тогда любое действие с учетной записью, заведенной в AD, будет генерировать событие, которое будет будет создавать запись в EventLog с определенным идентификатором. Например при добавлении в домен компьютера на контроллере домена, где производилась эта операция, в EventLog’е в журнале “Безопасность” появится запись с идентификатором ID=4741, в которой будет указано в какое время, кто и какой компьютер добавил в домен.
Для получения последнего события с данных идентификатором возмользуемся запросом Powershell:
Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741}
Но формат вывода к сожалению желает оставлять лучшего, т.к. очень много лишней информации, такой как идентификаторы безопасности, куча атрибутов.
TimeCreated : 12.07.2012 14:02:19
ProviderName : Microsoft-Windows-Security-Auditing
Id : 4741
Message : Создана учетная запись компьютера.
Субъект:
Идентификатор безопасности: S-1-5-21-451469775-2953165952-2320738315-500
Имя учетной записи: administrator
Домен учетной записи: DOMAIN
Идентификатор входа: 0xb3acf
Новая учетная запись компьютера:
Идентификатор безопасности: S-1-5-21-451469775-2953165952-2320738315-2979
Имя учетной записи: TEST$
Домен учетной записи: DOMAIN
Атрибуты:
Имя учетной записи SAM: TEST$
Отображаемое имя: -
Основное имя пользователя: -
Домашний каталог: -
Домашний диск: -
Путь к сценарию: -
Путь к профилю: -
Рабочие станции пользователя: -
Последний пароль задан: <никогда>
Срок действия учетной записи истекает: <никогда>
Идентификатор основной группы: 515
Разрешено делегировать: -
Старое значение UAC: 0x0
Новое значение UAC: 0x85
Управление учетной записью пользователя:
Учетная запись отключена
"Пароль не требуется" - включено
"Учетная запись доверия рабочей станции" - включено
Параметры пользователя: -
Журнал SID: -
Часы входа: <значение не задано>
DNS-имя узла: -
Основные имена служб: -
Дополнительные сведения:
Privileges -
Нас же интересует самая основная информация: Время, кто создал, имя компьютера. Для этого “немного” подправим наш запрос:
Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}}
В итоге результатом данного запроса станет уже удобная для глаза информация:
TimeCreated : 12.07.2012 14:02:19
Оператор : administrator
Имя компьютера : TEST$
Данный запрос рассматривает событие в EventLog’у как XML объект. И выбирает нужные нам значения, т.е. время (TimeCreated), Оператора и Имя компьютера.
Рассмотрим поподробнее запрос.
Если открыть любою запись в EventLog’е, то Вы увидите 2 закладки: Общие и подробности.
Если перейти на вкладку “подробности” и выбрать режим просмотра: “Режим XML”, то увидим как раз таки структуру события в виде XML.
Распарсив данное событие как XML и выбрав оттуда необходимые нам значения: В разделе Event.EventData.Data в параметре под именем SubjectUserName скрывается имя пользователя который создал компьютер, а в параметре под именем SamAccountName – имя созданного компьютера.
Теперь нужно куда то вывести эту информацию, не хранить же ее в консоли.
А еще лучше если она будет отсылаться администратору, скажем, на почту.
В Powershell 2.0 есть возможность консольно устанавливать SMTP сессии и отправлять письма.
Send-MailMessage– командлет который выполняет данную функцию.
Для отправки сообщения нем необходимо указать SMTP-сервер, адрес отправителя, адрес получателя, тело письма, тему письма, имя пользователя и пароль.
В итоге получим следующий запрос, который будет искать последнее событие под идентификатором ID=4741 и отправлять на почту администратору информацию.
#Определяем все переменные для отправки
$Theme = “Добавлен новый компьютер в домен” # Первая строчка в теле письма, чтобы понимать о чем речь.
$Subject = “Создание компьютера” # Тема сообщения
$Server = “mail.domain.ru” # SMTP Сервер
$From = “audit@domain.ru” # Адрес отправителя
$To = “admin@domain.ru” # Получатель
$pass = ConvertTo-SecureString “PASSWORD” -AsPlainText -Force #Пароль от учетной записи
$cred = New-Object System.Management.Automation.PSCredential(“AUDIT” , $pass) #Имя пользователя и пароль
$encoding = [System.Text.Encoding]::UTF8 #Устаналиваем кодировку UTF8 для корректного отображения информации в теле письма
#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID. Данные записываются в переменную Body.
$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
#Отправка письма.
Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Credential $cred -Encoding $encoding
Сохраняем данный скрипт в файл с расширением ps1, например сюда: D:ScriptsADCompAdd.ps1
Открываем консоль Powershell.
Набираем команду: Set-ExecutionPolicy Unrestricted
Жмем “Y” и Enter. Тем самым мы разрешаем выполнение Powershell-скриптов на сервере.
Перетаскиваем скрипт в консоль (Drag and Drop) и жмем Enter. Проверяем, что скрипт выполнился без ошибок (т.е. в консоли никаких надписей красного цвета не появилось). Проверяем почту на наличие нового сообщения, которое содержит в себе необходимые нам данные.
Осталось только как то заставить запускаться данный скрипт в момент когда событие произошло.
Тут нам на помощь придет “Планировщик заданий”.
В планировщике есть возможность реакции на определенное событие в EventLog.
Создаем задание, где в тригере указываем реагировать на событие под номером 4741 которые появляется в журнале Security.
Так же указываем что необходимо запустить данный скрипт. Для этого указываем в “действиях”, что хотим запустить программу, в поле “Программа или сценарий” пишем “powershell”. В поле “Добавить аргументы (необязательно)” пишем ” -nologo -noprofile -File “D:ScriptsADCompAdd.ps1″ ”
Теперь тестируем как работает созданная структура. Создаем тестовый компьютер в любом подразденении в AD. И проверяем почту на наличие сообщения.
Скрипт не совсем безопасен т.к. содержит в себе имя пользователя и пароль в открытом виде, поэтому настоятельно рекомендую, если решите воспользоваться данным скриптом, то используйте учетные записи для отправки сообщений с минимальным набором прав.
По моим замерам время реакции на событие 1 секунда. Т.е. со времени создания до получения письма проходит 1 секунда. Конечно при суловии, что вы используете свой локальный почтовый сервер, а не где нибудь в Интернете. Там задержка может быть больше. Но в целом тоже не высокая.
В итоге взяв за основу данный скрипт и изменив в нем номер события и данные которые необходимо доставать из события, можно осуществлять мониторинг за всеми операциями с учетными записями в AD: создание-удаление, отключение-включение, блокировки-разблокировки., добавления в группы и исключения и прочее. Вобщем любой мониторинг событий, который позволяет вести аудит Windows. Просто необходимо изменить фильтр XML в запросе, для этого посмотреть неоходимое событие в XML-режиме, выбрать необходимые значения и вписать их в фильтр запроса.
PS:
Вот некоторые полезные идентификаторы событий для Windows Server 2008R2:
ID=4741 Создание компьютера в домене
ID=4743 Удаление компьютера из домена
ID=4728 Доббавление в группу безопасности
ID=4729 Удаление из группы безопасности
ID=4720 Создание пользователя
ID=4726 Удаление пользователя
ID=4740 Блокировка учетной записи
ID=4767 Разблокировка учетной записи
ID= 4722 Включение учетной записи
ID=4725 Отключение учетной записи
Автор: Deks