Настройка RDP (защита от перебора паролей).

Инструкция по скрипту и сам скрипт, проверялся на работоспособность в Windows Server 2012. Остальная информация на данной странице, актуальна для любой версии ОС.
 
На RDP сервера выставленные в Интернет достаточно быстро начинаются атаки переборщиков паролей. Зачастую, это не просто «школьники» или «хацкеры», которые пробуют свои силы в «хакерстве». Последние несколько лет, проблема с вирусами-шифровальщиками, стала достаточно серьезной. Дело в том, что половина всех заражений серверов вирусами-шифровальщиками, происходит через взлом пароля к RDP. Остальная часть, через уязвимости в самом RDP. Поэтому, любой системный админ скажет, что «выставлять» RDP в Интернет – нельзя. Для борьбы с перебором паролей к RDP, следует использовать VPN. И все бы хорошо, если бы не одно «но».

Нужна профессиональная помощь в настройке сервера? Есть вопросы? Качественная и надежная IT-помощь по доступным ценам:

Кроме банков, операторов мобильной связи, госучреждений, гигантских фирм, короче говоря людей больших и состоятельных, в мире есть множество маленьких фирм и фирмочек. Для небольшой фирмы, организовать и поддержать собственную VPN инфраструктуру –  нередко удовольствие не по карману.
Сейчас есть множество безопасных, доступных по цене, простые и удобные решений, которые позволяют организовать VPN для удаленной работы. Например, VPN клиент Pulse Secure, позволяет буквально в два клика, организовать безопасный RDP доступ. Просто запустил — ввел пароль — готово. Либо, создать свой VPN на базе облачных решений. Для бизнес-пользователей в Украине, есть готовая сеть VPN для защиты RDP, по доступной цене.
Сами растраты на организацию RDP сервера для клиентов в таких фирмах – уже достижение. А тут еще нужен производительный роутер, нужно организовать поддержку пользователей.

Итак, небольшая фирма с RDP сервером наружу.

Первый признак работы сканеров – большое количество неудачных событий 4625 (An account failed to log on) в которых указаны различные распространенные имена пользователей.

Необходимо позаботится чтобы пароль действительно не подобрали. Для этого нужен комплекс мер:

  • имена пользователей не должны быть стандартными
  • пароль должен быть сложным
  • количество неудачных попыток входа для пользователя должно быть ограничено

Как минимум нужно настроить в групповой локальной или доменной политике следующие параметры:


Computer Configuration\Security Settings\Local Policies\Account Policies\Password Policy

Minimum password length = 9

Password must meet complexity requirements = Enabled

Computer Configuration\Security Settings\Local Policies\Account Policies\Account Lockout Policy

Account lockout threshold = 5

Reset account lockout counter after = 30

Account lockout duration = 30

Так же необходимо выставить параметры безопасности на уровне RDP:

Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Security

Require secure RPC communication = Enabled

Require use of specific security layer for remote (RDP) connections = SSL

Require user authentication for remote connections by using Network Level Authentication = Enabled

Set client connection encryption level = High

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

Это хорошо, но не снимает нагрузку на сервер из-за обработки неуспешных аутентификаций. При интенсивном переборе вероятна ситуация, в которой вместе с паразитными запросами будут отбрасываться и попытки входа реальных пользователей, которые будут получать отказы на вход через RDP, несмотря на правильно введенные логин и пароль.

Признаком данной ситуации станут события 5817 "Netlogon has failed an additional 129 authentication requests in the last 30 minutes. The requests timed out before they could be sent to domain controller \\server.ourdomain.local in domain OURDOMAIN."

Первый «метод защиты» – изменение стандартного RDP-порта 3389 на нестандартный. Настройки находятся в реестре:

KEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber

для применения нужен рестарт сервера.

Однако, по опыту замечено, что сканеры успешно обрабатывают данную ситуацию и через день-два новый порт уже вовсю сканируют.

Второй шаг, сделать на уровне маршрутизатора блокировку IP если с него создано некое количество сессий за единицу времени (если это возможно на вашем роутере).

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

На линуксе существует утилита fail2ban парсящая логи и блокирующая на уровне firewall адреса с которых происходит много неуспешных попыток входа. 

Не то чтобы утилита, но вариант решения (это больше концепт идеи, чем рабочий вариант): fail2ban в виде скрипта.
Правда тема старая, решение костыльное (использования IPSec не по назначению). А ещё оно на VBScript :). Но решение вполне рабочее (было по крайней мере) :). Помню что проверял его на сервере и оно работало.

Можно использовать что-то подобное под Windows Server используя Powershell.

Определим переменные:

# количество неуспешных попыток за единицу времени при которых IP блокируется

# с единицей времени определимся ниже

$ban_treshold = 5

# продолжительность блокировки в часах

$ban_duration = 24

# инициализируем массивы в которых будут добавляться IP для блокировки

$ip2ban = @()

$ip2ban_str = @()

В нашем случае с параметром групповой политики Require use of specific security layer for remote (RDP) connections = SSL и включенным NLA события 4625 не будут содержать IP источника. И для Server 2008, чтобы видеть в событиях 4625 источник перебора прийдется ставить менее защишенный security layer = RDP.

Server 2012 более продвинутый, можно использовать настройки SSL+NLA и при этом ориентироваться на события 140 ( A connection from the client computer with an IP address of xxx.xxx.xxx.xxx failed because the user name or password is not correct. ) в Applications and Services Logs. Не путайте с NTFS событиями 140 ( The system failed to flush data to the transaction log. ) появляющимися в логе System.

# получаем события

$evt140 = Get-WinEvent -ProviderName Microsoft-Windows-RemoteDesktopServices-RdpCoreTS|?{$_.id -eq 140}

# пишем в лог

"--- Get-WinEvent $ban_date_str" >> $log_file

# группируем события по IP, фильтруем по количеству, определенному в ban_treshold и записываем в массив

$ip2ban = $evt140.properties.value|Group-Object|?{$_.count -ge $ban_treshold}|select name,count

# пишем в лог IP определенные для блокировки и для информации количество попыток

$ip2ban|%{ "#block_ip "+$_.name+" "+$_.count >> $log_file }

Самое важное – список IP для блокировки (он у вас должен быть). Теперь нужно очистить лог от событий, чтобы не анализировать их при последующих запусках скрипта и создать правила для firewall.

# проверяем что список IP не пустой

if($ip2ban.count -gt 0){

# очищаем лог

  get-winevent -ListLog Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational| % { [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog($_.LogName) }

  $ip2ban|%{$ip2ban_str+=$_.name.tostring()}

# создаем правило firewall

  New-NetFirewallRule -DisplayName "RDP_DYN_BAN_$ban_date_str" -Enabled "True" -Profile Any -Direction Inbound -Action Block -RemoteAddress $ip2ban_str -Protocol TCP

# пишем в лог имя созданного правила

  "--- New-NetFirewallRule RDP_DYN_BAN_$ban_date_str" >> $log_file

}

Как только правила начинают накапливаться, чтобы их не стало сильно много, нужно удалять правила, которые старше ban_duration.

# читаем текущие правила

$current_frs = Get-NetFirewallRule -DisplayName RDP_DYN_BAN*

$current_frs|%{

# переводим строковое имя правила в datetime

  $date_frs=[datetime]::parseexact($_.displayname, 'RDP_DYN_BAN_ddMMyyyy_HHmmss',$null)

# если разница в часах больше ban_duration удаляем правило

  if( ((get-date) - $date_frs).totalhours -ge $ban_duration ){

    "--- Remove-NetFirewallRule -Displayname "+$_.displayname  >> $log_file

    $_|Remove-NetFirewallRule -Confirm:$false

  }

}

Осталось настроить запуск скрипта в планировщике, например, каждый час или 30 минут. Это и будет единицей времени для ban_treshold определенной нами в скрипте.

В идеале скрипт нужно доработать, должны создаваться не правила для firewall операционной системы, а командные файлы на сетевое оборудование, чтобы вредные пакеты даже не попадали внутрь сети.

VPN — единственно правильный вариант защиты от подбора паролей через RDP. Сейчас есть очень простые и удобные VPN клиенты, буквально запустил — ввел пароль — готово. Pulse Secure, является готовым решением для организации VPN без лишних хлопот. Если совсем никак не получается реализовать VPN — ставить блокировку учетной записи при неправильном вводе пароля, например 5 раз на 30 минут — помогает, хотя это и не полноценное решение.

Есть интересное и бесплатное программное решение: Cyberarms Intrusion Detection and Defense Software (IDDS) Есть инструкция: «Устанавливаем и настраиваем Cyberarms Intrusion Detection and Defense Software (IDDS)».

Работает не только с RDP, но и может отслеживать:

  • FTP
  • RRAS — Routing and Remote Access
  • Kerberos pre-authentication
  • AD Credential Validation
  • Windows Base
  • FileMaker
  • SMTP
  • SQL Server

И как вариант, можно рассмотреть RdpGuard, что достаточно актуально будет для облачных виртуальных серверов.

Для любителей держать открытым RPD в Интернет, рекомендую ознакомиться: https://www.ptsecurity.com/ru-ru/about/news/zloumyshlenniki-mogut-poluchit-dostup-k-kazhdomu-desyatomu-otkrytomu-udalennomu-rabochemu-stolu/

Дополнительная информация и вариант решения для защиты от перебора паролей RDP с блокировкой IP правилами Windows Firewall: https://winitpro.ru/index.php/2019/10/02/blokirovka-rdp-atak-firewall-powershell/

Для блокировок IP, ознакомьтесь с решением IPBan:

Добавлено 27.01.2021

Имел возможность реализовать защиту RDP соединения, при помощи готового решение для реализации двухфакторной аутентификации с защитой RDP от ESET (ESET Secure Authentication для защиты локального или удаленного входа в систему через протокол RDP).

Ссылки на получение пробной лицензии и загрузки для пользователей РФ.

Заявка на получение ключа активации (бесплатная триал версия на 30-ть дней): https://www.esetnod32.ru/download/business/trial/?from=esa#download-business-trial

Загрузка последнего дистрибутива ESET Secure Authentication: https://www.esetnod32.ru/download/business/commercial/access/

Ссылка на решение ESET Secure Authentication, для пользователей Украины.

https://www.eset.com/ua/business/secure-authentication/

Ссылка на загрузку: https://www.eset.com/ua/business/secure-authentication/download/

Есть простое и понятное видео, которое сам использовал при настройке ESET Secure Authentication.

Добавлено 19.02.2021

Есть ряд базовых советов, по защите от атак шифровальщиков и неизвестных угроз:

Добавлено 04.07.2021

Есть доступное по цене и надежное решение с готовым виртуальным сервером VPN для бизнеса, которое можно развернуть буквально за считанные минуты. Услуга предоставляется только для юридических лиц Украины. Узнать больше...

Бизнес-предложение для фирм, предприятий, частных лиц и организаций (облачные решения).

Резервное копирование данных, защита данных от потерь, организация удаленного офиса для сотрудников, настройка бухгалтерии в облаке, VDS/VPS, опытная и отзывчивая поддержка, обслуживание и сопровождение на базе TUCHA.UA. Данное предложение актуально для коммерческих и государственных структур. Узнать больше... Услуги предоставляются данной компанией по СНГ и за пределами (Европа, США).

Добавлено 21.10.2021

На сайте winitpro в обсуждении статьи, один из пользователей, поделился своим рабочим скриптом, который:

  • не зависит от языка системы и кодировок
  • сохраняет логи
  • проверяет на повторяющиеся IP адреса и отсекает их

Скрин на комментарий:

Сам скрипт:

$Attempts = 5 # За сколько попыток блокировать
$Hours = 1 # За какое время считать попытки
$RDPPort = "3389" # Блокируемый порт, стандартный - 3389
$NameRule = "BlockRDPBruteForce" # Название правила брандмауэра
$log = "blocked_ip_rdp.txt" # Лог-файл (можно указать вместе с путём к файлу)

# Проверяем наличие правила в брандмауэре и создаём его, если отсутствует
if($null -eq (Get-NetFirewallRule -DisplayName $NameRule -ErrorAction SilentlyContinue)){New-NetFirewallRule -DisplayName "$NameRule" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort $RDPPort -Action Block}
# Получаем список системных сообщений с неудачными попытками за указанное время
$badRDPlogons = Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational';ID='140';StartTime=([DateTime]::Now.AddHours(-$Hours))}
# Получаем новые IP адреса с неудачными попытками авторизации за указанное время
$getip = $badRDPlogons.Properties | group-object -property value | where {$_.Count -gt $Attempts} | Select -property Name
# Получаем список IP из текущего правила брандмауэра
$current_ips = (Get-NetFirewallRule -DisplayName "$NameRule" | Get-NetFirewallAddressFilter ).RemoteAddress -split(',')
# Проверяем найденные IP среди уже заблокированных и формируем итоговый список IP
$ip = $getip | where { $getip.Name.Length -gt 1 -and !($current_ips -contains $getip.Name) }
$ip | % {
$current_ips += $ip.name
# Записываем информацию в лог-файл
'['+(Get-Date).ToString() + '] IP ' + $ip.name + ' blocked for ' + ($badRDPlogons | where { $_.IpAddress -eq $ip.name }).count + ' unsuccessful attempts in ' + $Hours + ' hour(s).' >> $Log}
# Обновляем правило брандмауэра
Set-NetFirewallRule -DisplayName "$NameRule" -RemoteAddress $current_ips

Ссылка на источник скрипта, приведена выше. Смотрите внимательно комментарии к статье по ссылке.

Добавить 15.05.2022

Полезная заметка добавлена: Настройка двухфакторной аутентификации (2FA) в Windows с помощью MultiOTP.

2 Комментарии

  1. По поводу fail2ban в виде скрипта: я так понимаю он для англоязычной версии виндовс (у меня ругается "ParseExact") я так понимаю на региональные настройки дата-время. Подскажите пожалуйста, как запустить скрипт на русской виндовс? (для меня PS-синяя cmd)

    ОтветитьУдалить
    Ответы
    1. Для русской версии ОС, необходимо использовать кодировку 1251. Скорее всего, должно помочь. К сожалению, нет возможности проверить точно. Вообще, приводил в данной заметке ссылку на вариант. Позволяет автоматически блокировать в брандмауэре Windows IP адреса, с которых происходят попытки перебора паролей к RDP. Обратите внимание на комментарии к статье. Там есть несколько вариантов скриптов от пользователей, в том числе и для русской версии ОС с автоматическим выбором языка.

      Есть еще несколько решений. Использование готовой программы, которая создает правила в брандмауэре Windows. Легко устанавливается и настраивается.
      «Устанавливаем и настраиваем Cyberarms Intrusion Detection and Defense Software (IDDS).» Это аналог fail2ban, с удобным интерфейсом.

      И второй способ, при помощи утилиты IPBan. Данная утилита, позволяет реализовать то, что указано в данной заметке посредством скрипта fail2ban в Powershell, только более простым и понятным способом.

      На мой взгляд, эти способы проще и быстрее, чем использовать скрипт из данной заметки или по ссылке из статьи, что привел в начале комментария.
      К сожалению, оба варианта – далеко не идеальны (как и использование скриптов).

      При этом, стоит по возможности, использовать VPN. Это более надежная защита, особенно при атаках шифровальщиков.

      Удалить
Новые Старые