Аудит RDP-подключений к Windows Server: кто, когда и откуда

Удалённый рабочий стол (RDP) — один из самых распространённых векторов атак на Windows-инфраструктуру. Брутфорс по порту 3389, кража учётных данных, несанкционированный доступ сотрудников к серверам в нерабочее время — всё это реальные угрозы, с которыми сталкивается каждый системный администратор. При этом полноценные SIEM-системы стоят дорого и требуют отдельного внедрения.
В этой статье разберём, как выстроить практичный аудит RDP-подключений средствами самой Windows: журналом событий безопасности и PowerShell. Вы научитесь за минуты получать ответы на вопросы «кто заходил на сервер?», «с какого IP?», «в какое время?» и «сколько раз вводил неверный пароль?».
Какие события фиксирует Windows при RDP-сессии
Windows ведёт детальный журнал событий безопасности (Security Event Log). При каждом RDP-соединении генерируется цепочка событий с уникальными идентификаторами Event ID. Понимание этой цепочки — основа любого аудита.
- Event ID 4624 — успешный вход в систему. Для RDP тип входа (Logon Type) равен
10(RemoteInteractive). - Event ID 4625 — неудачная попытка входа. Содержит имя пользователя и IP-адрес атакующего.
- Event ID 4634 / 4647 — завершение сессии. Event 4647 фиксируется, когда пользователь сам инициировал выход.
- Event ID 4778 — переподключение к существующей сессии (reconnect).
- Event ID 4779 — отключение от сессии без завершения (disconnect).
- Event ID 4648 — явный вход с указанием конкретных учётных данных (часто используется при pass-the-hash атаках).
Включение аудита входов в систему
По умолчанию расширенный аудит входов может быть частично отключён. Перед началом работы убедитесь, что нужные политики активны.
Проверьте текущие настройки аудита командой:
auditpol /get /subcategory:"Logon"
auditpol /get /subcategory:"Logoff"
Если в столбце Inclusion Setting не стоит Success and Failure — включите аудит вручную:
# Включить аудит успешных и неудачных входов
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Logoff" /success:enable /failure:enable
В доменной среде рекомендуется управлять этим через групповую политику: Computer Configuration → Windows Settings → Security Settings → Advanced Audit Policy Configuration → Logon/Logoff.
Быстрая проверка: кто заходил по RDP сегодня
Самый простой и быстрый запрос — получить список всех успешных RDP-входов за последние 24 часа. Запустите PowerShell от имени администратора:
$StartTime = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = $StartTime
} | Where-Object {
$_.Properties[8].Value -eq 10
} | Select-Object TimeCreated,
@{Name='User'; Expression={$_.Properties[5].Value}},
@{Name='Domain'; Expression={$_.Properties[6].Value}},
@{Name='SourceIP';Expression={$_.Properties[18].Value}},
@{Name='LogonType';Expression={$_.Properties[8].Value}} |
Sort-Object TimeCreated -Descending |
Format-Table -AutoSize
Команда вернёт таблицу со столбцами: время входа, имя пользователя, домен и IP-адрес источника. Для просмотра в графическом окне замените Format-Table на Out-GridView.
Анализ неудачных попыток входа (брутфорс)
Event ID 4625 — ваш главный инструмент для обнаружения атак перебором паролей. Один и тот же IP с десятками попыток за минуту — явный признак брутфорса.
# Топ IP-адресов по числу неудачных попыток за последние 7 дней
$StartTime = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
} | Select-Object @{
Name = 'SourceIP'
Expression = {$_.Properties[19].Value}
}, @{
Name = 'User'
Expression = {$_.Properties[5].Value}
} | Group-Object SourceIP |
Select-Object Name, Count |
Sort-Object Count -Descending |
Select-Object -First 20 |
Format-Table -AutoSize
Если видите IP-адреса из нетипичных географических регионов или большое число попыток под несуществующими логинами — это повод немедленно заблокировать адреса на брандмауэре.
Get-WinEvent есть ограничение: при очень большом журнале запрос может занять несколько минут. Используйте параметр -MaxEvents для ограничения выборки при первичной диагностике.
Полная история сессий с продолжительностью
Для аудита рабочего времени и расследования инцидентов полезно знать не только когда вошли, но и когда вышли. Сопоставим события 4624 и 4634/4647 по LogonID:
# Сбор входов RDP
$logons = Get-WinEvent -FilterHashtable @{
LogName = 'Security'; Id = 4624
} | Where-Object {
$_.Properties[8].Value -eq 10
} | Select-Object TimeCreated,
@{Name='LogonID'; Expression={$_.Properties[7].Value}},
@{Name='User'; Expression={$_.Properties[5].Value}},
@{Name='SourceIP'; Expression={$_.Properties[18].Value}}
# Сбор выходов
$logoffs = Get-WinEvent -FilterHashtable @{
LogName = 'Security'; Id = @(4634, 4647)
} | Select-Object TimeCreated,
@{Name='LogonID';Expression={$_.Properties[3].Value}}
# Сопоставление по LogonID
$result = foreach ($logon in $logons) {
$logoff = $logoffs | Where-Object {
$_.LogonID -eq $logon.LogonID
} | Select-Object -First 1
[PSCustomObject]@{
User = $logon.User
SourceIP = $logon.SourceIP
LogonTime = $logon.TimeCreated
LogoffTime= if ($logoff) {$logoff.TimeCreated} else {'Сессия активна'}
Duration = if ($logoff) {
($logoff.TimeCreated - $logon.TimeCreated).ToString('hh\:mm\:ss')
} else {'—'}
}
}
$result | Sort-Object LogonTime -Descending | Format-Table -AutoSize
Мониторинг подозрительных входов в реальном времени
PowerShell позволяет подписаться на новые события журнала безопасности и реагировать на них немедленно. Следующий скрипт выводит оповещение в консоль при каждом новом RDP-входе:
# Мониторинг новых RDP-входов в реальном времени
$query = @"
"@
$watcher = New-Object System.Diagnostics.Eventing.Reader.EventLogWatcher(
(New-Object System.Diagnostics.Eventing.Reader.EventLogQuery(
"Security",
[System.Diagnostics.Eventing.Reader.PathType]::LogName,
$query
))
)
$watcher.add_EventRecordWritten({
param($sender, $e)
$ev = $e.EventRecord
$user = $ev.Properties[5].Value
$ip = $ev.Properties[18].Value
$time = $ev.TimeCreated
Write-Host "[$time] НОВЫЙ RDP-ВХОД: $user с IP $ip" -ForegroundColor Red
})
$watcher.Enabled = $true
Write-Host "Мониторинг запущен. Нажмите Ctrl+C для остановки."
while ($true) { Start-Sleep -Seconds 5 }
Send-MailMessage или HTTP-хук в Telegram.
Отправка отчёта по RDP-входам на email
Практичный вариант — ежедневный отчёт на почту. Создайте скрипт и добавьте его в Планировщик задач с запуском каждое утро:
# Параметры почты
$SmtpServer = "smtp.yourcompany.ru"
$SmtpPort = 587
$From = "monitoring@yourcompany.ru"
$To = "admin@yourcompany.ru"
$Credential = Get-Credential # или задайте PSCredential вручную
# Формируем отчёт за прошедшие сутки
$StartTime = (Get-Date).Date.AddDays(-1)
$EndTime = (Get-Date).Date
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = $StartTime
EndTime = $EndTime
} | Where-Object { $_.Properties[8].Value -eq 10 } |
Select-Object TimeCreated,
@{Name='User'; Expression={$_.Properties[5].Value}},
@{Name='SourceIP'; Expression={$_.Properties[18].Value}}
$failed = (Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
EndTime = $EndTime
} -ErrorAction SilentlyContinue).Count
$body = "RDP-отчёт за $(Get-Date $StartTime -Format 'dd.MM.yyyy')`n`n"
$body += "Успешных входов: $($events.Count)`n"
$body += "Неудачных попыток: $failed`n`n"
$body += ($events | Format-Table -AutoSize | Out-String)
Send-MailMessage -SmtpServer $SmtpServer -Port $SmtpPort `
-From $From -To $To `
-Subject "RDP-аудит $(hostname) — $(Get-Date -Format 'dd.MM.yyyy')" `
-Body $body -Encoding UTF8 -Credential $Credential -UseSsl
Добавление скрипта в Планировщик задач
Чтобы отчёт формировался автоматически, зарегистрируйте PowerShell-скрипт как задачу Windows:
# Создание задачи планировщика — запуск каждый день в 08:00
$Action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\rdp-report.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At "08:00"
$Settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Minutes 10) `
-RunOnlyIfNetworkAvailable
Register-ScheduledTask -TaskName "RDP Daily Report" `
-Action $Action -Trigger $Trigger -Settings $Settings `
-RunLevel Highest -User "SYSTEM"
SYSTEM или выделенный сервисный аккаунт с правами на чтение Security Event Log. Обычному пользователю читать этот журнал запрещено.
Автоматическая блокировка атакующих IP через Windows Firewall
Если зафиксировано более N неудачных попыток с одного IP — можно автоматически добавить блокирующее правило брандмауэра. Скрипт для запуска по расписанию (например, каждые 15 минут):
# Пороговое значение — количество неудачных попыток за час
$Threshold = 15
$StartTime = (Get-Date).AddHours(-1)
# Получаем IP-адреса превысившие порог
$attackers = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
} | Select-Object @{
Name = 'SourceIP'; Expression = {$_.Properties[19].Value}
} | Group-Object SourceIP |
Where-Object { $_.Count -ge $Threshold } |
Select-Object -ExpandProperty Name |
Where-Object { $_ -notmatch '^(10\.|192\.168\.|172\.(1[6-9]|2\d|3[01])\.)' }
foreach ($ip in $attackers) {
$ruleName = "Block-RDP-Bruteforce-$ip"
if (-not (Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $ruleName `
-Direction Inbound -Protocol TCP -RemoteAddress $ip `
-Action Block -Profile Any
Write-Host "Заблокирован IP: $ip (попыток: $($attackers.Count))" -ForegroundColor Yellow
}
}
Регулярное выражение в условии Where-Object исключает из блокировки локальные адреса (RFC 1918) — чтобы случайно не заблокировать внутренних пользователей.
Просмотр журнала через Event Viewer: ручной способ
Если PowerShell недоступен или нужно быстро глянуть журнал вручную, используйте стандартный Просмотр событий:
- Откройте eventvwr.msc (Win+R).
- Перейдите в Журналы Windows → Безопасность.
- Нажмите Фильтровать текущий журнал (правая панель).
- В поле Идентификаторы событий введите:
4624,4625,4634,4647,4778,4779. - Нажмите OK — журнал отфильтруется по нужным событиям.
Для удалённого просмотра журналов подключитесь к нужному серверу через Действие → Подключиться к другому компьютеру прямо из Event Viewer.
Экспорт журнала в CSV для долгосрочного хранения
Журнал событий Windows по умолчанию ограничен по размеру и перезаписывается. Для соответствия требованиям ИБ и долгосрочного хранения экспортируйте данные в CSV-файлы:
# Экспорт всех RDP-событий за месяц в CSV
$MonthStart = (Get-Date -Day 1).Date
$ExportPath = "C:\Logs\RDP-Audit-$(Get-Date -Format 'yyyy-MM').csv"
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = @(4624, 4625, 4634, 4647, 4778, 4779)
StartTime = $MonthStart
} | Select-Object TimeCreated, Id,
@{Name='User'; Expression={$_.Properties[5].Value}},
@{Name='Domain'; Expression={$_.Properties[6].Value}},
@{Name='SourceIP'; Expression={
if ($_.Id -eq 4625) {$_.Properties[19].Value}
else {$_.Properties[18].Value}
}},
@{Name='LogonType';Expression={$_.Properties[8].Value}},
Message |
Export-Csv -Path $ExportPath -Encoding UTF8 -NoTypeInformation
Write-Host "Экспортировано в: $ExportPath"
Добавьте этот скрипт в планировщик с запуском первого числа каждого месяца и настройте ротацию файлов — например, хранить данные за последние 12 месяцев.
Итог: минимальный набор инструментов для RDP-аудита
Подведём итог. Без SIEM и сторонних агентов вы можете получить полноценный аудит RDP-доступа, используя только встроенные возможности Windows:
- Включить аудит входов/выходов через
auditpolили GPO. - Запрашивать Event ID 4624 (тип 10) для успешных RDP-входов.
- Анализировать Event ID 4625 для обнаружения брутфорса.
- Сопоставлять 4624 и 4634/4647 для расчёта продолжительности сессий.
- Автоматически блокировать атакующие IP через
New-NetFirewallRule. - Настроить ежедневный email-отчёт через Планировщик задач.
- Экспортировать события в CSV для долгосрочного хранения.
Описанные скрипты легко адаптируются под конкретную среду: достаточно поменять пороговые значения, список серверов и параметры почтового сервера. Для инфраструктуры из десятков серверов имеет смысл централизовать сбор событий с помощью Windows Event Forwarding (WEF) или рассмотреть внедрение лёгкого SIEM — например, Wazuh.
Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell
Часто задаваемые вопросы
Что такое Аудит RDP-подключений к Windows Server: кто, когда и откуда?
Аудит RDP-подключений к Windows Server: кто, когда и откуда — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.
Как правильно настроить Аудит RDP-подключений к Windows Server: кто, когда и откуда?
Для корректной настройки Аудит RDP-подключений к Windows Server: кто, когда и откуда необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.
Какие типичные ошибки возникают при работе с Аудит RDP-подключений к Windows Server: кто, когда и откуда?
Наиболее частые ошибки при работе с Аудит RDP-подключений к Windows Server: кто, когда и откуда: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.
ООО «АйТи Фреш» возьмёт это на себя
Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.