Как на самом деле выглядит брутфорс RDP
Анатомия атаки, которая приходит на каждый Windows-сервер с публичным IP: кто её запускает, во что она обходится атакующему, почему стандартные советы работают наполовину и что её реально останавливает.
Что это такое, если без терминов
Брутфорс RDP — не целенаправленная операция против вас. Это ширпотреб: кто-то арендует ботнет, скармливает ему список диапазонов IP и заставляет пробовать вход на каждой машине, которая отвечает на порту 3389. Список паролей короткий и скучный — Administrator с Password1, admin с admin, название компании с текущим годом. Боту всё равно, что у вас за сервер.
Безостановочной атаку делает экономика. Один удачный вход стоит реальных денег на рынке доступов для шифровальщиков, а цена попытки близка к нулю. Поэтому боты не останавливаются никогда. Поставьте свежий Windows Server на публичный IP с открытым RDP — первый неудачный вход обычно приходит в течение часа, а через неделю это уже стабильные несколько тысяч в сутки.
Важен именно объём. Человек, вручную подбирающий ваш пароль, — это история. Сто тысяч попыток в месяц с постоянно меняющихся адресов — это погодное явление. Меры, рассчитанные на первое, бесполезны против второго.
Как понять, что это происходит с вами
Windows пишет каждый неудачный вход как событие 4625 в журнал безопасности. Откройте «Просмотр событий» → «Журналы Windows» → «Безопасность» и отфильтруйте по 4625. На спокойном сервере вы увидите единицы записей от людей, промахнувшихся по клавишам. Под атакой — стену.
Показателен не сам счётчик, а форма. Пользователь, ошибшийся паролем, даёт два-три отказа с одного адреса, по существующей учётной записи, и на этом останавливается. Бот выдаёт длинную серию по именам, которых на вашей машине никогда не было — admin, sql, backup, test, scanner, user1 — с адресов хостинговых диапазонов, с которыми вы никогда не имели дела, ровным темпом всю ночь.
Эта команда покажет адреса-лидеры по числу отказов за последние сутки:
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 — и доля ложных срабатываний будет близка к нулю.
