Powershell for Windows

21.06.2011

Парсинг журнала безопасности терминал-сервера. Успех входа, Отказ входа в систему.

Filed under: PowerShell, Security, Windows — Метки: , , , , , , , , , — Yamshikov Pavel @ 1:02 пп

Для получения списка событий журнала security нам понадобится командлет Get-EventLog.

image

Команда отображает содержимое всего журнала, что в корне нас не устраивает. Но все не так плохо, то что мы видим на скриншоте, не просто текст, а объекты с свойствами. Получить свойства данных объектов позволяет комадлет Get-Member. Выполнив в командной строке Get-EventLog security | Get-Member, мы получим в результате список свойств всех объектов выводимых Get-EventLog.

image

Зная список свойств, можно манипулировать результатами работы Get-EventLog. Например, что бы получить список всех событий за сегодняшний день, самым простым способом будет использование параметра -after. Полный список параметров командлета Get-EventLog можно узнать используя командлет Get-Help или здесь. В результате у нас получится команда Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0), где командлет Get-Date выдает текущую дату и время, но параметры hour, minute и second задают вывод времени с начала текущего дня. В результате мы получим список событий произошедших за сегодня.
Нам необходимо получить список всех пользователей совершавших вход на сервер по протоколу RPD, для этого используем значения EventID и EntryType.

Значения EventID

  • 528 — Успешный вход пользователя на компьютер.
  • 529 — Отказ входа в систему. Не правильное имя пользователя или пароль.

Значения EntryType

  • 10 — RemoteInteractive. Пользователь выполнил удаленный вход на этот компьютер, используя Terminal Services или Remote Desktop.

От фильтруем события из дополнив команду новыми вводными:
Get-EventLog security -message "*Тип входа:?10*" -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 528}

Параметр -message отражает полностью сообщение нашего события, в котором содержится «Entry type» («Тип входа»), через шаблоны мы задаем поиск интересующей нас строки. Далее передаем ч\з конвейер командлету Where-Object (?) для фильтрации сообщений «Успешного входа пользователя в систему». Для фильтрации сообщений «Отказа входа в систему"{$_.eventid -eq 528} заменить на {$_.eventid -eq 529}.

Результатом выполнения будет следующее:

image

Пойдем дальше, создадим файл-срипт»test.ps1″.

# В переменную "$Events" загружаем массив событий "Удаленного успешного входа в систему"
$Events = Get-EventLog security -message "*Тип входа:?10*" -after (get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 528 }

# Создаем переменную «$Data» с параметрами Время, Имя пользователя, IP адрес.
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)

# Пройдемся по каждому объекту из массива «$Events".
$Events | %{

# Наполняем переменную «$Data» данными.
$Data.time = $_.TimeGenerated

# В переменную «$message» загружаем массив строк, которые разделяются символом переноса строки (‘n).
# Функции trimstart(), trimend() убирают все лишние символы в конце и в начале строки.
# Функция split разделяет строку.
$message = $_.message.split(«`n») | %{$_.trimstart()} | %{$_.trimend()}

# В массиве «$message» мы ищем совпадения по строке «Пользователь:» и «Адрес сети источника:»
$Data.UserName = ($message | ?{$_ -like «Пользователь:*»} | %{$_ -replace «^.+:.»} )
$Data.Address = ($message | ?{$_ -like «Адрес сети источника:*»} | %{$_ -replace «^.+:.»})

# Вывод результата.
$Data
}

Запускаем скрипт ".\test.ps1«.
image

Если скрипт не запустился, то скорее всего ваш PoSh не настроен на выполнение скриптов. Выполните команду Set-ExecutionPolicy RemoteSignet .

Выглядит вполне хорошо, но думаю можно улучшить скрипт. Для удобства внесем в него возможность задания параметров, и выделения строк цветом по маске IP адреса.

param ($key1,$val1,$val2,$val3,$val4,$val5,$val6)

if ($val1 -eq $null) {$val1=0};

$mydate = Get-date -hour 0 -minute 0 -second 0;

if ($key1 -eq «year») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day 1 -month 1); $mydate = $mydate.addyears(-$val1); };

if ($key1 -eq «month») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day 1); $mydate = $mydate.addmonths(-$val1); };

if ($key1 -eq «day») { $mydate = $mydate.adddays(-$val1) };

if ($key1 -eq «date») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day $val1 -month $val2 -year $val3); };

# здесь реализуем возможность задания интервала

if ($val4 -eq $null) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after ($mydate) | ?{$_.eventid -eq 528 }}
if ($val4 -ne $null) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after ($mydate) -before (get-date -hour 0 -minute 0 -second 0 -day $val4 -month $val5 -year $val6) | ?{$_.eventid -eq 528 }}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)

$Events | %{

$Data.time = $_.TimeGenerated

$message = $_.message.split(«`n») | %{$_.trimstart()} | %{$_.trimend()}

$Data.UserName = ($message | ?{$_ -like «Пользователь:*»} | %{$_ -replace «^.+:.»} )
$Data.Address = ($message | ?{$_ -like «Адрес сети источника:*»} | %{$_ -replace «^.+:.»})

$textcolor = $host.ui.rawui.foregroundcolor

$host.ui.rawui.foregroundcolor = «red»

if ($data.address -like «192.168.0*») {$host.ui.rawui.foregroundcolor = «DarkGreen»}
if ($data.address -like «10.*») {$host.ui.rawui.foregroundcolor = «yellow»}

$data

$host.ui.rawui.foregroundcolor = $textcolor

}

param ($key1,$val1,$val2,$val3,$val4,$val5,$val6) — определяет параметры, передаваемые скрипту.

if ($key1 -eq "day") {$mydate = $mydate.adddays(-$val1)}; проверяем переданные параметры на соответствие ключу, если ключ совпадает, то корректируем дату согласно задаваемым параметрам. В данном случае в качестве параметра передается ключ «day» аргументом которого мы будем переводить дату на определенное количество дней назад. Т.е. будет выведен лог за определенное количество дней, остальные условия выполняются по аналогии, за месяц и за год. Если указан ключ «date» то за начало отсчета берется конкретная дата, указанная через пробел, например «01 05 2011», если мы так же через пробел укажем другую дату, то на экран будет выведен определенный период, указанный в этих датах.

image

А если задать {$_.eventid -eq 529 } то результатом будут все попытки входа с неправильными паролями.

image

Источник

PS.

Пусть автор поста на меня не серчает, кое какие фразы, формулировки исправил.

Cкрипт можно сделал немного изящнее внеся в него изменения:

# Параметры
param ($EventID,$key1,$val1,$StartDate,$EndDate)

# Начальное время суток
$TimeofDay = (get-date).date

if ($val1 -eq $null) {$val1=0};

# Год
if ($key1 -eq «year») {$mydate = ((Get-date $TimeofDay -day 1 -month 1)).addyears(-$val1)}

# Месяц
if ($key1 -eq «month») {$mydate = ((Get-date $TimeofDay -day 1)).addmonths(-$val1)}

# День
if ($key1 -eq «day») {$mydate = $TimeofDay.adddays(-$val1)}

# Конкретная
if ($key1 -eq «date») {$mydate = (Get-date $StartDate)}

# Интервал
if ($key1 -eq «interval») {$After = (Get-date $StartDate);$Before = (Get-date $EndDate)}

# Загружаем массив событий
if (!$After -and !$Before) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after $mydate | ?{$_.eventid -eq $EventID }}
else {$Events = Get-EventLog security -message «*Тип входа:?10*» -after $After -before $Before | ?{$_.eventid -eq $EventID }}

Создайте бесплатный сайт или блог на WordPress.com.