Страх и ненависть в протоколе RDP
Как протокол RDP менялся за последние десять лет: версии от NT 4.0 до десятки, полезные флаги mstsc, теневые подключения, дыры в безопасности и будущее администрирования Windows.
Все те из нас, кто всё ещё администрирует 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 Aero, двунаправленный звук и тому подобные вещи стали доступны именно с этой версией.
- Версия 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.
(Отступление на тему того, как уладить подобные ситуации и не попасть впросак.)
Как видно, даже сами ребята из Microsoft очень долго не знали, что делать с этой функцией. Сначала они её добавили в версии 7, убрали в 7.1, а потом снова добавили в версии 8.
Для того чтобы включить эту функцию, надо будет покопаться в GPO. На сервере RDP настройте: Computer Configuration -> Administrative Templates -> Windows components -> Remote Desktop Services -> Remote Session Host -> Connections.
Настройте Set rules for remote control of Remote Desktop Services user sessions по вашему вкусу. Я обычно выбирал Full Control with user’s permission, то есть пользователь будет уведомлён о моём присутствии. Хотя, если ваши корпоративные правила позволяют, можно и не уведомлять :)
После применения этой GPO вы сможете зайти на сервер удалённых рабочих столов и запустить команду qwinsta, которая скинет вам список всех активных соединений на данном сервере. После этого вы можете воспользоваться командой:
mstsc /shadow:{id} /control /noConsentPrompt
/shadow:{id} позволяет вам подключиться и просматривать сессию с ID из qwinsta.
/control позволит вам управлять этой сессией.
/noConsentPrompt позволит вам ввалиться в сессию без того, чтобы пользователь узнал, что кто-то ввалился. (Работа этого флага зависит от того, как вы настроили GPO.)
Это очень удобный инструмент для обучения пользователей, которые не знают, что делать в жизни. А ещё очень полезно для удалённой поддержки.
Угрозы безопасности
Не будем забывать про маленькую и очень занудную программку, которая называлась rdp2tcp. Она позволяет пользователям протягивать TCP-мосты через RDP. Для работы на клиентской стороне требуется линукс, так что это не та приблуда, которую будут использовать бухгалтерши. Это для более занудных людей, у которых чешутся руки, только дай что-нибудь сломать.
Вообще, сам по себе протокол является достаточно уязвимым. Вот, например, в своё время многие администраторы воспользовались подобными уловками, чтобы «по-быстрому» починить отсутствующие сертификаты:
(скриншот настроек клиента, отключающих проверку сертификата)
Более того, некоторые администраторы, в попытке ускорить время подключения клиентов, начали изменять настройки NTLM:
(скриншот настроек NTLM)
В итоге вы в буквальном смысле получаете систему, в которой логин и пароль не передаются в открытую, разве что только бабушке на базаре!
Теперь можно смело утверждать, что сам по себе RDP не являлся и никогда не будет являться защищённым протоколом. Посему не носитесь с RDP по открытому интернету без VPN — это может угрожать всему живому.
Будущее администрирования
Со всем вышесказанным выглядит так, что RDP не является первым протоколом, к которому все просто бросаются, для того, чтобы администрировать свои сервера. В лучшем случае — предоставлять доступ пользователям к серверу терминалов.
А что же делать нам, системным администраторам?
Ну, во-первых, я очень рекомендую понаслаждаться тем, что Windows в наши дни очень хорошо поддерживает SSH. Если хочется попробовать — можете создать Windows VPS на RUVDS ;)
(Как подключиться к виртуальному серверу Windows по RDP в сервисе RUVDS.)
Windows 2019 / Windows 10 отлично из коробки дружат с OpenSSH.
Если вам ещё не довелось этого испытать, то очень рекомендую его установить. Сразу после, вы сможете настроить Powershell-over-SSH.
(Подробная инструкция, как настроить OpenSSH на Windows Server 2019 или 2022.)
В таком состоянии вы можете управлять своим сервером через свой удобный ноутбук с убунтой. Правда, для этого нужно будет установить Powershell на линукс. И хотя, да, это будет выглядеть, как если бы вы взяли всех героев из «Звёздных войн» и отправили их во вселенную «Стар Трека», но, несмотря на это, вы сможете запускать административные скрипты на вашей Windows-машине в RUVDS через Linux. Чем я на самом деле и рекомендую вам заняться.
(Как подключиться к виртуальному серверу RUVDS на Windows по RDP из Linux?)
К счастью или к сожалению, Windows вымирает как ОС (субъективное мнение, да). Даже на домашних ноутбуках я всё чаще вижу разные версии линукса. Администрированием Windows занимаются только те компании, которые застряли в Excel и необходимости работать на RDP. Да и в Microsoft это понимают и пытаются поддержать Windows для разработчиков, путём ввинчивания туда WSL.
Но, как бы то ни было, пока что вы можете комфортно работать с Windows через RDP или SSH. Вопрос только в том, сколько вам понадобится времени на настройку клиентов.
Полезные ссылки
- Статья про SSH
- Наш обзор актуальных RDP-клиентов
Читать дальше
Похожие посты
Девочка, балансирующая на NVMe-over-TCP 2.0
Продолжаем издеваться над NVMe-over-TCP. Настоящий тестовый стенд из двух Dell PowerEdge, 10-гигабитная сеть, новое ядро 5.16 и ответы на вопросы из первой части.
А все ли врут? Продолжаем издеваться над NVMe
NVMe — это не только жёсткий диск, но и протокол. Подключаем NVMe-диск по сети через TCP средствами обычного ядра Linux, без танцев с бубном и проприетарных решений.
Клонируем сами, своими руками
Как клонировать Debian Linux вручную без сторонних утилит: dd, partprobe, sgdisk, e2fsck, resize2fs и немного Go — на случай, если вас занесло на необитаемый остров.