Как на самом деле выглядит брутфорс RDP

Анатомия атаки, которая приходит на каждый Windows-сервер с публичным IP: кто её запускает, во что она обходится атакующему, почему стандартные советы работают наполовину и что её реально останавливает.

7 мин чтения

Что это такое, если без терминов

Брутфорс RDP — не целенаправленная операция против вас. Это ширпотреб: кто-то арендует ботнет, скармливает ему список диапазонов IP и заставляет пробовать вход на каждой машине, которая отвечает на порту 3389. Список паролей короткий и скучный — Administrator с Password1, admin с admin, название компании с текущим годом. Боту всё равно, что у вас за сервер.

Безостановочной атаку делает экономика. Один удачный вход стоит реальных денег на рынке доступов для шифровальщиков, а цена попытки близка к нулю. Поэтому боты не останавливаются никогда. Поставьте свежий Windows Server на публичный IP с открытым RDP — первый неудачный вход обычно приходит в течение часа, а через неделю это уже стабильные несколько тысяч в сутки.

Важен именно объём. Человек, вручную подбирающий ваш пароль, — это история. Сто тысяч попыток в месяц с постоянно меняющихся адресов — это погодное явление. Меры, рассчитанные на первое, бесполезны против второго.

Как понять, что это происходит с вами

Windows пишет каждый неудачный вход как событие 4625 в журнал безопасности. Откройте «Просмотр событий» → «Журналы Windows» → «Безопасность» и отфильтруйте по 4625. На спокойном сервере вы увидите единицы записей от людей, промахнувшихся по клавишам. Под атакой — стену.

Показателен не сам счётчик, а форма. Пользователь, ошибшийся паролем, даёт два-три отказа с одного адреса, по существующей учётной записи, и на этом останавливается. Бот выдаёт длинную серию по именам, которых на вашей машине никогда не было — admin, sql, backup, test, scanner, user1 — с адресов хостинговых диапазонов, с которыми вы никогда не имели дела, ровным темпом всю ночь.

Эта команда покажет адреса-лидеры по числу отказов за последние сутки:

powershell
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
  ForEach-Object { ([xml]$_.ToXml()).Event.EventData.Data |
    Where-Object Name -eq 'IpAddress' | Select-Object -ExpandProperty '#text' } |
  Group-Object | Sort-Object Count -Descending | Select-Object -First 20 Count, Name

Почему обычные советы работают наполовину

Любой чек-лист по харденингу начинается со «сложного пароля». Это верно и этого недостаточно. Сложный пароль означает, что боты его не подберут, — но пробовать они будут вечно, и каждая попытка стоит вам потока, строки в журнале аудита и куска процессорного времени. Серверы под непрерывной атакой измеримо замедляются, а журнал безопасности ротируется так быстро, что нужного вам события в нём уже нет.

Следующим пунктом обычно идёт «включите политику блокировки учётных записей». Вот с этим осторожнее. Блокировка считает отказы по учётной записи, а боты берут имена из списка. Заблокируйте Administrator после пяти неудач — и атакующий, у которого не было ни единого шанса угадать пароль, теперь может отключать эту запись когда угодно, откуда угодно и сколько угодно. Вы превратили досадный шум в отказ в обслуживании против самого себя.

Network Level Authentication помогает по-настоящему: клиент обязан аутентифицироваться до создания сессии, что убирает целый класс доэкплуатационных уязвимостей и снижает стоимость каждой попытки. Включите его. На частоту попыток он не влияет.

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

Что действительно снижает число попыток

Объём меняет только одно: отказ разговаривать с источником. Всё остальное с ним договаривается.

Это значит следить за потоком отказов и, когда один адрес переходит порог, добавлять его в правило фаервола, которое отбрасывает пакеты раньше, чем Windows потратит на них хоть что-то. Именно это делает fail2ban на Linux, и встроенного аналога в Windows нет — поэтому столько администраторов заканчивают написанием планового PowerShell-скрипта.

Три детали отличают защиту, которая держит, от той, которая протекает:

  • Банить подсеть, а не адрес. Боты живут на хостинговых диапазонах. Заблокируете 203.0.113.47 — через час начнёт 203.0.113.48. Блокировка /24 обрывает всю серию разом, а легитимные пользователи почти никогда не сидят в одной /24 со сканером.
  • Банить навсегда и переживать перезагрузку. Бан на час означает, что тот же ботнет вернётся вечером. Правило должно жить в фаерволе, а не в памяти процесса.
  • Сначала внести в белый список себя, до того как включено что-либо ещё. Самый частый способ всё сломать — администратор, заблокировавший собственный офисный IP на сервере, к которому есть доступ только по RDP.

Объединяйте правила, иначе фаервол станет узким местом

Деталь, которая вылезает только в бою: Windows Firewall куда лучше справляется с несколькими крупными правилами, чем с тысячами мелких. Скрипты, вызывающие New-NetFirewallRule на каждый забаненный адрес, прекрасно работают две недели, а затем начинают тратить на обработку минуты, потому что набор правил вырос до пятизначного числа.

Решение — держать одно правило и переписывать его список адресов, а не заводить правило на каждого атакующего. Небольшое проектное решение, от которого зависит, будет ли защита работать через полгода.

Как получить то же самое, не написав скрипт

RDP Protector — это та же логика, упакованная в подписанный агент для Windows. Он читает тот же поток 4625, который читали бы вы, принимает решение локально — поэтому продолжает работать при обрыве сети — и поддерживает одно сводное правило фаервола со всеми забаненными диапазонами.

При установке он определяет фактические порты RDP, FTP и MS SQL по реестру и слушающим сокетам, так что сервер, переехавший с 3389, защищён без настройки, и заносит в белый список адрес, с которого вы подключены, прежде чем что-либо блокировать.

Единственное, что нельзя построить в одиночку, — общая репутация: адрес, атаковавший другого клиента, заблокирован у вас ещё до того, как до вас дойдёт. Один сервер бесплатен навсегда — этого достаточно, чтобы посмотреть на реальный поток атак на своей машине и решить по фактам.

FAQ

Сколько неудачных входов по RDP — это норма?
На сервере без выхода в интернет — почти ноль, несколько штук в неделю от людей, ошибшихся паролем. На сервере с RDP, доступным с любого адреса, несколько тысяч в сутки — обычное дело и ничего не говорит лично о вас: это фоновый уровень сканирования интернета. Значение имеют динамика и распределение источников, а не абсолютное число.
Спасает ли смена порта RDP от брутфорса?
Она отсекает нецелевые сканеры, которые проверяют только 3389, а это на практике основная часть объёма — падение числа попыток часто превышает 90%. Она не останавливает ничего, что сканирует весь диапазон портов, а сервисы вроде Shodan непрерывно индексируют RDP на нестандартных портах. Считайте это снижением шума, а не защитой.
Стоит ли включать блокировку учётных записей против брутфорса?
Не как основную защиту на сервере, смотрящем в интернет. Блокировка привязана к имени учётной записи, а атакующий выбирает имена свободно — значит, кто угодно может по желанию заблокировать вашего Administrator с любого адреса. Блокируйте на сетевом уровне, а политику блокировки оставьте с умеренным порогом для интерактивных учёток, если она вам нужна.
Блокировать целую подсеть /24 — не слишком ли жёстко?
Для диапазона, который только что выдал вам сотни неудачных входов, — редко. Атакующий трафик идёт с хостинговых и VPS-диапазонов, где соседние адреса принадлежат тому же оператору; домашние пользователи почти никогда не оказываются в одной /24 со сканером. Держите белый список своих офисов и точек выхода VPN — и доля ложных срабатываний будет близка к нулю.

Посмотрите на своём потоке атак

Один сервер, бесплатно навсегда, без карты. Агент ставится за минуту и вносит ваш текущий адрес в белый список раньше, чем что-либо заблокирует.