Страх и ненависть в протоколе RDP

dd7yqdcnm2fucfzkkj-hnhyxqc4.png


Все те из нас, кто всё ещё администрирует Windows на серверах, привыкли к протоколу RDP.

Последовательность: Win+R->mstsc зашита не то что в мышечной, а наверняка уже в генетической памяти.

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

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

▍ Для начала — немного истории


Протокол RDP недавно обновился до версии 10. Хотя большинство из нас привыкли ещё к версии 5.1 и никогда не замечали изменений. Краткое описание предыдущих пяти тысяч серий:

  • Версия 4 была первой, которую выпустили вместе с Windows NT 4.0
  • Версия 5 была добавлена в Windows 2000. Она позволяла работать с принтерами на локальной машине.
  • Версия 5.1 была добавлена в Windows XP, позволяя работать с 24х битной палитрой и звуком.
  • Версию 5.2 добавили в Windows 2003, и она впервые включала в себя шифрование TLS. Более того, она обзавелась спасительной функцией Console Connection, которая не раз спасала пятую точку автора от поездок в ЦОД в 2 ночи.
  • Версия 6 была ключевой для всех тех пользователей-мажорв, которые использовали мульти-мониторные системы. Она вышла с Windows Vista
  • Версия 6.1, добавленная в Windows Server 2008 позволяла перенаправлять принтеры с клиентского компьютера. Более того, она позволяла пропускать через RDP только определённые приложения (а не целый рабочий стол).
  • Версия 7, выпущенная с Windows 7 позволила ускорить перенаправление всех тех цацок, которые принесла с собой Windows Vista. Красивые анимации, Windows Areo, двунаправленный звук и тому подобные вещи стали доступны именно с этой версией.
  • Версия 7.1 позволяла работать с графическим адаптером на сервере через RemoteFX
  • Версия 8 позволила наконец-то отключить перенаправление Aero Glass, которое было так нужно в версии 7. Ещё эта версия впервые позволила протягивать RDP соединение через RDP соединение. Помните те замечательные времена, когда нам приходилось играть в Начало (Inception) Кристофера Нолана? Весь фильм о том, что если ты подключаешься к RDP через RDP, то всё начинает работать очень медленно. Ну что же, всё починили. Плюс добавили кучу всяких ненужностей, которые уберут в следующем выпуске.
  • Версия 8.1 была такой же ненужной, как и сама Windows 8.1, помимо того что клиент перестал запускаться на всеми тогда любимой Windows 7. Новая версия содержала в себе отличную функцию Restricted Admin, которая позволяла подключиться к админской консоли, зная только хэш пароля, а не сам пароль. Сама Microsoft исправила эту дыру в безопасности, опубликовав 80-ти страничный документ, в котором вам подробно объясняют, что эта дыра — и не дыра вовсе.
  • Версия 10 привнесла поддержу High-DPI экранов и добавила всё то, о чём вы никогда не будете заморачиваться.


Ну что же. Вот вам и краткая история RDP. И хотя он и менялся, с виду ничего особого не происходило.

Но как вы видите на самом деле, что-то происходило, и в протоколе появлялись новые возможности, которые вы возможно никогда не использовали.

▍ Пустите, у меня корочка!


Для начала посмотрим на возможность подключения к консоли сервера. Я много лет обучал Windows-администраторов и к своему ужасу часто обнаруживал, что люди не знают про этот полезный флаг самой mstsc.

Итак, при запуске mstsc из консоли или из меню Run… вы можете ввести mstsc /console или mstsc /admin для того, чтобы удалённо подключиться к консоли сервера. Это даёт вам доступ к сессии с идентификатором 0. То есть вы можете «напрямую работать» с монитором и клавиатурой самого сервера.

Зачем вам это нужно? Большинство администраторов не знают этой функции, потому что они не занимались администрированием серверов удалённых рабочих столов. И самый неприятный момент наступает, когда вдруг сервер лицензирования решает покинуть этот мир, а вы не можете удалённо подключиться к серверу RDP, чтобы его перенастроить.

Что же, запоминаем, что всегда можно ввести mstsc /? и посмотреть на параметры командной строки для клиента.

▍ In shadow I stand


Одно из самых полезных нововведений, как мне показалось в RDP. Возможность удалённой «прослушки» соединений пользователя. При настройке этой опции я рекомендую пользоваться здравым смыслом и Уголовным кодексом страны, в которой вы находитесь. Как минимум проконсультируйтесь с местными юристами и убедитесь, что у особо рьяного любителя клубнички в интернетах не будет возможности написать на вас донос властям за то, что вы его спалили на сайте My Little Pony.

Отступление на тему того, как уладить подобные ситуации и не попасть впросак:

Как администратор, всегда помните, иногда пользователи используют компьютер не по назначению. Иногда — это практически всегда. Если вы будете открыто говорить о правилах использования компьютеров в сети со своими пользователями, это не обязательно будет большой проблемой. Например, кто-то начинает тянуть гигабайты фильмов через торренты на работе? Не надо просто закрывать порты фаерволлом. Надо договориться с начальством, собрать всех на большую презентацию, и публично объяснить, что скачивать фильмы на рабочем месте — это большое ФИ с оттопыренным мизинцем, и делать так не надо. После этого скажите, что пока что всех прощаете, и все должны почистить все свои диски. А если кто-то будет продолжать лить, ему будет вручена премия в виде штрафа в 1МРОТ или что там у нас в ходу. Будьте открыты со своими пользователями по поводу нарушений, но не срамите их прилюдно. Если кто-то продолжает выкачивать все фильмы с участием Мии Калифы на работе, то разговор с ним должен быть один на один. Помните одну важную вещь — если позволить этому продолжаться без остановки и закрывать на это глаза — в один прекрасный момент вы подставите себя. Проход от My Little Pony → Весь архив PorhHub → что-то настолько отвратительное, что можно схлопотать 15 лет за решёткой и это не займет много времени. А отдуваться нужно будет вам. Когда вы закрываете вопрос таких пользователей на первой стадии, то ничего плохого не произойдёт. Когда вы пытаетесь сделать это на последней стадии, то вы работаете с человеком, которого загнали в угол, и которому грозит арест. Он может неправильно отреагировать. Так что ещё раз напоминаю, убедитесь, что использование этой функции может поставить вас в интересное положение.

Как видно, даже сами ребята из Microsoft очень долго не знали, что делать с этой функцией. Сначала они её добавили в версии 7, убрали в 7.1, а потом снова добавили в версии 8.

Для того чтобы включить эту функцию, надо будет покопаться в GPO. На сервере RDP настройте: Computer Configuration -> Administrative Templates -> Windows components -> Remote Desktop Services -> Remote Session Host -> Connections.

5cu0ojdoekyrxwxmmynqxwyljj4.png

Настройте Set rules for remote control of Remote Desktop Services user sessions по вашему вкусу. Я обычно выбирал Full Control with user«s permission, то есть пользователь будет уведомлен о моём присутствии. Хотя, если ваши корпоративные правила позволяют, можно и не уведомлять :)

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

mstsc /shadow:{id} /control /noConsentPrompt


/shadow:{id} позволяет вам подключиться и просматривать сессию с ID из qwinsta.

/control позволит вам управлять этой сессией.

/noConsentPrompt позволит вам ввалиться в сессию без того, чтобы пользователь узнал, что кто-то ввалился. (Работа этого флага зависит от того, как вы настроили GPO.

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

▍ Угрозы безопасности


Не будем забывать про маленькую, и очень занудную программку, которая называлась rdp2tcp. Она позволяет пользователям протягивать TCP-мосты через RDP. Для работы на клиентской стороне требуется линукс, так что это не та приблуда, которую будут использовать бухгалтерши. Это для более занудных людей, у которых чешутся руки, только дай что-нить сломать.

Вообще, сам по себе протокол является достаточно уязвимым. Вот, например, в своё время многие администраторы воспользовались подобными уловками, чтобы «по-быстрому» починить отсутствующие сертификаты:

gwpjhf6tvdpulogychn5hbc5qeo.png

Более того, некоторые администраторы, в попытке ускорить время подключение клиентов, начали изменять настройки NTML

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

Теперь можно смело утверждать, что сам по себе RDP не являлся и никогда не будет являться защищённым протоколом. Посему не носитесь с RDP по открытому интернету без VPN — это может угрожать всему живому.

▍ Будущее администрирования


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

А что же делать нам, системным администраторам?

Ну, во-первых, я очень рекомендую понаслаждаться тем, что Windows в наши дни очень хорошо поддерживает SSH. Если хочется попробовать — можете создать Windows VPS на RUVDS;)

Как подключиться к виртуальному серверу Windows по RDP в сервисе RUVDS:
Чтобы начать работу на вашем сервере, начните со следующих команд: Пуск -> Программы -> Стандартные -> Подключение к удалённому рабочему столу.

ИЛИ используйте Win+R (либо щелкните правой кнопкой мыши по кнопке Пуск, выберите Выполнить) наберите mstsc, нажмите ОК:

ciqt09es0tbknabbtxvqoku66pk.jpeg

В появившемся окне впишите IP-адрес своего сервера, в строке — компьютер, он указан в вашем ЛК, в разделе «Мои серверы»:

qagp4e_m1w_ji6ojhhjbbc4lorm.png

jeiptai0d_tcfarblzvpmbgfres.jpeg

Далее нажимаем «Подключить» и попадаем на окно с вводом учетных данных:

2s__2sxylythvjt9inzye4ldaoo.jpeg

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

Чтобы вы смогли перенести файлы с вашего компьютера на свой виртуальный сервер, нужно подключить передачу данных:

in0mtaqwuvgmyetshkh4ciqul28.jpeg

Вот в общем-то и всё.

Windows 2019/Windows 10 отлично из коробки дружат с OpenSSH.

Если вам ещё не довелось этого испытать, то очень рекомендую его установить. Сразу после, вы сможете настроить Powershell-over-SSH.

Подробная инструкция, как настроить OpenSSH на Windows Server 2019 или 2022
Для того, чтобы установить OpenSSH на Windows Server 2019 или 2022 Найдите и откройте Windows Settings. В новом окне перейдите в раздел «Apps» и выберите » Select Optional Features» в разделе «Apps & Features».

uxt7kd7kzgvf-e29scgnqpvrx40.png

Нажмите «Manage optional features», и выберите OpenSSH Server из полученного списка, затем нажмите «Install».

nanesd7t1mzx7ycummahr9w6p-0.png

После установки, запустите PowerShell от Администратора. Вставьте следующую команду для установки OpenSSH Server.

Add-WindowsCapability -Online -Name OpenSSH.Server

Установите OpenSSH Client:
Add-WindowsCapability -Online -Name OpenSSH.Client

Для настроки сервера можно использовать следующую комманду, которая откроет блокнот и можно будет добавить свои изменения
start-process notepad C:\Programdata\ssh\sshd_config

После всех настроек нужно запустить сервис командой:
Start-Service sshd

Далее необходимо будет настроить Firewall

Для этого в меню «Пуск» находим «Server Manager». Там выбираем «Tools» и клацаем на «Windows Defender Firewall with Advanced Security» в выпавшем списке.

vvzdtvod3szhiyznhpdo7r5rlbe.png

Теперь кликаем на «Inbound Rules» в открывшемся окне и создаём новое правило «New Rule». В окне «New Inbound Rule Wizard» выбираем «Protocol and Ports», клацаем «TCP» и указываем порт 22 в «Specific local ports:». После жмём Next, Next даём название правилу и нажимаем Finish.

yqg615hrrkqiepm_ym9qimd27xq.png

Теперь всё готово к подключению по ssh.

Подключиться можно с любой машины, как с linux, так и с Windows. Достаточно ввести:

ssh -l Administrator SERVER-IP

Согласиться с парой ключей:
ECDSA key fingerprint is SHA256:Vv2A8NOfzCLR/e35Fm5UyqGeJptrn6ZlY6Vabx0wHXQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

И вы можете работать на удалённом сервере по ssh, пример подключения с linux-машины.

adpesmx0a78a1aansrr__gfyq4a.png

В таком состоянии вы можете управлять своим сервером через свой удобный ноутбук с убунтой. Правда, для этого нужно будет установить Powershell на линукс. И хотя, да, это будет выглядеть, как если бы вы взяли всех героев из Звёздных Войн и отправили их во вселенную Стар Трека, но, несмотря на это, вы сможете запускать административные скрипты на вашей Windows машине в RUVDS через Linux. Чем я на самом деле и рекомендую вам заняться.

Как подключиться к виртуальному серверу RUVDS на Windows по RDP из Linux?
Для начала установим клиент удалённого доступа — Remmina:
sudo apt-get update
sudo apt-get install remmina remmina-plugin-rdp

Либо можно установить всё это через менеджер пакетов:

txl0jeerdplsg5n22vqwzoqnum4.png

После установки запускаем Remmina и настраиваем подключение к удалённому серверу:

trvrkoruqeobyink07qit3bnshi.png

В поле «Сервер» вписываете IP-адрес вашего сервера, имя пользователя сервера и пароль, который вам выдали при создании (его также можно посмотреть в ЛКв разделе «Мои серверы».

Параметр «Глубина цвета» нужно задавать таким, чтобы соединение не тормозило. Зачастую возникает ошибка, если поставить его слишком большим.

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

Не забываем сохранить подключение, с соответствующим именем.

После первого подключения, вам предложат принять сертификат. Соглашаемся с этим:

9yol22ggok5ibyn3rhfb1-ebi8o.png

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

da6ty8v5nvt25zl3p70ffh6bim0.png

Либо, в случае, если у сервера нет графического интерфейса, то через PowerShell по адресу:

\\TSCLIENT\rdpfiles

Обратите внимание, что имя папки дано для примера. В вашем случае это имя может быть отличное от «rdpfiles», но в любом случае это будет подпапка папки \\TSCLIENT.

Из обнаруженных проблем, клиента Remmina — иногда некорректно монтируется удалённая папка и сервер её не видит. Для этого необходимо полностью отключить клиент Remmina (в том числе выйти из фоновой версии программы) и перезапустить её. Тогда подключение работает корректно.

К счастью или к сожалению, Windows вымирает как ОС (субъективное мнение, да). Даже на домашних ноутбуках я всё чаще вижу разные версии линукса. Администрированием Windows занимаются только те компании, которые застряли в Excel и необходимости работать на RDP. Да и в Microsoft это понимают и пытаются поддержать Windows для разработчиков, путём ввинчивания туда WSL.

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

▍ Полезные ссылки


Мощные VPS на SSD со скидками до 53%. Панель ISPmanager в подарок*.

sz7jpfj8i1pa6ocj-eia09dev4q.png

© Habrahabr.ru