Аудит Active Directory средствами Powershell с оповещением об изменениях. Часть 2

  • Tutorial

В передыдущей статье я опубликовал свой первый пост на хабре. В продолжении темы собрался написать вторую часть.

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

Аудит неудачных попыток входа на сервер, с оповещением по электронной почте, 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) и уже работать с логом как с таблицей (сортировать, фильтровать и т.д.).
  • +13
  • 13k
  • 9
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 9

    0
    И опять открытые пароли :)
    Интересна часть про XMPP, буду использовать дальше в своих проектах.
      0
      Да… пароли нужно будет спрятать, как Вы предлагали в прошлом посте…
      Обязательно сделаю чуть позже)
      0
      Кстати,
      $Theme = «Неудачный вход в систему на „+$hostname и т.д.
      плохо смотрится, лучше
      $Theme = “Неудачный вход в систему на $hostname»
      Двойные кавычки разрешают расширять строку
        0
        Кастати да.
        0
        >>Лог, кстати говоря, можно открыть через табличный редактор (MS Excel или OO Calc) и уже работать с логом как с таблицей (сортировать, фильтровать и т.д.).
        А можно и не открывать, а воспользоваться Output-GridView. ;)
          0
          о! неплохая штука. Не встречал. Спасибо. Обазательно запомню.
          0
          а еще можно управляющие интерфейсы серверов — ipmi, ilo, ssh, rdp и т.п. вынести в отдельную подсеть/влан и разрешить доступ только с рабочих станций администраторов учёткам администраторов.

          А в целом идея хорошая, спасибо.
            0
            Как раз думал что бы еще прикрутить к своей системе мониторинга будущей
              0
              Конечно же, там где возможно в целях безопасности выделяют отдельный менеджмент влан. Но к сожалению не ко всему применимо, т.к. есть общедоступные сервисы, которые некоторым кажутся «заманчивыми»:)

            Only users with full accounts can post comments. Log in, please.