Мониторинг всего и вся в сети. Часть 2

в 4:33, , рубрики: powershell, Серверное администрирование, системное администрирование, метки: ,

Мониторинг всего и вся в сети. Часть 2
В передыдущем посте я опубликовал свой первый пост на хабре. Сам себе задал тематику своих первых постов. И в продолжении темы собрался написать вторую часть.

В комментариях к первой части я вскользь упомянул о том, что расширил функционал скриптов мониторинга за нелегальными подключениями к серверам. В частности добавил уведомления в сервис мгновенных сообщений 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


  1. Acronym:

    Доброго времени суток. Я знаю что прошло 6 лет. =) Но может быть вы подскажете, в силу того что у вас самое полное руководство, в отличие от других вариантов в сети.

    Суть в чём на WS 2012 R2, эта утилита отказывается работать. Ссылаясь на “Переполнение в результате выполнения арифметической операции” при запуске из Powershell. На 2008 R2 все ок. Заранее благодарю, если подскажете или предложите аналог.

    • Alex:

      Необходимо запускать Windows PowerShell (x86), тогда всё работает.
      Проверенно на Windows 2012 R2 и OpenFire 4.3.2.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js