В передыдущем посте я опубликовал свой первый пост на хабре. Сам себе задал тематику своих первых постов. И в продолжении темы собрался написать вторую часть.
В комментариях к первой части я вскользь упомянул о том, что расширил функционал скриптов мониторинга за нелегальными подключениями к серверам. В частности добавил уведомления в сервис мгновенных сообщений XMPP (Jabber), а так же запись лога в отдельный текстовый файл.
Мгновенное оповещение.
Чем хороши мгновенные оповещения, так это тем, что нет необходимости постоянно проверять почту на предмет новых сообщений — сообщения приходят сами и дают о себе знать сразу же (В зависимости от настроек клиента, конечно же).
Лично для себя я сделал, чтобы сообщения открывались поверх всех окон. Конечно, чтобы не заспамит самого себя, такие оповещения отсылаются на критически важные события.
К критически важным я отнес: неудачные попытки входа на контроллеры домена, неудачные попытки входа на сервис VPN (PPTP на WIndows). Так же добавил эту функцию в скрипты мониторинга за AD. Т.к. у меня доступ к AD имеют несколько человек, то со временем можно потерять нить актуальных данных (что-то, когда-то, кого-то удалил/переместил/добавил а ты и не вкурсе). И данные сообщения будут как раз кстати, чтобы в реальном времени знать об изменениях.
Поиски решения
Когда мне пришла идея о таком роде оповещения (учитывая тот факт, что у нас в организации достаточно активно используется Jabber-сервис) первое что я сделал, это забил к гугл Powershell Jabber. Первой же ссылкой меня отправило на сайт не безызвестного на просторах форумов Microsoft Technet Xaerg'а. То что я там увидел меня не могло не порадовать: «А знаете ли вы, что оснастка NetCmdlets, включающая командлеты для работы с огромным количеством сетевых протоколов, доступна совершенно бесплатно для некоммерческого использования?»
И приводится список доступных команд. «Это то что мне нужно, да еще и бесплатно!!!» — подумал я и огорчился когда прошел на сайт разработчика этой оснастки командлетов, оказывается у них нет бесплатной версии, есть только триальная на 1 месяц, после чего нужно вновь запрашивать ключ. Только после этого я обратил внимание на дату статьи, она оказалась 2008 года – старовата :(.
Ради эксперимента скачал триальную версию. Установил на сервер, на котором хочу использовать оповещения. Установка прошла на УРА. Сразу же стали доступны новые коммандлеты. Синтаксис у них довольно простой и с отправкой сообщений проблем не возникло. Какое-то время я так и использовал эту триальную лицензию, раз в месяц ее перерегистрировав. Но само ощущение, что используешь триальную версию меня угнетало, еще больше угнетал тот факт, что необходимо ее каждый месяц регистрировать для каждого сервера, где она установлена. А так как в инфраструктуре на тот момент присутствовало чуть менее 30 серверов, даже мысль о перегистрации хоть раз в месяц на всех серверах приводила меня в ужас.
Когда со временем стало посвободнее, я решил добить эту идею. Необходимо было средство, позволяющее посредством Powershell, отправлять сообщения, используя протокол XMPP. При этом важным фактором должно быть условия использования данного средства — оно должно быть бесплатным.
Я снова начал мучить гугл. И мои усилия не пропали даром. В один прекрасный клик я попал на страничку с утилитой, которая как раз таки позволяет отправлять сообщения из PS-консоли, используя XMPP-протокол.
Особенно меня порадовала надпись, красующаяся в заголовке страницы: Project Hosting for Open Source Software. Что наталкивало меня на мысль, что данный продукт бесплатен в использовании — как раз то, что мне нужно.
Тут же на странице присутствует пример использования.
Скачав архив с библиотекой, новички сразу же зададутся вопросом: «А как скормить ее PowerShell'у?»
Хотя на странице продукта автор прямо говорит о том, что: "don't forget you have to put both DLLs in the same place, and use InstallUtil PoshXmpp.dll and Add-PsSnapin PoshXmpp to get PoshXmpp loaded and ready", мол не забудьте поместить обе библиотеки в одно место и использовать загадочную команду:
InstallUtil PoshXmpp.dll
а за ней еще одну:
Add-PsSnapin PoshXmpp
Проблема может возникнуть при выполнении первой команды. Для решения этой проблемы воспользуйтесь следующей командой, которая создает алиас с именем InstallUtil, который указывает на утилиту, присутствующую во Framework'е.
Для 64-разрядных ОС:
Set-Alias InstallUtil C:WindowsMicrosoft.NETFramework64v2.0.50727installutil.exe
Для 32х:
Set-Alias InstallUtil C:WindowsMicrosoft.NETFrameworkv2.0.50727installutil.exe
После этого смело используйте обе команды, которые рекомендует автор.
После этого возможно использовать функционал по отправке Jabber-сообщений прямо из консоли PS.
Возможная проблема при отправки сообщения на собственные Jabber-сервисы в домене
Т.к. при отправке сообщения, используя библиотеку PoshXmpp, и набрав команду New-Client в ее свойствах вы не увидите возможности указать специфичный адрес сервера. Т.е. адрес сервера берется из домена пользователя (напр.: audit@domain.ru), от имени которого Вы пытаетесь открыть подключение к XMPP-сервису.
Если Jabber-сервис у вас установлен на контроллер домена, то проблемы Вы не почувствуете.
Однако если у Вас данный сервис расположен где-то в сети, на рядовом сервере, то попытавшись найти сервер по имени домена, он будет пытаться подключиться к серверу domain.ru, и выдаст ошибку, что не может подключиться. Пропингуйте адрес своего домена, и Вы попадете на контроллер домена — именно поэтому для тех, у кого сервис на контроллере домена, проблемы не будет.
Для всех остальных решением проблемы будет указание нахождения службы XMPP на DNS-сервере:
Создайте соответствующие SRV-записи на своем DNS-сервере, вида:
_xmpp-server._tcp.im.domain.ru
_xmpp-client._tcp.im.domain.ru
Где соответственно im.vostoc.ru — имя вашего сервера XMPP.
После этого любой Jabber-клиент будет автоматически находить XMPP-службу у Вас в сети, без явного указания сервера.
Аудит неудачных попыток входа на сервер, с оповещением по электронной почте, Jabber-сервису, и записью в лог-файл.
#Поиск последней записи в WIndowsEventLog на предмет неудачной попытки входа на сервер, и запись значения в переменную Body
$HostName = HostName
$Body=Get-WinEvent -FilterHashtable @{LogName="Security";ID=4625} | Select TimeCreated,@{n="User";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "TargetUserName"} | %{$_.'#text'}}},@{n="ComputerName";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "WorkstationName"}| %{$_.'#text'}}},@{n="IPAddress";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "IPAddress"}| %{$_.'#text'}}} | select-object -first 1
#$BodyL - переменная для записи в текстовый лог-файл
$BodyL = "`n"+$Body.TimeCreated +"`t"+ $Body.User +"`t"+ $Body.ComputerName +"`t"+ $Body.IPAddress
#$Body - переменная для тела письма при отправке сообщения на почту и Jabber
$Body = "`nВремя: "+$Body.TimeCreated +"`nИмя пользователя: "+ $Body.User +"`nКомпьютер-источник: "+ $Body.ComputerName +"`nIP источника: "+ $Body.IPAddress
#$Theme - тема письма. $Hostname - имя сервера
$Theme = "Неудачный вход в систему на "+$hostname
#Отправка Jabber-сообщения
Add-PSSnapin poshxmpp
new-client -JabberId AUDIT@domain.ru -Password PASSWORD
Send-Message admin@domain.ru "$Theme $Body"
$PoshXmppClient.Close()
#Описание переменных для отправки e-mail сообщения о инциденте
$Subject = "Неудачный вход в систему на "+$hostname
$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
#Отправка e-mail
Send-MailMessage -From $From -To $To -SmtpServer $server -Body "$Theme `n$Body" -Subject $Subject -Credential $cred -Encoding $encoding
#Запись данных в текстовый лог-файл FaildConnect.txt
$BodyL | out-file "\ServerNameServerLogFilesServerFaildConnect.txt" -append
Как я писал в первой части, чтобы скрипт автоматически отрабатывал необходимо поместить его в планировщик задач и настроить запуск данного скрипта при обнаружении в EvenLog события с ID = 4625в журнале Security.
Рекомендации.
Именно подобные скрипты у меня работают на VPN-сервере и на всех контроллерах домена.
Теперь я всегда знаю, когда и кто подключается к VPN, например. Или когда кто-то пытается подобрать пароль на доступ к серверу.
Так же рекомендую навесить такой скрипт на те сервисы, которые «светятся» в Интернет, к примеру службы терминального доступа.
А запись в отдельный файл, позволит Вам, в будущем, проанализировать подключения. Лог, кстати говоря, можно открыть через табличный редактор (MS Excel или OO Calc) и уже работать с логом как с таблицей (сортировать, фильтровать и т.д.).
Автор: Deks
Доброго времени суток. Я знаю что прошло 6 лет. =) Но может быть вы подскажете, в силу того что у вас самое полное руководство, в отличие от других вариантов в сети.
Суть в чём на WS 2012 R2, эта утилита отказывается работать. Ссылаясь на “Переполнение в результате выполнения арифметической операции” при запуске из Powershell. На 2008 R2 все ок. Заранее благодарю, если подскажете или предложите аналог.
Необходимо запускать Windows PowerShell (x86), тогда всё работает.
Проверенно на Windows 2012 R2 и OpenFire 4.3.2.