Защита rdp подключения от брутфорса при помощи ipban

▍Слабости RDP

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

Злоумышленники часто специально ищут слабые места RDP-серверов, чтобы использовать их в своих целях. Так, RDP нередко подвергается брутфорс-атакам. Кроме того, за последние два года специалисты обнаружили серьезные RCE-уязвимости, связанные с RDP.

Брутфорс-атаки

Самые распространенные атаки на RDP — атаки типа брутфорс. Их можно условно разделить на несколько групп.

  1. Простейшие атаки, которые заключаются в подборе элементарных паролей без использования каких-либо инструментов автоматизации.
  2. Атаки по словарю, во время которых запускается перебор всевозможных паролей для предполагаемого имени пользователя.
  3. Гибридные атаки, которые включают использование словарей, но каждый пароль проверяется не только в словарной форме, но и после ряда простых модификаций.
  4. Password spraying, во время которых для известного пароля перебираются миллионы имен пользователей, пока не найдется совпадение.
  5. Credential stuffing, при которых для перебора злоумышленники используют список скомпрометированных учетных данных пользователей.

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

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

В то же время про атаки password spraying и credential stuffing зачастую забывают. Однако подобные атаки сейчас не редкость, а, напротив, скорее стали обыденностью. Бороться с ними помогает блокировка IP-адресов, с которых производятся множественные неудачные попытки входа по RDP. Также не станет лишним запрет на повторное использование паролей. Кроме того, не стоит использовать один и тот же пароль на нескольких ресурсах.

Уязвимости

С 2019 года было обнаружено несколько серьезных RCE-уязвимостей, связанных с RDP. Их эксплуатация приводит к удаленному исполнению кода на целевой системе.

Уязвимость CVE-2019-0708, получившую название BlueKeep, обнаружили не в самом протоколе RDP, а в реализации службы удаленных рабочих столов (Remote Desktop Service). Данная уязвимость позволяет неаутентифицированному пользователю удаленно исполнить произвольный код на целевой системе. Уязвимости подвержены старые версии Windows: начиная с Windows XP (Windows Server 2003) и заканчивая Windows 7 (Windows Server 2008 R2). Для ее успешной эксплуатации необходимы лишь сетевой доступ к компьютеру с уязвимой версией Windows и запущенная служба RDP. Для этого злоумышленник отправляет специально сформированный запрос к службе по RDP, что позволяет атакующему удаленно выполнить произвольный код на целевой системе. Информация о BlueKeep была опубликована в мае 2019 года, но уязвимыми до сих пор остаются более 289 тысяч RDP-серверов.

Уязвимости CVE-2019-1181/1182/1222/1226 практически аналогичны BlueKeep. Однако если предыдущей уязвимости были подвержены лишь старые версии Windows, то теперь под угрозой оказались и все новые версии ОС. Для эксплуатации уязвимостей злоумышленнику также достаточно отправить специально сформированный запрос к службе удаленных рабочих столов целевых систем, используя протокол RDP, что позволит выполнить произвольный код. Эти уязвимости были опубликованы в августе 2019 года.

Еще одна уязвимость — BlueGate (CVE-2020-0609/0610) — была найдена в компоненте Windows Remote Desktop Gateway в Windows Server (2012, 2012 R2, 2016 и 2019). Она также позволяет злоумышленникам посредством RDP и специально созданных запросов осуществлять удаленное выполнение кода на целевой системе. BlueGate была опубликована в начале 2020 года.

Обзор Windows Server Core

Windows Server Core представляет собой дистрибутив Windows Server 2008/2012 без предустановленного графического окружения (UI). Этот дистрибутив не использует многие системные сервисы, необходимые для функционирования графического интерфейса и, соответственно, лишен ряда уязвимостей, связанных с работой этих сервисов. Еще одно преимущество Windows Server Core – минимальная нагрузка на аппаратные ресурсы сервера. Это делает ее отличным выбором для установки на виртуальные машины. 

К сожалению, на сегодняшний день для Server Core поддерживаются только некоторые функции Windows Server, ввиду чего эту систему еще нельзя назвать полноценной. Возможно, в скором будущем ситуация изменится. 

P. S. Другие инструкции:

  • Windows Server 2008: создание нового пользователя
  • Изменение пароля в RDP-сессии Windows Server 2008, 2012
  • Настройка проброса принтера через RDP
  • Перенос файлов на VDS с локального компьютера

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

Удалить существующее правило брандмауэра

Наконец, мы хотели бы удалить существующее правило, поскольку оно может больше не понадобиться. Для этого запустите команду Remove-NetFirewallRule. При этом часто бывает целесообразно использовать параметр WhatIf, чтобы убедиться, что правило является правильным для удаления.

Remove-NetFirewallRule -DisplayName «Блокировать WINS»

Важно отметить, что Remove-NetFirewallRule может удалить сразу несколько правил. Пример этого типа функциональности приведен ниже

Приведенное ниже правило удалит все отключенные правила, содержащиеся в политике firewall_gpo в домене ad.local.test.

Remove-NetFirewallRule -Enabled ‘False’ -PolicyStore ‘ad.local.test \ firewall_gpo’

Полезная, но потенциально опасная команда запускает Remove-NetFirewallFule сама по себе, которая удаляет все статические правила локального брандмауэра, которые были созданы. Если у вас есть объект групповой политики домена, который определяет правила брандмауэра, он удалит все, что может конфликтовать с правилами, определенными этим объектом групповой политики.

Примеры задания настроек брандмауэра

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

$errRTN=netsh firewall set service remoteAdmin enable
if($errRTN -match 'ok')
   { Write-Host -ForegroundColor green "Remote admin enabled" }
   ELSEIF($errRTN -match 'requires elevation')
   { Write-Host -ForegroundColor red "Remote admin not enabled" `
     "The operation requries admin rights"}
    ELSE
     { Write-Host -ForegroundColor red "Remote admin not enabled" `
       "The error reported was $errRTN" }

Включение общих папок

$errRTN=netsh firewall set service fileAndPrint enable
if($errRTN -match 'ok')
   { Write-Host -ForegroundColor green "Shared folders enabled" }
   ELSEIF($errRTN -match 'requires elevation')
   { Write-Host -ForegroundColor red "Shared folders not enabled" `
     "The operation requries admin rights"}
    ELSE
     { Write-Host -ForegroundColor red "Shared folders not enabled" `
       "The error reported was $errRTN" }

Использование Credential Manager (Диспетчер учетных данных)

Многие знают, что пароли от сетевых дисков (и многие другие) хранятся в специальном месте под названием Credential Manager. В панели управления он выглядит так:

Мы можем получить доступ к этим объектам использовав модуль CredentialManager. Этот модуль не относится к стандартным и устанавливается отдельно:

У вас могут появится два уведомления говорящие об установке репозитория NuGet и о том, что он является не доверенным.

У нас станут доступны 4 команды:

  • Get-StoredCredential — получает учетные данные из хранилища;
  • Get-StrongPassword — генерирует случайный пароль;
  • New-StoredCredential — создает учетные данные;
  • Remove-StoredCredential — удаляет учетные данные.

Далее мы сможем получить все учетные данные указав нужный тип в атрибуте Type или  Target (источник) которому эти данные принадлежат:

Мы получаем объект типа PSCredential, который мы можем использовать в командах. Создавать новые учетные данные и добавлять их в хранилище CredentialManager мы тоже можем:

Кроме логина и пароля мы указываем:

  • Target — кому принадлежит учетная запись. Проще говоря имя компьютера;
  • Type — тип учетной записи;
  • Persist — тип хранения. Может быть session (временной), localmachine (сохраненной) и enterprise(как я понимаю это тип перемещаемый, например с MS Passport).

Первые два пункта особого значения не имеют. Они предназначены для программ, которые получают пароли по определенным идентификаторам. В ваших скриптах вы выбираете идентификаторы для себя.

Так же у меня была ошибка ‘New-StoredCredential : CredWrite failed with the error code 1312’. Эта ошибка проявляет себя только в удаленных сессиях PSSession. Если вы работаете локально — то она не проявляется. Причина ошибки и ее решение — пока не ясно (нет ответа на github).

Правила защиты от брутфорс — атак на SSH и PPTP

Как и говорилось выше, блокировать будем ip — адреса, с которых было четыре запроса на соединение с интервалом менее одной минуты.

Для этого создадим: 

  • по 4 правила в IP-Firewall-Filter для SSH и для PPTP, которые будут добавлять ip-адреса для блокировки в список blacklist
  • правило блокировки в для всех ip-адресов из списка blacklist

Правила для SSH

Правила для PPTP

правило для блокировки ip-адресов из списка «blacklist»

 Детальное описание правил

Для понимания детально рассмотрим каждую строку правил для SSH и правило блокировки ip-адерсов из списка «blacklist».Начнём с привил для SSH. Строки будем рассматривать с конца. Начнем с четвертой.

строка 4

Этой строкой «говорим» микротику добавить на одну минуту (address-list-timeout=1m) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=ssh_stage1)

строка 3

Этой строкой «говорим» микротику добавить на одну минуту (address-list-timeout=1m) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=ssh_stage2), если этот ip-адрес уже находится в списке ssh_stage1 (src-address-list=ssh_stage1)

Аналогично добавляем в список ssh_stage3 — строка 2

строка 1

Этой строкой «говорим» микротику добавить на десять дней (address-list-timeout=10d) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=blacklist), если этот ip-адрес уже находится в списке ssh_stage3 (src-address-list=ssh_stage3)

Блокировка ip-адресов из списка «blacklist»

После того как мы создали правила заполнения списка «blacklist», нужно добавить правило блокировки всех ip-адресов, входящих в него. Для этого нужно правильно выбрать цепочку, в которой будем осуществлять блокировку, и вид блокировки. 

Цепочку предлагаю выбрать PREROUTING. Обратите внимание, что есть RAW PREROUTING и MANGLE PREROUTING.  В нашем случае используется RAW PREROUTING, так как эта обработка идет первой. Это позволит снизить нагрузку на процессор.В официальной документации предлагают делать правило в цепочке INPUT

Возможно, это сделано для того, чтобы было удобней управлять правилами в разделе «IP-Firewall-Filter Rules».

Как загружать переменную с учетными данными при открытии Powershell

В Powershell есть возможность загружать переменные (и другие данные) при открытии самой консоли. Например мы сможем единожды объявить переменные ‘$credential_local’, ‘$credential_domain’, ‘$credential_forest’ и каждый раз открывать консоль Powershell они сами будут импортироваться. 

Первое что нужно сделать — проверить существования файла ‘Microsoft.PowerShell_profile.ps1’, который является профилем Powershell. Путь до этого файла лежит следующей переменной (если работаете в сессии PSsession — ничего не вернется):

Если этого файла нет — его нужно создать (c PS 6+ он должен создаваться автоматически):

В этот файл мы помещаем один из скриптов написанных выше:

Теперь, открывая консоль, вы всегда сможете вызвать эту переменную:

Рекомендую

Не предоставляйте общий доступ к директориям без ввода пароля, разграничивайте права общего доступа

Никогда не разрешайте подключение к общим папкам сервера без ввода пароля и анонимный доступ. Это исключит возможность простого получения несакционированного доступа к вашим файлам. Даже если эти файлы сами по себе не имеют никакой ценности для злоумышленника, они могут стать «окном» для дальнейшего вторжения, так как пользователи вашей инфраструктуры, вероятнее всего, доверяют этим файлам и вряд ли проверяют их на вредоносный код при каждом запуске.

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

Экспорт параметров адаптера в Excel

$strPath="c:\fso\netAdapter.xls"
$objExcel=New-Object -ComObject Excel.Application
$objExcel.Visible=-1
$WorkBook=$objExcel.Workbooks.Add()
$sheet=$workbook.worksheets.item(1)
 
$x=2
 
$Computer = $env:computerName
$objWMIService = Get-WmiObject -class win32_NetworkAdapter `
   -computer $Computer
for($b=1 ; $b -le 10 ; $b++)
  {$sheet.Cells.item(1,$b).font.bold=$true}
$sheet.Cells.item(1,1)=("Name of Adapter")
$sheet.Cells.item(1,2)=("Interface Index")
$sheet.Cells.item(1,3)=("Index")
$sheet.Cells.item(1,4)=("DeviceID")
$sheet.Cells.item(1,5)=("AdapterType")
$sheet.Cells.item(1,6)=("MacAddress")
$sheet.Cells.item(1,7)=("netconnectionid")
$sheet.Cells.item(1,8)=("NetConnectionStatus")
$sheet.Cells.item(1,9)=("NetworkAddresses")
$sheet.Cells.item(1,10)=("PermanentAddress")
 
ForEach ($objNet in $objWMIService)
{
    $sheet.Cells.item($x, 1)=($objNet.Name)
    $sheet.Cells.item($x, 2)=($objNet.InterfaceIndex)
    $sheet.Cells.item($x, 3)=($objNet.index)
    $sheet.Cells.item($x, 4)=($objNet.DeviceID)
    $sheet.Cells.item($x, 5)=($objNet.adapterType)
    $sheet.Cells.item($x, 6)=($objNet.MacAddress)
    $sheet.Cells.item($x,7)=($objNet.netconnectionid)
    $sheet.Cells.item($x,8)=($objNet.NetConnectionStatus)
    $sheet.Cells.item($x,9)=($objNet.NetworkAddresses)
    $sheet.Cells.item($x,10)=($objNet.PermanentAddress)
 
    If($objNet.AdapterType -notMatch 'ethernet')
    {
     $sheet.Cells.item($x,5).font.colorIndex=3 # 32 is blue 16 silver/gray 8 is Aqua, 4 is green, 3 is red
     $sheet.Cells.item($x,5).font.bold=$true
    }
    $x++
}
 $range = $sheet.usedRange
 $range.EntireColumn.AutoFit()
 
IF(Test-Path $strPath)
  { 
   Remove-Item $strPath
   $objExcel.ActiveWorkbook.SaveAs($strPath)
  }
ELSE
  {
   $objExcel.ActiveWorkbook.SaveAs($strPath)
  }

Как добавить исключение в брандмауэр Windows 10

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

К сожалению, алгоритмы штатного брандмауэра несовершенны, поэтому он не способен с точностью определить, является ли трафик безопасным. Следствием этого может стать ошибочная блокировка безопасных и полезных программ или игр. Некоторые приложения, например, популярный торрент-клиент uTorrent, умеют добавлять себя в исключения брандмауэра Windows 10. Но все же большинство программ приходится вносить в список исключений фаервола вручную.

Это довольно простая процедура, тем не менее, у начинающих пользователей она может вызвать некоторые сложности. Разрешить, или напротив, запретить подключение для той или иной программы можно в упрощенном режиме и режиме повышенной безопасности. Второй способ удобен тем, что позволяет разрешать или блокировать соединение отдельно для исходящего и входящего трафика. В этой статье мы покажем, как добавить программу в исключения брандмауэра Windows 10 с использованием обоих методов.

Упрощенный способ

Откройте брандмауэр из классической Панели управления или командой firewall.cpl и нажмите в меню слева ссылку «Разрешение взаимодействия с приложением…».

В следующем окне нажмите кнопку «Изменить параметры», а после того как управление списком разрешенных приложений станет доступным, нажмите «Разрешить другое приложение».

Укажите в открывшемся окошке через стандартный обзор исполняемый файл программы, которую хотите внести в исключения брандмауэра Windows 10.

Когда приложение появится в списке, вам нужно будет указать, для какой сети будет действовать разрешение – частной или публичной. Тип вашей сети можете посмотреть в разделе «Управление сетями и общим доступом», а так, если сомневаетесь в выборе, установите обе галочки. Почти всё готово, осталось только сохранить изменения, нажав кнопку «ОК».

Добавление исключений в безопасном режиме

Теперь разберем, как добавить приложение в исключения брандмауэра Windows 10 в режиме повышенной безопасности. Этот способ является более гибким, так как позволяет разрешать или блокировать подключения отдельно для разных программ, портов, профилей и даже конкретных IP-адресов.

Рассмотрим процедуру на простом примере. Чтобы запустить брандмауэр в режиме повышенной безопасности, откройте его сначала в стандартном режиме и нажмите слева в меню ссылку «Дополнительные параметры». Также вы можете воспользоваться быстрый командой wf.msc.

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

Добавим исключение в брандмауэр Windows 10 для входящего подключения программы Архивариус. Выделите в меню слева нужную опцию, а затем в меню справа нажмите «Создать правило». При этом откроется окно мастера, в котором вам будет предложено указать тип правила. Поскольку разрешать мы будем программу, оставляем активной радиокнопку «Для программы».

Жмём «Далее» и указываем путь к исполняемому файлу приложения.

Опять нажимаем «Далее» и в качестве действия выбираем «Разрешить подключение».

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

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

После нажатия кнопки «Готово» правило появится в списке в средней колонке окна брандмауэра.

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

Как отследить, какой процесс блокирует учётную запись домена

Итак, мы выяснили, с какого компьютера или сервера была заблокирована учётная запись. Теперь было бы здорово узнать, какая программа или процесс являются источником блокировки учётной записи.

Часто пользователи начинают жаловаться на блокировку своих учётных записей домена после изменения паролей. Это говорит о том, что старый (неправильный) пароль сохраняется в определённой программе, скрипте или службе, которая периодически пытается аутентифицироваться на контроллере домена с неверным паролем. Рассмотрим наиболее распространённые места, в которых пользователь мог сохранить старый пароль:

  • Подключённые сетевые диски (через net use);
  • Работы Windows Task Scheduler (Планировщика заданий Windows);
  • Службы Windows, настроенные для запуска из учётной записи домена;
  • Сохранённые учётные данные в Credential Manager (Диспетчере учётных данных) (в Панели управления);
  • Браузеры;
  • Мобильные устройства (например, те, которые используются для доступа к корпоративному почтовому ящику);
  • Программы с автоматическим входом или настроенная функция автоматического входа в Windows;
  • Отключённые/незанятые сеансы RDP на других компьютерах или серверах RDS (поэтому рекомендуется установить ограничения для сеансов RDP);

Подсказка: существует ряд сторонних инструментов (в основном коммерческих), которые позволяют администратору проверять удалённый компьютер и определять источник блокировки учётной записи. В качестве достаточно популярного решения отметим Lockout Examiner от Netwrix.

Чтобы выполнить подробный аудит блокировки учётной записи на найденном компьютере, необходимо включить ряд локальных политик аудита Windows. Для этого откройте локальный редактор групповой политики (gpedit.msc) на компьютере (на котором вы хотите отслеживать источник блокировки) и включите следующие политики в разделе Computer Configurations → Windows Settings → Security Settings → Local Policies → Audit Policy:

  • Audit process tracking: Success , Failure
  • Audit logon events: Success , Failure

В русскоязычной версии это соответственно: Конфигурации компьютера → Конфигурация Windows → Параметры безопасности → Локальные политики → Политика аудита:

  • Аудит отслеживания событий: Успех, Отказ
  • Аудит событий входа в систему: Успех, Отказ

Дождитесь следующей блокировки учётной записи и найдите события с идентификатором события 4625 в журнале безопасности. В нашем случае это событие выглядит так:

An account failed to log on.
Failure Reason: Account locked out.

На русском это:

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

Как видно из описания события, источником блокировки учётной записи является процесс mssdmn.exe (компонент Sharepoint). В этом случае пользователю необходимо обновить пароль на веб-портале Sharepoint.

После завершения анализа и выявления и устранения причины блокировки не забудьте отключить локальные политики аудита.

Если вам по-прежнему не удаётся найти источник блокировки учётной записи на определённом компьютере, просто попробуйте переименовать имя учётной записи пользователя в Active Directory. Обычно это наиболее эффективный метод защиты от внезапных блокировок конкретного пользователя, если вы не смогли установить источник блокировки.

Вы также можете вывести список событий с кодом 4625 в PowerShell:

Get-WinEvent -FilterHashtable @{ LogName='Security'; Id='4625'; }

Следующую команду вы можете использовать для вывода событий блокировки для конкретного пользователя (впишите его вместо MiAl):

Get-WinEvent -FilterHashtable @{ LogName='Security'; Id='4625'; Data="MiAl" }

Следующая команда выведет подробную информацию о каждом событии блокировки для указанного пользователя (в том числе процесс, вызвавший блокировку):

Get-WinEvent -FilterHashtable @{ LogName='Security'; Id='4625'; Data="MiAl" } | Format-List

Эта команда аналогична предыдущей, но покажет события только за последние 2 дня:

$Date = (Get-Date).AddDays(-2); Get-WinEvent -FilterHashtable @{ LogName='Security'; Id='4625'; Data="MiAl"; StartTime=$Date; } | Format-List

Изолируйте серверные роли и отключайте неиспользуемые сервисы

Одна из основных задач предварительного планирования безопасности серверной инфраструктуры заключается в диверсификации рисков поражения критически важных сегментов инфраструктуры при успешных атаках на отдельные узлы. Чем больше ролей берет на себя каждый узел, тем более привлекательным объектом для атак он становится и тем более серьезные последствия может иметь поражение этого узла. Для минимизации таких рисков необходимо, во-первых, разграничивать критически важные роли серверов на стадии развертывания инфраструктуры (при наличии такой возможности), а во-вторых, отключать на серверах сервисы и роли, в использовании которых нет реальной необходимости. 

В идеале, один сервер должен выполнять одну конкретную функцию (Контроллер домена, файловый сервер, терминальный сервер и т.д.). Но так как на практике такая диверсификация ролей редко оказывается возможной в полной мере. Тем не менее, вы можете разграничить функции машин настолько, насколько это возможно.

Для изоляции ролей необязательно использовать выделенные серверы для каждой конкретной задачи. Вы вполне можете использовать для части ролей виртуальные машины, настроив параметры их безопасности требуемым образом. На сегодняшний день технологии виртуализации позволяют не испытывать ощутимых ограничений в функциональности виртуальных хостов и могут предложить высокий уровень производительности и стабильности. Грамотно сконфигурированная виртуальная инфраструктура вполне может являться полноценной альтернативой дорогостоящей «железной» для желающих диверсифицировать риски серьезных поражений. 

Мы, команда облачного сервиса 1cloud.ru, со своей стороны не ограничиваем самостоятельное создание клиентом виртуальных машин на арендуемых у нас виртуальных серверах. Если вы желаете установить виртуальную машину Windows на своем сервере, просто обратитесь в нашу техническую поддержку с запросом соответствующей опции.

Защищаем RDP Windows Server без VPN 0

  • 15.04.21 11:00


VFedorV

#548212

Хабрахабр

12300

Информационная безопасность, Серверное администрирование, Хостинг

Часто у наших клиентов (обычно это небольшие организации без собственной IT службы) возникает необходимость предоставить доступ к своему серверу терминалов (о настройке и обеспечении отказоустойчивости будет отдельная статья) через глобальную сеть Интернет. Мы конечно же советуем так не делать, а использовать для подключения VPN (рекомендуем любимый нами SoftEther VPN Server), но если уж клиент настаивает, то стараемся максимально его обезопасить. И вот как раз про средства, которыми мы этого достигаем и пойдет речь в этой статье…

Фильтрация и отключение служб через Services

Как я и писал выше, все что вы не используете вы должны отключить, в моем случае, мне для управления моим MikroTik RB4011iGS достаточно веб интерфейса, поэтому я отключу: ftp, ssh, telnet. Для этого слева есть столбец с кнопкой «D».

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

Пробуем проверить доступность порта из Германии, как видим 22 порт SSH закрыт, это хорошо, значит его больше не будут брутфорсить.

Если вы используете, например SSH, но хотите его оградить от перебора паролей, то вы можете пойти на хитрость и разрешить обращение к нему, только с определенной сети или IP-адреса. Для этого на включенной службе, щелкните два раза. В результате чего у вас откроется редактор правила фильтрации, где вам в поле «Port» необходимо указать по какому порту будет работать служба, для большей безопасности советую менять стандартные значения, на диапазон после 1024 и в поле «Avaliable From» указать сеть или IP-адрес, кому будет разрешено. Сохраняем правило.

В итоге у меня получилось вот так, пробуем проверить с другого IP доступ до служб.

Самое интересное, что порт при SSH при проверке с внешнего сервера показывал статус «Open», что слегка обескураживало

Но если вы попытаетесь подключиться через клиента Putty или его аналоги, то увидите ошибку подключения «Network error: Software caused connection abort», что доказывает, что созданное правило фильтрации на уровне службы работает.

Пробовал настроить фильтрацию служб и через WinBox, но результат тот же

Устранение проблем политики и предпочтений

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

Изменение политики выполнения для Import-PSSession и Import-Module

Командлеты и создают модули, которые содержат неподписанные файлы скриптов и файлы форматирования.

Чтобы импортировать модули, созданные этими командлетами, с помощью или , политика выполнения в текущем сеансе не может быть ограничена или AllSigned. Дополнительные сведения о политиках выполнения PowerShell см. в разделе about_Execution_Policies.

Чтобы импортировать модули без изменения политики выполнения для локального компьютера, установленного в реестре, используйте параметр Scope параметра, чтобы задать менее ограниченную политику выполнения для одного процесса.

Например, следующая команда запускает процесс с политикой выполнения. Изменение политики выполнения влияет только на текущий процесс и не изменяет параметр реестра PowerShell ExecutionPolicy .

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

Дополнительные сведения о политиках выполнения см. в разделе about_Execution_Policies. Для получения дополнительных сведений введите .

Как задать и изменить квоты

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

В базовой конфигурации доступны следующие квоты.

  • Поставщик WSMan (WSMan:) предоставляет несколько параметров квот, таких как параметры максенвелопесизекб и макспровидеррекуестс в узле, а также параметры максконкуррентоператионс, свойств maxconcurrentoperationsperuser и MaxConnections в узле.

  • Защитить локальный компьютер можно с помощью параметров максимумрецеиведдатасизеперкомманд и максимумрецеиведобжектсизе командлета и переменной предпочтений.

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

При конфликте квот с помощью команды PowerShell создает ошибку.

Чтобы устранить эту ошибку, измените удаленную команду так, чтобы она соответствовала квоте. Или определите источник квоты, а затем увеличьте квоту, чтобы завершить выполнение команды.

Например, следующая команда увеличивает квоту размера объекта в конфигурации сеанса Microsoft. PowerShell на удаленном компьютере с 10 МБ (значение по умолчанию) до 11 МБ.

Дополнительные сведения о командлете см. в разделе .

Дополнительные сведения о WS-Management квотах см. в разделе about_WSMan_Provider.

Устранение ошибок времени ожидания

Можно использовать время ожидания для защиты локального компьютера и удаленного компьютера от чрезмерного использования ресурсов, как случайных, так и вредоносных. Если время ожидания задано как на локальном, так и на удаленном компьютере, PowerShell использует самые короткие параметры времени ожидания.

В базовой конфигурации доступны следующие тайм-ауты.

  • Поставщик WSMan (WSMan:) предоставляет несколько параметров времени ожидания на стороне клиента и службы, например параметр макстимеаутмс в узле и параметры енумератионтимеаутмс и макспаккетретриевалтимесекондс в узле.

  • Защитить локальный компьютер можно с помощью параметров канцелтимеаут, IdleTimeout, OpenTimeout и OperationTimeout командлета и переменной предпочтений.

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

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

Чтобы устранить эту ошибку, измените команду для завершения в течение интервала времени ожидания или определите источник предельного времени ожидания и Увеличьте интервал времени ожидания, чтобы завершить выполнение команды.

Например, следующие команды используют командлет для создания объекта параметра сеанса со значением OperationTimeout , равным 4 минутам (в мс), а затем используйте объект параметра сеанса для создания удаленного сеанса.

Дополнительные сведения об истечении времени ожидания WS-Management см. в разделе справки по поставщику WSMan (тип ).

Дополнительные сведения о командлете см. в разделе New-PSSessionOption.

Подробное описание

В этом разделе описываются некоторые проблемы, которые могут возникнуть при использовании функций удаленного взаимодействия PowerShell, основанных на технологии WS-Management и предлагающих решения этих проблем.

Прежде чем использовать удаленное взаимодействие PowerShell, ознакомьтесь со статьей about_Remote и about_Remote_Requirements , где приведены рекомендации по настройке и базовому использованию. Кроме того, разделы справки по каждому из командлетов удаленного взаимодействия, в особенности описания параметров, содержат полезную информацию, которая поможет избежать проблем.

Примечание

Чтобы просмотреть или изменить параметры локального компьютера на диске WSMan:, включая изменения в конфигурациях сеансов, доверенных узлах, портах или прослушивателях, запустите PowerShell с параметром Запуск от имени администратора .

Включение DHCP

param($computer="localhost",$action,$help)
 
function funHelp()
{
"
DESCRIPTION:
NAME: WorkWithDHCP.ps1
Works with DHCP settings on a local or remote machine.
 
PARAMETERS: 
-computerName Specifies the name of the computer upon which to run the script
-action <q(uery) e(nable) r(elease) rr(release/renew)  action to perform
-help   prints help file
 
SYNTAX:
WorkWithDHCP.ps1 -q "yes" -computer MunichServer
 
Queries DHCP settings on a computer named MunichServer
 
WorkWithDHCP.ps1 -action e
 
enables DHCP on local computer
 
WorkWithDHCP.ps1 -action r
 
Releases the DHCP address on the local machine
 
WorkWithDHCP.ps1 -action rr
 
Releases and then renews the DHCP address on the local machine
 
WorkWithDHCP.ps1 -help ?
 
Displays the help topic for the script
 
"@
$helpText
exit
}
 
function FunEvalRTN($rtn)
{ 
Switch ($rtn.returnvalue) 
  { 
   0 { Write-Host -foregroundcolor green "No errors for $strCall" }
   82 { Write-Host -foregroundcolor red "$strCall reports" `
       " Unable to renew DHCP lease" }
   83 { Write-Host -ForegroundColor red "$strCall reports" `
       " Unable to release DHCP lease" }
   91 { Write-Host -ForegroundColor red "$strCall reports" `
         " access denied"}
   DEFAULT { Write-Host -ForegroundColor red "$strCall service reports" `
             " ERROR $($rtn.returnValue)" }
  }
  $rtn=$strCall=$null
}
 
 
if($help) { funhelp }
$global:RTN = $null
if(!$action) { $action="q" }
 
$objWMI = Get-WmiObject -Class win32_networkadapterconfiguration `
 -computer $computer -filter "ipenabled = 'true'"
 
Switch($action)
{ 
 "e" { 
      $rtn = $objWMI.EnableDHCP() ; 
      $strCall = "Enable DHCP" ; 
      FunEvalRTN($rtn) 
     }
  "r" { 
      $rtn = $objWMI.ReleaseDHCPLease() ; 
      $strCall = "Release DHCP address" ; 
      FunEvalRTN($rtn) 
     }
 "rr" { 
      $rtn = $objWMI.RenewDHCPLease() ; 
      $strCall = "Release and Renew DHCP address" ; 
      FunEvalRTN($rtn) 
     }
 "q" {
      "DHCP Server: $($objWMI.dhcpserver)"
       "Lease obtained: " + ::`
        todatetime($objWMI.DHCPleaseObtained)
       "Lease expires: " + ::`
       todatetime($objWMI.DHCPleaseExpires)
     }
     
}
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: