Защита RDP от брутфорса с помощью PowerShell.

Защитите сервер от взлома RDP с помощью PowerShell

Как настроить RDP сервер, изменить порт RDP по умолчанию 3389, исправить ошибки подключения, внутреннюю ошибку и ошибку подлинности. Готовый скрипт для автоматической блокировки IP через брандмауэр.

PowerShell для защиты RDP: обнаружение брутфорса и автоматическая блокировка IP через брандмауэр

Протокол удаленного рабочего стола (RDP) — один из самых удобных инструментов для удаленного подключения к серверам и компьютерам. Но именно RDP порт 3389 является одной из главных целей для злоумышленников. В этой статье мы разберем, как настроить RDP безопасно, как исправить типичные ошибки RDP, и главное — напишем скрипт PowerShell, который автоматически блокирует IP-адреса при попытках брутфорса RDP.


Краткий чек-лист: что нужно знать о безопасности RDP

  • Какой порт у RDP? — по умолчанию 3389. Его рекомендуется изменить для повышения безопасности.
  • Как подключиться по RDP? — через штатный клиент mstsc или сторонние RDP клиенты.
  • Какие бывают ошибки RDP?внутренняя ошибка RDP, ошибка подлинности RDP, черный экран, сбои подключения.
  • Как защитить RDP от брутфорса? — сменить порт, использовать сетевые уровни аутентификации (NLA), настроить брандмауэр, автоматизировать блокировку IP через PowerShell.
  • Что такое RDP wrapper? — утилита, позволяющая включать RDP на Windows Home, где эта функция отсутствует.

Введение: почему RDP — это главная цель для атак

Протокол удалённого рабочего стола (RDP) — это удобнейший инструмент для администрирования серверов и компьютеров. Особенно если вы работаете из дома или управляете несколькими машинами. Но у этой медали есть обратная сторона: RDP порт (по умолчанию 3389) — одна из главных целей для злоумышленников.

Каждый день миллионы ботов сканируют интернет в поисках открытых RDP портов. Как только находится открытый порт, начинается подбор паролей — брутфорс RDP. Слабые пароли ломаются за минуты, после чего сервер становится частью ботнета, майнит криптовалюту или используется для атак на другие системы.

В этой статье мы:

  • Разберем, как настроить RDP безопасно
  • Научимся находить RDP ошибки и исправлять их
  • Напишем скрипт на PowerShell, который:
    • Анализирует журналы событий Windows
    • Находит неудачные попытки подключения по RDP
    • Подсчитывает количество попыток с каждого IP-адреса
    • Автоматически добавляет подозрительные IP в блок-лист брандмауэра

Часть 1: Как работает брутфорс RDP и как его обнаружить

Прежде чем писать защиту, нужно понять, что мы ищем. При каждой попытке входа по RDP Windows записывает событие в журнал Security.

  • Удачные входы имеют Event ID 4624 (успешный вход) с типом входа 10 (RemoteInteractive).
  • Неудачные попытки имеют Event ID 4625 (неудачный вход).

Злоумышленники обычно перебирают пароли с одного IP-адреса или с небольшой сети. Если вы видите десятки или сотни событий 4625 с одного и того же IP за короткое время — это явный признак атаки на RDP сервер.

Как включить RDP и настроить аудит

Прежде чем защищать RDP доступ, убедитесь, что сам протокол включен:

  • Как включить RDP в Windows: Параметры → Система → Удаленный рабочий стол → Включить.
  • Как открыть RDP порт в брандмауэре: разрешить входящие подключения на порт 3389.
  • Как проверить RDP: выполните netstat -an | findstr 3389 — порт должен быть в состоянии LISTENING.

Для обнаружения атак нам нужен журнал аудита. Проверить, включен ли аудит входа, можно командой:

auditpol /get /subcategory:"Logon"

Должно быть «Success and Failure» или хотя бы «Failure».


Часть 2: Базовая команда — читаем журнал событий RDP

Начнём с простого — научимся читать события неудачных попыток подключения к RDP.

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4625
    StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message

Эта команда покажет все неудачные попытки входа по RDP за последние 24 часа. Но выводить просто события неудобно — нам нужно сгруппировать их по IP-адресам.


Часть 3: Извлекаем IP-адреса из событий RDP

Информация об IP-адресе атакующего спрятана в тексте сообщения. Нужно распарсить её с помощью регулярных выражений.

$events = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4625
    StartTime = (Get-Date).AddHours(-24)
}

$attackers = @{}

foreach ($event in $events) {
    # Русская версия Windows
    if ($event.Message -match 'Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+)') {
        $ip = $matches[1]
        if ($attackers.ContainsKey($ip)) {
            $attackers[$ip]++
        } else {
            $attackers[$ip] = 1
        }
    }
    # Английская версия Windows
    elseif ($event.Message -match 'Source Network Address:\s+(\d+\.\d+\.\d+\.\d+)') {
        $ip = $matches[1]
        if ($attackers.ContainsKey($ip)) {
            $attackers[$ip]++
        } else {
            $attackers[$ip] = 1
        }
    }
}

$attackers.GetEnumerator() | Sort-Object Value -Descending

Этот скрипт создаёт хеш-таблицу, где ключ — IP-адрес, а значение — количество неудачных попыток подключения к удаленному рабочему столу. В конце выводится список IP с сортировкой по убыванию.


Часть 4: Порог срабатывания — сколько попыток считать атакой

Теперь нужно решить, при каком количестве попыток мы считаем IP злоумышленником. Для домашнего компьютера достаточно 5-10 попыток за сутки. Для публичного RDP сервера порог можно поднять до 50-100.

Добавим фильтр в скрипт:

$threshold = 10
$suspects = $attackers.GetEnumerator() | Where-Object { $_.Value -ge $threshold }

Часть 5: Добавляем IP в брандмауэр Windows

Теперь самое интересное — автоматическая блокировка подозрительных IP через встроенный брандмауэр Windows Defender.

Создадим правило для каждого подозрительного IP:

foreach ($suspect in $suspects) {
    $ip = $suspect.Key
    $ruleName = "Block RDP Brute Force - $ip"
    
    # Проверяем, нет ли уже такого правила
    $existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
    
    if (-not $existingRule) {
        New-NetFirewallRule -DisplayName $ruleName `
            -Direction Inbound `
            -LocalPort 3389 `
            -Protocol TCP `
            -RemoteAddress $ip `
            -Action Block `
            -Profile Any
        Write-Host "IP $ip заблокирован (попыток: $($suspect.Value))"
    }
}

Этот код создаёт правило брандмауэра, которое блокирует весь входящий трафик с указанного IP на порт RDP 3389.


Часть 6: Полный скрипт защиты RDP от брутфорса

Соберём всё вместе в один готовый скрипт, который можно запускать по расписанию для защиты RDP подключения.

# RDP Brute Force Defender
# Запускать от имени администратора
# Защита RDP сервера от брутфорс-атак

param(
    [int]$HoursBack = 24,
    [int]$Threshold = 10,
    [string]$WhitelistFile = "whitelist.txt",
    [switch]$Unblock
)

if ($Unblock) {
    # Режим разблокировки: удаляем все созданные правила
    Get-NetFirewallRule -DisplayName "Block RDP Brute Force -*" | Remove-NetFirewallRule
    Write-Host "✅ Все правила блокировки RDP удалены" -ForegroundColor Green
    exit
}

Write-Host "🔍 Поиск атак RDP за последние $HoursBack часов..." -ForegroundColor Cyan

# Читаем белый список
$whitelist = @()
if (Test-Path $WhitelistFile) {
    $whitelist = Get-Content $WhitelistFile
    Write-Host "📋 Белый список загружен: $($whitelist.Count) IP" -ForegroundColor Gray
}

# Получаем события неудачных входов
$events = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4625
    StartTime = (Get-Date).AddHours(-$HoursBack)
} -ErrorAction SilentlyContinue

if (-not $events) {
    Write-Host "❌ Неудачных попыток входа по RDP не найдено" -ForegroundColor Yellow
    exit
}

# Собираем статистику по IP
$attackers = @{}

foreach ($event in $events) {
    # Русская версия Windows
    if ($event.Message -match 'Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+)') {
        $ip = $matches[1]
    }
    # Английская версия Windows
    elseif ($event.Message -match 'Source Network Address:\s+(\d+\.\d+\.\d+\.\d+)') {
        $ip = $matches[1]
    }
    else {
        continue
    }
    
    # Пропускаем локальные адреса
    if ($ip -match '^127\.|^10\.|^172\.16\.|^192\.168\.') {
        continue
    }
    
    if ($attackers.ContainsKey($ip)) {
        $attackers[$ip]++
    } else {
        $attackers[$ip] = 1
    }
}

if ($attackers.Count -eq 0) {
    Write-Host "❌ Не найдено внешних IP с неудачными попытками" -ForegroundColor Yellow
    exit
}

# Выводим статистику
Write-Host "`n📊 Статистика попыток RDP подключения:" -ForegroundColor Cyan
$attackers.GetEnumerator() | Sort-Object Value -Descending | ForEach-Object {
    Write-Host "   $($_.Key): $($_.Value) попыток"
}

# Фильтруем подозрительные IP (выше порога и не в белом списке)
$suspects = $attackers.GetEnumerator() | Where-Object { 
    $_.Value -ge $Threshold -and $_.Key -notin $whitelist
}

if ($suspects.Count -eq 0) {
    Write-Host "`n✅ Подозрительных IP не найдено (порог: $Threshold попыток)" -ForegroundColor Green
    exit
}

Write-Host "`n⚠️ Найдено подозрительных IP: $($suspects.Count)" -ForegroundColor Yellow

# Блокируем подозрительные IP
foreach ($suspect in $suspects) {
    $ip = $suspect.Key
    $ruleName = "Block RDP Brute Force - $ip"
    
    $existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
    
    if (-not $existingRule) {
        try {
            New-NetFirewallRule -DisplayName $ruleName `
                -Direction Inbound `
                -LocalPort 3389 `
                -Protocol TCP `
                -RemoteAddress $ip `
                -Action Block `
                -Profile Any `
                -ErrorAction Stop
            Write-Host "   🔒 IP $ip ЗАБЛОКИРОВАН (попыток: $($suspect.Value))" -ForegroundColor Red
        }
        catch {
            Write-Host "   ❌ Ошибка при блокировке IP $ip : $_" -ForegroundColor Red
        }
    } else {
        Write-Host "   ℹ️ IP $ip уже заблокирован ранее" -ForegroundColor Gray
    }
}

Write-Host "`n✅ Защита RDP активирована. Для удаления всех правил запустите с ключом -Unblock" -ForegroundColor Green

Часть 7: Как использовать скрипт защиты RDP

Сохраните код в файл с расширением .ps1, например RDP-Defender.ps1.

Запуск вручную

powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1

С порогом 20 попыток за последние 48 часов

powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1 -HoursBack 48 -Threshold 20

Удалить все созданные правила (разблокировать IP)

powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1 -Unblock

Создание белого списка

Создайте файл whitelist.txt в той же папке, где лежит скрипт, и перечислите IP-адреса по одному в строке:

192.168.1.100
10.0.0.5
89.123.45.67

Часть 8: Автоматический запуск скрипта через планировщик задач

Чтобы защита RDP работала постоянно, добавьте скрипт в планировщик задач Windows.

  1. Откройте Планировщик задач (Task Scheduler).
  2. Создайте новую задачу.
  3. На вкладке Триггеры установите повторение каждый час.
  4. На вкладке Действия укажите:
    • Действие: Запуск программы
    • Программа: powershell.exe
    • Аргументы: -ExecutionPolicy Bypass -File "C:\путь\к\RDP-Defender.ps1"
  5. На вкладке Условия снимите галочку «Запускать только при питании от сети».
  6. На вкладке Параметры поставьте галочку «Выполнять с наивысшими правами».

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


Часть 9: Как изменить порт RDP для дополнительной защиты

Один из самых эффективных способов снизить количество атак — изменить порт RDP с 3389 на любой другой.

  1. Откройте Редактор реестра (regedit).
  2. Перейдите по пути: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
  3. Найдите параметр PortNumber, измените значение (в десятичном формате) на нужный порт, например 53389.
  4. В брандмауэре Windows создайте новое правило для входящих подключений на новом порту.
  5. Перезагрузите компьютер.

После этого RDP подключение будет доступно только через новый порт. Не забудьте обновить настройки в скрипте блокировки, заменив LocalPort 3389 на ваш новый порт.


Часть 10: Частые ошибки RDP и способы их исправления

Внутренняя ошибка RDP

Причина: проблемы с сертификатами, сетевыми уровнями аутентификации или настройками TLS.

  • Решение 1: Проверьте, что на сервере и клиенте включена проверка подлинности RDP на уровне сети (NLA).
  • Решение 2: Обновите сертификаты удаленного рабочего стола.
  • Решение 3: Проверьте работу службы TermService.

Ошибка подлинности RDP

Причина: несоответствие версий протокола или проблемы с Kerberos.

  • Решение: В клиенте RDP (mstsc) на вкладке «Подключение» снимите галочку «Всегда запрашивать учетные данные» или настройте параметры аутентификации.

Черный экран при подключении по RDP

Причина: конфликт видеодрайверов, переполнение буфера обмена, проблемы с групповыми политиками.

  • Решение 1: Перезапустите службу Remote Desktop Services.
  • Решение 2: Отключите перенаправление принтеров и буфера обмена в настройках клиента.
  • Решение 3: В реестре измените параметр fDisableCursorShadow на 1.

RDP не работает после обновления Windows

Причина: обновления безопасности могут изменять настройки RDP или блокировать RDP порт.

  • Решение: Проверьте настройки брандмауэра, убедитесь, что RDP доступ разрешен. При необходимости откатите проблемное обновление.

Часть 11: Расширенные возможности скрипта

Уведомления по email при обнаружении атаки

if ($suspects.Count -gt 0) {
    $body = "Обнаружены атаки RDP с IP:`n"
    foreach ($suspect in $suspects) {
        $body += "$($suspect.Key): $($suspect.Value) попыток`n"
    }
    
    Send-MailMessage -From "server@domain.com" `
        -To "admin@domain.com" `
        -Subject "RDP Brute Force Attack Detected" `
        -Body $body `
        -SmtpServer "smtp.domain.com"
}

Временная блокировка вместо постоянной

Вместо создания постоянных правил можно использовать временную блокировку (например, на 24 часа) с помощью netsh advfirewall и планировщика задач для автоматического удаления.


Часть 12: Альтернативные решения для защиты RDP

Если вы не хотите писать свой скрипт, существуют готовые решения:

  • RDP Defender — бесплатная утилита с графическим интерфейсом.
  • Fail2Ban для Windows — порт популярной Linux-утилиты.
  • RDP Wrapper — позволяет включать RDP на Windows Home, но не защищает от атак.
  • Microsoft Advanced Threat Analytics — корпоративное решение для мониторинга безопасности.

Но самодельный скрипт PowerShell даёт главное преимущество — полный контроль и понимание того, что происходит в системе.


Часто задаваемые вопросы о RDP и защите

Вопрос: Как подключиться по RDP к компьютеру в локальной сети?

Ответ: Нажмите Win+R, введите mstsc, введите IP-адрес или имя компьютера, нажмите «Подключиться». Убедитесь, что на целевом компьютере RDP включен и порт 3389 открыт в брандмауэре.

Вопрос: Какой порт у RDP по умолчанию?

Ответ: 3389. Для повышения безопасности рекомендуется изменить порт RDP на любой другой (например, 53389).

Вопрос: Как исправить внутреннюю ошибку RDP?

Ответ: Проверьте настройки NLA, обновите сертификаты, убедитесь, что служба TermService работает. В большинстве случаев помогает отключение и повторное включение RDP на сервере.

Вопрос: Как настроить RDP на Windows Home?

Ответ: В Windows Home функция RDP сервера отсутствует. Можно использовать RDP Wrapper — утилиту, которая добавляет поддержку RDP в Home-версии.

Вопрос: Как проверить, не атакуют ли мой RDP?

Ответ: Используйте наш скрипт, который анализирует события 4625 в журнале Security. Или выполните команду: Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-24)} | Group-Object -Property {$_.Message -replace '(?s).+Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+).+','$1'} | Sort-Object Count -Descending.


Заключение: автоматическая защита RDP — это просто

Мы создали мощный инструмент защиты от брутфорс-атак на RDP с помощью встроенных средств Windows. Всего несколько десятков строк кода — и ваш RDP сервер автоматически блокирует злоумышленников, не дожидаясь вашего вмешательства.

Этот скрипт можно модифицировать под свои нужды:

  • Добавить поддержку других протоколов (FTP, SSH)
  • Настроить временную блокировку вместо постоянной
  • Интегрировать с системами мониторинга
  • Создать веб-интерфейс для управления белым списком

Главное — помните: безопасность RDP начинается с маленьких шагов. Даже простой скрипт, запускаемый по расписанию, может предотвратить взлом и сохранить ваши данные.


Читайте также

Revo Uninstaller: полное руководство по очистке Windows
Revo Uninstaller: полное руководство по очистке Windows
PowerShell
Эра PowerShell: От новичка к уверенному администратору
Подсети и маски: руководство для начинающих
Подсети и маски: руководство для начинающих
Эра PowerShell: От новичка к уверенному администратору
PowerShell в сетевом администрировании: от диагностики до тотальной автоматизации

Добавить комментарий

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