Получаем логи (историю) входа пользователя в домен AD

В Active Directory есть несколько различных инструментов получения информации о времени входа пользователя в домен. Время последней успешной аутентификации пользователя можно получить из значения атрибута lastLogon (значение обновляется только на контроллере домена, который выполнил аутентификацию) или lastLogonTimpestamp (реплицируется между DC в домене, но только через 14 дней). Значение этих атрибутов пользователя можно получить в редакторе атрибутов AD или командлетом Get-ADUser. Однако иногда нужно получить историю активности (входов) пользователя в домене за большой период времени.

В этой статье мы покажем, как в домене настроить политику аудита событий аутентификации пользователей и с помощью PowerShell собрать информацию об успешных входах пользователей из журналов безопасности контроллеров домена. Простой скрипт позволит быстро получить полную историю активности пользователя в домене, время начала работы и компьютеры, с которых работал пользователь.

Настройка политики аудита входа в домен Active Directory

Чтобы в журналах контроллеров домена AD фиксировалась события успешного/неудачного входа пользователей, нужно настроить доменную политику аудита.

  1. Откройте консоль редактора доменных GPO, GPMC.msc
  2. Создайте новый объект групповых политики, и назначьте его на корень домена (не рекомендуется редактировать GPO Default Domain Policy)
  3. Откройте новую политику и перейдите в раздел Computer Configuration -> Policies -> Windows Settings -> Security Settings –> Advanced Audit Policy Configuration -> Audit Policies -> Logon/Logoff; Включить политику аудита входов пользователя в домен
  4. Включите две политики аудита (Audit Logon и Audit Other Logon/Logoff Events). Чтобы в журналах Security на DC и компьютерах регистрировались как успешные, так и неуспешные политики входа, выберите в настройках политика аудита опции Success и (опционально) Failureвключить политки аудита входа в домен Audit Logon
  5. Затем включите аудит событий Kerberos аутентификации. Перейдите в секцию Audit Policies -> Account Logon –> Audit Kerberos Authentication Service -> включите аудит событий Successвключить политику аудита Audit Kerberos Authentication Service
  6. Сохраните изменения в GPO
  7. Дождитесь репликации новой политики между DC.
  8. Контроллеры домена применяют настройки GPO каждые 5 минут. Можете обновить настройки групповых политик вручную командой: gpupdate /force

Теперь при входе пользователя на любой компьютер домена Active Directory в журнале Security контроллера домена, который выполняет аутентификацию пользователя ( LogonServer) появляется событие с Event ID 4624 (An account was successfully logged on). В описании события указана учетная запись вошедшего пользователя (Account Name), имя (Workstation name) или IP адрес (Source Network Address) компьютера, с которого выполнен вход.

В поле Logon Type события можно узнать код (тип) входа пользователя . Нам могут быть интересны следующие коды:

Event ID 4624 An account was successfully logged on

Также можно отслеживать вход пользователя в домен по событию выдачи билета Kerberos при аутентификации пользователя. Event ID 4768: A Kerberos authentication ticket (TGT) was requested.

В событии 4768 указана учетная запись пользователя (Account Name или User ID), который получил билет Kerberos (аутентифицировался) и имя (IP адрес) компьютера.

4768 - A Kerberos authentication ticket (TGT) was requested

Чтобы иметь достаточную глубину истории входов пользователей, на DC нужно увеличить максимальный размер журналов событий Event Viewer.

PowerShell: вывести историю входов пользователя в домене

Рассмотрим, как с помощью PowerShell извлечь из журналов безопасности контроллеров домена информацию о входе пользователя. Т.к. в домене может быть несколько контроллеров домена, у каждого из которых собственных журнал Security, придется выполнять поиск событий на каждом DC.

Для получения списка DC в домене используется командлет Get-ADDomainController (из модуля AD для Windows PowerShell).

В первоначальной версии скрипта для получения событий с определенным EventID из журналов безопасности контроллеров домена использовался командлет Get-Eventlog. Пример PowerShell скрипта, который выведет события входа пользователя за последние 2 дня со всех контроллеров домена:

# имя пользователя, историю входов которого нужно получить
$checkuser='*ivanov*'

# получаем информацию об истории входов пользователя за последних 2 дня, можете изменить
$startDate = (get-date).AddDays(-2)
$DCs = Get-ADDomainController -Filter *
foreach ($DC in $DCs){
$logonevents = Get-Eventlog -LogName Security -InstanceID 4624 -after $startDate -ComputerName $dc.HostName
foreach ($event in $logonevents){
if (($event.ReplacementStrings[5] -notlike '*$') -and ($event.ReplacementStrings[5] -like $checkuser)) {
# Remote (Logon Type 10)
if ($event.ReplacementStrings[8] -eq 10){
write-host "Type 10: Remote Logon`tDate: "$event.TimeGenerated "`tStatus: Success`tUser: "$event.ReplacementStrings[5] "`tWorkstation: "$event.ReplacementStrings[11] "`tIP Address: "$event.ReplacementStrings[18] "`tDC Name: " $dc.Name
}
# Network(Logon Type 3)
if ($event.ReplacementStrings[8] -eq 3){
write-host "Type 3: Network Logon`tDate: "$event.TimeGenerated "`tStatus: Success`tUser: "$event.ReplacementStrings[5] "`tWorkstation: "$event.ReplacementStrings[11] "`tIP Address: "$event.ReplacementStrings[18] "`tDC Name: " $dc.Name
}
}
}
}

На выходе вы получаете таблицу с историей входа пользователя, компьютеров, с которых аутентифицировался пользователь и контроллеров домена, обработавших вход.

poweshell - история входов пользователя в домен

Главный недостаток командлета Get-Eventlog в том, что он выполняет поиск событий очень медленно. Вместо него лучше использовать более быстрый командлет поиска событий Get-WinEvent. Пример аналогичного скрипта для получения событий входа со всех DC, который будет отрабатывать намного быстрее:

$TargetUsername = 'abelov' $StartTime = (Get-Date).AddHours(-24) $LogonTypeDescriptions = @{ '2' = 'Interactive' '3' = 'Network' '7' = 'Unlock' '10' = 'RemoteInteractive' '11' = 'CachedInteractive' } $DomainControllers = Get-ADDomainController -Filter * $LogonEvents = @() foreach ($DC in $DomainControllers) { $FilterHashtable = @{ LogName = 'Security' ID = 4624 StartTime = $StartTime } $Events = Get-WinEvent -ComputerName $DC.HostName -FilterHashtable $FilterHashtable -ErrorAction SilentlyContinue foreach ($Event in $Events) { $EventData = [xml]$Event.ToXml() $EventUser = $EventData.Event.EventData.Data[5].'#text' $LogonTypeCode = $EventData.Event.EventData.Data[8].'#text' if ($EventUser -eq $TargetUsername) { $LogonEvent = [PSCustomObject]@{ TimeCreated = $Event.TimeCreated ComputerName = $EventData.Event.EventData.Data[18].'#text' IPAddress = $EventData.Event.EventData.Data[18].'#text' Username = $EventUser LogonType = $LogonTypeDescriptions[$LogonTypeCode] DCName = $DC.HostName } $LogonEvents += $LogonEvent } } }

Если нужно экспортировать логи входа пользователей в CSV файл, воспользуйтесь командлетом Export-Csv:

$FileName = "C:\PS\LogonEvents" +  $startDate.ToString('yy_MM_dd')  + ".csv"
$LogonEvents| Export-Csv $FileName -Append -NoTypeInformation -encoding UTF8

Если вам нужно отслеживать завершение сеанса пользователей (выход) для получения длительности сессии пользователя, нужно выполнять поиск по событию Logoff с Event ID 4634.

powershell скрипт для экспорта логов входа в домен

Для длительного хранения логов со всех контроллеров домена в одном месте и удобного быстрого поиска, можно использовать внешний лог-коллектор. На сайте есть пример реализации такой схемы: GrayLog для хранения событий с серверов Windows.

Получаем информацию об активности пользователя в домене по событиям Kerberos

Также вы можете получить историю аутентификации пользователя в домене по по событию выдачи билета Kerberos (TGT Request — EventID 4768). В этом случае в итоговых данных будет содержаться меньшее количество событий (исключены сетевые входы, обращения к папкам на DC во время получения политик и выполнения логон-скриптов). Следующий PowerShell скрипт выведет информацию о всех входах пользователей за последние 24 часа:

$alluserhistory = @()
$startDate = (get-date).AddDays(-2)
$DCs = Get-ADDomainController -Filter *
foreach ($DC in $DCs){
$logonevents = Get-Eventlog -LogName Security -InstanceID 4768 -after $startDate -ComputerName $dc.HostName
foreach ($event in $logonevents){
if ($event.ReplacementStrings[0] -notlike '*$') {
$userhistory = New-Object PSObject -Property @{
UserName = $event.ReplacementStrings[0]
IPAddress = $event.ReplacementStrings[9]
Date = $event.TimeGenerated
DC = $dc.Name
}
$alluserhistory += $userhistory
}
}
}
$alluserhistory

powershell скрипт 4768 - история аутентфикации пользователей по выдаче билетом kerberos

Обратите, что в этом случае вы не увидите события входов пользователей, которые аутентифицировались с клиентов или приложений, которые используют NTLM вместо Kerberos.

Также можно извлечь информацию о события входа/выхода пользователя непосредственно из локальных журналов событий конкретного компьютера.

Предыдущая статья Следующая статья


Комментариев: 29 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)