security 23 марта 2026 10 мин чтения
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

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

rdp-connection-audit

Удалённый рабочий стол (RDP) — один из самых распространённых векторов атак на Windows-инфраструктуру. Брутфорс по порту 3389, кража учётных данных, несанкционированный доступ сотрудников к серверам в нерабочее время — всё это реальные угрозы, с которыми сталкивается каждый системный администратор. При этом полноценные SIEM-системы стоят дорого и требуют отдельного внедрения.

В этой статье разберём, как выстроить практичный аудит RDP-подключений средствами самой Windows: журналом событий безопасности и PowerShell. Вы научитесь за минуты получать ответы на вопросы «кто заходил на сервер?», «с какого IP?», «в какое время?» и «сколько раз вводил неверный пароль?».

Какие события фиксирует Windows при RDP-сессии

Windows ведёт детальный журнал событий безопасности (Security Event Log). При каждом RDP-соединении генерируется цепочка событий с уникальными идентификаторами Event ID. Понимание этой цепочки — основа любого аудита.

Совет: Для RDP наиболее информативна пара 4624 (вход) + 4634/4647 (выход). По разнице временных меток можно рассчитать продолжительность сессии.

Включение аудита входов в систему

По умолчанию расширенный аудит входов может быть частично отключён. Перед началом работы убедитесь, что нужные политики активны.

Проверьте текущие настройки аудита командой:

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.

Важно: Не включайте аудит на уровне Default Domain Policy — это создаст избыточную нагрузку на журнал всех рабочих станций. Применяйте политику только к OU с серверами.

Быстрая проверка: кто заходил по 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 }
Совет: Вместо вывода в консоль можно отправлять уведомления по email через 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) — чтобы случайно не заблокировать внутренних пользователей.

Осторожно: Перед запуском в production обязательно протестируйте скрипт в тестовой среде. Ошибочная блокировка диапазона IP может отрезать легитимных пользователей от сервера.

Просмотр журнала через Event Viewer: ручной способ

Если PowerShell недоступен или нужно быстро глянуть журнал вручную, используйте стандартный Просмотр событий:

  1. Откройте eventvwr.msc (Win+R).
  2. Перейдите в Журналы Windows → Безопасность.
  3. Нажмите Фильтровать текущий журнал (правая панель).
  4. В поле Идентификаторы событий введите: 4624,4625,4634,4647,4778,4779.
  5. Нажмите OK — журнал отфильтруется по нужным событиям.

Для удалённого просмотра журналов подключитесь к нужному серверу через Действие → Подключиться к другому компьютеру прямо из Event Viewer.

Совет: Сохраните созданный фильтр как Настраиваемое представление — тогда не придётся каждый раз вводить Event ID заново.

Экспорт журнала в 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:

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

15+лет опыта
25+клиентов
40Gсвоя сеть
24/7поддержка