Когда-то давно, когда деревья были высокими, а я был молодым и зеленым системным администратором, довелось мне внедрять терминальный сервер на Windows 2000. Я тогда думал, что хорошо бы, если бы для подключения к серверу не нужен был никакой отдельный клиент. Шло время, деревья выросли, олени на свитере отпустили рога, а я — бороду, на рынке начали появляться решения для работы в терминале через браузер. Но они были или нестабильные, или дорогие, и пробные внедрения ушли в долгий ящик.


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


Итак, хотите пускать сотрудников на терминалки через браузер или админить серваки через него же? Добро пожаловать под кат.


Удобство подключения без отдельного клиента сложно переоценить — браузер есть практически на любом пользовательском устройстве. Помимо удобства пользователей есть и аспект безопасности: поскольку такой клиент является веб-сервисом, защищать его гораздо проще. Действительно, классический RDP с интересными уязвимостями высовывать наружу просто так довольно опасно, работать через VPN не всегда удобно, а сервисы fail2ban и нестандартный порт хоть и помогают, но 100% защиты не дают. В то время как веб-сервис можно защитить авторизацией по сертификату и другими методами двухфакторной аутентификации.


Есть мнение, что использование RDS-Gateway с заворачиванием RDP-трафика через HTTPS и установка сертификатов на клиентах является хорошей защитой. На самом деле это не так — установка сертификатов для RDS-Gateway нужна для проверки подлинности не клиента, а сервера. Убедиться в этом можно, попробовав подключиться сторонними RDP-клиентами. Конечно, часть ботов, ищущих открытый RDP, такой способ отсеет. Но решения fail2ban в таком случае тоже необходимы.

Оставлю настройку безопасности за рамками этой статьи и перейду к конкретным примерам реализации. Тестировать будем на терминальном сервере на базе Windows Server 2019, в качестве приложения для проверки RemoteApp будем использовать 1С 7.7. Потому что можем.


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


Microsoft Remote Desktop Web Client


Установка и настройка клиента подробно описана в документации, приведу основные шаги под спойлером.


Установка клиента от MS.

Подготовка. Ролям шлюза удаленных рабочих столов и\или посреднику подключений должен быть назначен такой сертификат, которому бы доверяли клиенты. Да, примерно как при обычной работе RDP-клиента через https. Можно завести публичный доверенный сертификат, можно использовать внутреннюю CA, в целях тестирования можно использовать и самоподписанный.


Сначала может понадобиться обновить модуль PowerShellGet.


Это делается командой:


Install-Module -Name PowerShellGet -Force

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


Install-Module -Name RDWebClientManagement

Install-RDWebClientPackage

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


Теперь нужно настроить сертификат для этого клиента. Делается это командой:


Import-RDWebClientBrokerCert cert.cer

Где cert.cer — путь к сертификату посредника удаленных рабочих столов в формате cer.


Теперь можно опубликовать клиента командой:


Publish-RDWebClientPackage -Type Production -Latest

После установки клиент становится доступен по ссылке вида:


https://trm.contoso.com/RDWeb/webclient/index.html

После успешного логина видны все опубликованные в коллекции приложения RemoteApp.



Опубликованные приложения в браузере.


Попробуем запустить 1С, подключившись Firefox с Kubuntu.



Kubuntu, Firefox, 1C 7.7.


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



1С, Paint и WordPad.


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



Подтверждение копирования с удаленного рабочего стола.


А вот чего пока нет, так это трансфера файлов с сервера и на сервер, и это существенная ложка дегтя. Подведем итог.


Плюсы:


  • Относительно простая настройка.
  • Установка на Windows-сервере, можно прямо на шлюзе рабочих столов.
  • Прозрачная и удобная работа RemoteApp.
  • Поддержка печати и буфера обмена для текста.

Минусы:


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

Что ж, посмотрим, что нам предложит мир opensource.


Apache Guacamole


Пожалуй, одно из самых известных решений. Но версия 1.0 появилась относительно недавно. К ее минусам можно сразу отнести отсутствие официальной поддержки Windows в качестве точки установки — нужна отдельная linux-машина или образ Docker. Документация доступна, как обычно, на официальном сайте. Стоит отметить, что помимо RDP, решение поддерживает доступ через браузер к серверам ssh, telnet и vnc.


Если вам не хочется собирать свежую версию из исходников и разбираться с зависимостями, можно воспользоваться готовыми скриптами установки, вроде скрипта guac-install. Но — как обычно — за сторонние скрипты редакция ответственности не несет.

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



Настройка простого RDP-подключения.


Стоит отметить, что если мы хотим прозрачно подключаться, авторизовавшись только через веб-интерфейс, то понадобится или вручную создавать каждому пользователю подключение, вводя его пароль (!), или делать более сложную установку. Например, использовать для хранения настроек и авторизации БД Active Directory, что потребует модификации схемы AD. Или настраивать авторизацию через LDAP, также создавая пользователей и в классической БД вроде MySql.


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


Помимо полноценного рабочего стола есть и поддержка RemoteApp. Важный нюанс — прописывать имя программы в настройках нужно точно так же, как и в файле RDP.



Настройка RemoteApp.


И если все было сделано правильно, наша «семерка» откроется в браузере.



И снова 1С 7.7 в браузере.


Печать работает так же: скачивается PDF, но — в отличие от решения от MS, — есть возможность файлового обмена с сервером.


По сути, Apache Guacamole запускает у себя freerdp и может прокидывать папки со своей линуксовой машины на виндовый сервер.



Перенаправленный диск в 1С.


В свою очередь из браузера можно скачать или загрузить файл через специальное меню. В этом меню можно еще и настроить эмуляцию мыши и экранную клавиатуру. Вызывается оно сочетанием клавиш Ctrl+Alt+Shift.



Работа с файлами.


Текстовый буфер обмена также работает, но немного неудобно (бесит куда больше, чем решение от MS). Современные браузеры в паре с Apache Guacamole позволяют легко копировать текст с удаленного приложения при помощи Ctrl+C, но для вставки текста с локальной машины понадобится использовать меню по Ctrl+Alt+Shift.


Зато практически «из коробки» реализована двухфакторная аутентификация (особенно, если делать установку сторонним скриптом). Например, при помощи алгоритма TOTP.


Вкратце напомню: TOTP (Time-based One-time Password Algorithm) — это алгоритм генерации одноразовых паролей на основе времени. При первом входе пользователю будет предложено считать двухмерный штрих-код или записать набор символов, «скормить» их приложению (например, Google Authenticator). И на основе этого набора символов (security string) приложение каждые 30 секунд будет генерировать новое число-код для входа.

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


Плюсы:


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

Минусы:


  • Необходимость отдельной машины или контейнера.
  • Сложность в настройке, особенно для специалиста, непривычного к Linux.
  • Не очень удобная работа текстового буфера обмена.

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


Myrtille


Проект со всей документацией располагается на github автора. В отличие от Guacamole, Myrtille устанавливается на Windows, да ещё и практически в режиме «Далее — Далее — ОК». Устанавливаем, запускаем браузер.



Windows в браузере.


Помимо RDP поддерживается SSH и подключение к виртуальной машине Hyper-V. Меню управления подключением вызывается по кнопке с тремя точками в левом верхнем углу.



Меню управления подключением.


Работа с файлами производится через веб-интерфейс — по кнопке Files открывается доступ к папке «Мои документы» пользователя для загрузки и скачивания файлов. При этом если Myrtille установлен не на терминальном сервере, придется настраивать перенаправление папки. Печать, в отличие от двух других решений, сразу вызывает окно с диалогом печати PDF.


Чуть хуже дела с RemoteApp при работе приложения в обычном режиме. Для запуска несчастной 1С нужно сформировать ссылку вида:


https://myserver/Myrtille/?__EVENTTARGET=&__EVENTARGUMENT=&server=server&domain=domain&user=user&passwordHash=passwordHash&program=program

В которой нужно явно указать пользователя и его пароль (или хэш пароля). Программу необходимо прописать так же, как и в файле RDP — в случае нашей 1С это будет ||1cv7l. Все параметры должны быть URL-encoded.



И в третий раз 1С в браузере.


Для получения хэша пароля можно также воспользоваться myrtille, просто перейдя по ссылке (выполнив GET-запрос):

https://server/myrtille/GetHash.aspx?password=password

Двухфакторная аутентификация также доступна «из коробки» и основана на сервисе oliveinnovations.com.


Для работы в доменной среде у приложения есть отдельный режим работы — Enterprise mode. Для его включения нужно при установке (или потом, в файлах конфигурации) указать имя домена и группу администраторов (пользователей, которые могут настраивать подключения). Тогда при входе будет запрашиваться только имя пользователя и пароль, и администратор может создавать предопределенные конфигурации подключения для групп пользователей. Это и позволит нам сделать удобный ярлык для запуска 1С.



Создание подключения в панели управления Enterprise-режима.


Теперь пользователь при входе будет видеть доступные ему подключения и запускать 1С по кнопке, а не по странной ссылке с паролем.



Интерфейс при входе обычного пользователя.


К сожалению, на данный момент у меня не получилось заставить работать текстовый буфер обмена в современных браузерах — работа идет только по кнопке clipboard и только в сторону с сервера на локальный ПК.


Итого.


Плюсы:


  • Простая установка на Windows.
  • Поддержка почти всего, что нужно, вроде печати и передачи файлов.
  • Возможность подключения к приложению или рабочему столу сразу по ссылке.
  • Есть возможность работы в режиме совместимости (HTML4).

Минусы:


  • Пока нормально не работает текстовый буфер обмена.
  • Работа с файлами удобна, только если сервис установлен непосредственно на терминальном сервере.

Вместо послесловия


Конечно, существуют и другие решения, в том числе и платные. Приведу несколько самых популярных, не трогая монстров вроде Xen Desktop:



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


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

Комментарии (6)


  1. LieutenantA
    08.10.2019 15:15

    Вот прямо сейчас прикручиваю Guacamole к Zabbix.


    1. SmileyK
      08.10.2019 19:27

      А зачем guacamole к zabbix? Что бы ssh на улицу не давать ?


      1. LieutenantA
        10.10.2019 08:18

        Захотелось, чтобы прямо на карте сети по узлу щелкнул и подключился. Но то, что получается, пока не очень устраивает — очень много хостов в guacamole заводить, вручную (или скрипты писать). В общем, пока не определился, надо ли оно вообще.


        1. Tri-Edge Автор
          10.10.2019 11:26

          попробуйте Myrtille — у него можно сформировать ссылку сразу на подключение. что-то типа
          myserver/Myrtille/?__EVENTTARGET=&__EVENTARGUMENT=&server=server&user=user&passwordHash=passwordHash&connect=Connect%21&hostType=1

          только вот понадобится виртуалка с виндой…


          1. LieutenantA
            10.10.2019 13:20

            Спасибо, посмотрю обязательно.


  1. YMax
    11.10.2019 13:50

    Надо протестировать — сейчас используется Web Remote Desktop на 2012R2 — но это просто окно для запуска .rdp файлов, а тут полноценный запуск RemoteApps в браузере. Если я правильно понял — появилось в Server 2019?