Защита VNC-приложений при помощи SSL

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

SSL предоставляет новый механизм удобного, безопасного доступа к удаленным рабочим столам при помощи VNC и стандартных Web-браузеров.

Косьян Войцех, разработчик программного обеспечения, IBM

Косьян Войцех (Kocjan Wojciech) несколько лет занимается разработкой программного обеспечения и консультированием. Среди его коммерческих клиентов Motorola и IBM. Он также в течение нескольких лет занимался поддержкой ряда проектов open-source. Сейчас он является разработчиком программного обеспечения в IBM.



Кэмерон Лэйрд, вице-президент, Phaseit,Inc.

Кэмерон Лэйрд (Cameron Laird) - бывший обозревательэтого сайта и в течение длительного времени пишет для developerWorks. Он часто рассказывает про Open Source проекты, позволяющие его работодателям ускорить разработку технологий в области надежности и безопасности передачи информации. Кэмерон впервые начал использовать AIX двадцать лет назад, когда тот был все еще экспериментальным продуктом. Все это время Кэмерон был заинтересованным пользователем и разработчиком средств для отладки памяти. Вы можете связаться с ним по адресу claird@phaseit.net.



Кайлер Лэйрд, аналитик-исследователь, студент

Кайлер Лэйрд является аналитиком-исследователем Университета Калифорнии в Мерсед и занимается другой работой. Он добровольно участвует в создании нескольких общедоступных ресурсов, например, посвященных авиации общего назначения или спасению животных.



21.06.2007

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

Идея состоит в использовании SSL для обеспечения безопасности использования простого клиента VNC, встроенного в Web-страницу. Это означает, что практически любой Java-совместимый Web-браузер может видеть удаленный рабочий стол и взаимодействовать с ним; это обеспечивает эффективное решение в типовых ситуациях, включая удаленную совместную работу, осуществление технической поддержки и инициализацию.

Компьютер там, рабочий стол здесь

Компьютер где-то выполняет какие-то операции, человек где-то в другом месте хочет видеть результат выполнения этих операций. Диапазон ситуаций, которые попадают под это описание, огромен, и число средств, позволяющих успешно выполнить такую задачу, почти так же велико. Один из вариантов, особенно подходящий для людей, не являющихся специалистами в области программного обеспечения, -- опубликовать обычный рабочий стол в виде адреса URL, защищенного протоколом HTTPS. "Обычным" пользователям удобно выбирать гиперссылки для доступа к рабочему столу или вводить URL в поле адреса браузера.

Приложив небольшое усилие, через несколько минут вы сможете настроить свой собственный удаленный рабочий стол. Решающее функциональное отличие такого подхода состоит в механизме осуществления аутентификации: вместо того чтобы базироваться на обычных учетных записях, что типично для удаленных механизмов, базирующихся на ssh, IPv6, OpenVPN и множестве проприетарных продуктов, сейчас мы увидим как настроить пары учетная запись/пароль для SSL. Это чрезвычайно "легкий" вариант -- защитить хост с рабочим столом от иных вариантов использования. В то же время, технология широко используется через Web и близка многим разработчикам.

Хотя для настройки VNC-через-SSL требуется выполнить всего несколько действий, в настройке основной конфигурации есть тонкий момент: Java VNC клиенты не будут соединяться с сайтами SSL, имеющими самостоятельно подписанный сертификат. Точнее, JVM, обычно используемые популярными браузерами, требуют сертификатов, подтвержденных "уполномоченными сторонними" центрами сертификации (certificate authority, CA).

На самом деле это относится к читателям этой статьи, склонным к систематизации. Если вы обслуживаете или разрабатываете безопасные Web-сайты, вы, вероятно, уже работаете с SSL. В таком случае вы можете использовать имеющийся Web-сервер и подписанный сертификат для вашего проекта VNC-через-SSL. Если вы не имеете опыта работы с SSL, предлагаемая нами технология -- не лучшее решение для начинающих. Более традиционные ssh-туннели, или Hamachi, или коммерческие решения, вероятно, позволят вам с большей легкостью приобщиться к миру удаленных рабочих столов. Более подробно об этом см. во врезке Сертификаты и SSL.


Рецепт

Первый шаг -- установка VNC-сервера(ов) и соответствующих туннелей. Для этого вам необходимо иметь сертификат, позволяющий создавать корректные файлы ключей, включая закрытый и открытые ключи. Ключи размещаются в файле /etc/ssl/certs/stunnel.pem. Вот пример использования TightVNC-сервера на display :5.

Листинг 1. Запуск TightVNC-сервера и туннеля
$ tightvncserver :5
$ stunnel -d 5705 -r 5905 -p /etc/ssl/certs/stunnel.pem

Несмотря на то, что большинство Linux-хостов настроены так, что пользователь может запустить vncserver, весьма вероятно, что для эффективного использования stunnel вам понадобятся привилегии root'а. В зависимости от модели механизма защиты, используемой на вашем хосте, может быть вам лучше использовать sudo stunnel ....

На этом этапе сервер предложит выполнить нешифрованное соединение с адресом there:5905 и шифрованное соединение с адресом there:5705. Проверить можно с помощью любого удобного VNC viewer'а, указав yourhost:5. Чтобы убедиться, что stunnel запустился и выполняется, обратитесь к системному журналу при помощи следующей команды:

Листинг 2. Проверяем, что stunnel выполняется успешно
# grep stunnel /var/log/syslog|tail -24
Aug 21 18:58:17 there stunnel[5453]: Using '5905' as 
      tcpwrapper service name
Aug 21 18:58:17 there stunnel[5453]: stunnel 3.26 on 
      i386-pc-linux-gnu PTHREAD+LIBWRAP with OpenSSL 0.9.7e 25 Oct 2004
Aug 21 18:58:17 there stunnel[5454]: FD_SETSIZE=1024, 
      file ulimit=1024 -> 500 clients allowed

Возможные ошибки -- неправильный файл ключа, несоответствие прав доступа, порт уже используется -- отображаются в том же журнале. Например, в случае отсутствия ключа в журнале появится следующее сообщение:

Aug 21 18:58:17 there stunnel[5453]: /etc/ssl/certs/stunnel.pem: No such file or directory (2)

Этот сервер успешно работает и на нешифрованных, и на шифрованных портах, мы сосредоточим свое внимание на VNC Web-клиенте. Для этого необходимо загрузить с x11vnc-проекта Java VNC viewer с поддержкой SSL. После загрузки архива Java-код доступен в x11vnc-X.Y.Z/classes/ssl/VncViewer.jar и x11vnc-X.Y.Z/classes/ssl/SignedVncViewer.jar. Задайте каталог для содержимого VNC и скопируйте туда VncViewer.jar, затем создайте страницу HTML. Вот пример файла HTML, предоставляющего соединение с there:5705 через SSL:

Листинг 3. Соединение с there:5705
<html>
<body>
<applet code="VncViewer.class" archive="VncViewer.jar" width="800" height="600">
<param name="PORT" value="5705" />
<param name="HOST" value="there" />
<param name="Open New Window" value="no" />
<!-- the following helps in Opera:
<param name="Cursor shape updates" value="Disable" />
-->
</applet>
</body>
</html>

И HTTP, и HTTPS могут обслуживать этот апплет. Использование HTML и Jar-файлов происходит через HTTP на порту 80, под URI /vnc, затем адрес http://there/vnc появится на рабочем столе. Не забудьте разрешить вашему браузеру использовать Java! Кроме того, обратите внимание, что необходимо использовать одно и то же имя хоста и в параметре HOST, и в исходном адресе; этого в сущности требует модель механизма защиты Java-апплетов.


Несколько дополнительных замечаний по использованию

Одно из преимуществ использования стандартных компонентов и протоколов состоит в том, что они довольно легко могут быть заменены. Например, большинство наших разработок было сделано с применением Xvnc VNC-сервера и некоторые из них могут быть заменены на TightVNC с помощью метода, описанного выше. Обратите внимание, что для запуска этих вариантов аргументы командной строки будут несколько отличаться; тем не менее в любом случае идея остается прежней. Почти во все дистрибутивы Linux входят VNC-серверы, собранные в соответствии со стандартами этого дистрибутива, и некоторые VNC-проекты с открытыми исходными кодами могут быть легко установлены из исходников. Наиболее сложное в инсталляции любого VNC-сервера -- необходимость наличия по умолчанию определенных шрифтов. Тем не менее, даже в этом случае по крайней мере средство обозначено четко.

Есть как минимум одно препятствие в использовании VNC viewer'а с поддержкой SSL через браузер. Он может использоваться со всеми основными браузерами, в том числе Mozilla Firefox, Internet Explorer и Opera, но все эти браузеры требуют Java runtime версии 1.4 или выше. Проблема возникает при использовании операционных систем Microsoft Windows, которые все еще зависят от Microsoft JVM 1.1. В таких случаях VNC viewer не запустится в Internet Explorer и выдаст сообщение, что класс VncViewer не найден. Единственное решение состоит в том, чтобы предложить использовать не SSL-соединение с VNC-сервером и обновить Java до любого свежего Java Runtime.

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


Что все это значит?

Хотя вы, может, и работали с VNC, Web-сервисами, Java, SSL, браузерами и так далее, вы, возможно, никогда не использовали их одновременно таким способом. Что именно вы имеете теперь?

Мы писали, что если вы уже использовали SSL, вы можете просто повторно использовать ваш сертификат, а если нет, -- сейчас не время начинать. Это не совсем так.

С точки зрения разработчиков, SSL играет как минимум в две роли:

  • Шифрование и аутентификация VNC-трафика, позволяющие обеспечить минимальную безопасность ваших удаленных рабочих столов во враждебном мире Интернет; и
  • SSL помогает использовать возможности наиболее распространенных браузеров.
Если ваш браузер не определяет местонахождение сертификата для вашего SSL-трафика, вы и, самое главное, кто-то еще, кто использует Web-браузер для удаленного доступа к вашему рабочему столу, увидите большое количество предупреждений, слишком большое.

В основной части этой статьи мы рассматривали ситуацию, когда использовался ранее полученный и уже использовавшийся сертификат. Этот ответ говорит и слишком много и слишком мало. Например, j2re 1.4 JVM от Sun требует сертификата не просто от сервера сертификации (CA), а от лидирующих CA, таких как Verisign и Thawte. Браузеры, использующие JVM, имеют дело с менее дорогими сертификатами так же, как и с самостоятельно подписанными.

С другой стороны, в основной части этой статьи преувеличена невозможность VNC-через-SSL при помощи самостоятельно подписанного сертификата. Если вы готовы мириться со всеми предупреждениями браузера, вы можете по крайней мере поэкспериментировать с вашими собственными сертификатами.

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

Листинг 4. Создание самостоятельно подписанного сертификата
openssl genrsa -des3 -out server.key 1024
    openssl rsa -in server.key -out server.pem
    openssl req -new -key server.key -out server.csr
    openssl x509 -req -days 3560 -in server.csr \
	  -signkey server.key -out server.crt
    cat server.pem server.crt > combined.pem

Некоторые из этих действий предполагают интерактивный режим использования командной строки. Самый важный вопрос один -- "Common Name" в третьей строке; для ответа используйте полностью уточненное доменное имя хоста, рабочий стол которого вы хотите совместно использовать. Часто это `hostname`.

Приобретение сертификата -- обычно самая трудная часть VNC-через-SSL. Имея сертификат, вы сможете быстро выполнить все остальные действия.

На самом деле, довольно много. Для начала, это похоже на screen в GUI; то есть, вы можете запустить графическую сессию на работе, использовать, как обычно, в течение дня всю ее производительность и функциональность, оставить ее в текущем состоянии и вновь подключиться к той же самой сессии через любой Web-браузер с поддержкой Java! Это очень мощный инструмент.

Однако вы получаете не только это. VNC очень удобен для телеконференций. Мы используем его, например, для настройки демонстрации сложных графических приложений для зрителей, не являющихся специалистами в сфере компьютерных технологий. В принципе, удаленный X-сервер может исполнять почти такие же функции, но VNC предоставляет некоторые преимущества:

  • Его технология обеспечения безопасности лучше поддается настройке.
  • При наличии установленных firewall'ов получить доступ к VNC часто легче, чем к X.
  • VNC viewer'ы проще в установке, чем X-серверы -- особенно это касается базирующихся на браузерах viewer'ов, которые не требуют дополнительных установок.
  • Он легко позволяет предоставить рабочий стол через VNC нескольким пользователям.
  • VNC обычно менее чувствителен к задержкам в сети.
  • Несмотря на то, что X-аутентификация (и ssh-туннелирование) обычно основаны на учетных записях из /etc/passwd, доступ при помощи Web использует HTTP(S)-аутентификацию. Имеется богатый опыт в создании и обслуживании таких учетных записей, даже с кратковременными целями, например, для демонстрации телеконференций.
  • VNC viewer'ы гораздо менее требовательны к памяти и аппаратным ресурсам, чем X-серверы.
  • В VNC-серверах обычно предусмотрена такая полезная конфигурация, как предоставление доступа только для чтения.
Кроме того, ключом к части этой технологии является то, что основная вычислительная нагрузка, связанная с криптографией, выполняется с использованием "родного" кода вместо Java run-time. В большинстве случаев в качестве первой апроксимации для определения производительности могут быть приняты сетевые задержки, но шифрование и дешифрование достаточно дороги и делают альтернативные методы непригодными, за исключением случаев применения на высокопроизводительных компьютерах. В технологии VNC-через-SSL вызывает наше восхищение то, что клиенты могут использовать стандартное программное обеспечение на старом и довольно простом оборудовании, чтобы получить вполне приемлемую ответную реакцию.

Вы, вероятно, ограничены определенными условиями и имеете доступ к определенным реурсам. Вы должны решить для себя, насколько VNC сопоставим с коммерческими предложениями от Citrix, Windows Terminal services, WebEx, Hamachi и другими "удаленными" решениями. Однако мы видели, что технология VNC-через-SSL позволяет решать поразительный диапазон проблем.

В следующей статье мы покажем, как объединить VNC с другими виртуальными средами для достижения мощных методов распределения ресурсов. Однако, прежде чем завершить это введение, важно напомнить читателям, что VNC имеет серьезные проблемы безопасности. Разумно предположить, что грубые атаки на стандартный сервис VNC, защищенный только одним паролем сессии, взломают его за несколько часов или дней. Интерес "плохих парней" к VNC быстро растет; убедитесь, что вы используете для VNC качественный пароль, состоящий из как минимум восьми символов, предпочтительно смеси цифр, букв и других символов. SSL повышает степень защищенности, и вам следует воспользоваться этим, если вы часами оставляете сессию открытой. В дальнейшем аспекты обеспечения безопасности будут рассмотрены подробнее.

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


Заключение

В следующей статье мы рассмотрим подробнее пару специфических рабочих мест, использующих технологию VNC-через-SSL, и расскажем, как вы можете применить эту технологию в ваших условиях, а также рассмотрим распространенные методы использования firewall'ов и серверов прокси. Мы также объясним, при каких условиях вы можете получить выгоду от использования "родных" VNC viewer'ов во взаимодействии с клиентами, работающими через браузер, как это описано в данной статье.

Особую благодарность мы выражаем Мэту Кеннелу (Matt Kennel), который заботится о безопасности и обсуждает с нами возможности использования технологии VNC-через-SSL на деле.

Ресурсы

Научиться

  • Оригинал статьи на developerWorks.
  • Узнайте о преимуществах и возможностях удаленных вычислений в Wikipedia.
  • "Create a VNC system with tclRFB" (developerWorks, август 2003) познакомит вас с технологией VNC и продемонстрирует, насколько он прост в настройке. Для удаленных рабочих столов вы можете использовать стандартный VNC, кроме того, и другие возможности ваших систем будут серьезно расширены с помощью VNC.
  • TightVNC -- кроссплатформенная реализация VNC под лицензией GPL. Эта реализация может похвалиться множеством новых возможностей, включая многочисленные опции, описывающие варианты компрессии, варианты доступа, начиная от полного, кончая только просмотром, и автоматический ssh-тунеллинг. Документацию по TightVNC вы найдете на Xvnc Terminal Server.
  • Xvnc -- справочная информация о VNC-реализациях (не путайте с xVNC, привязкой VNC к функционирующему на базе Windows Visual Basic 6).
  • stunnel -- GNU-программа для "шифрования случайных TCP-соединений внутри Secure Sockets Layer ..." Этот проект сочетает stunnel и VNC для осуществления доступа к рабочему столу через SSL-шифрование. Обратите внимание, что эффективно управлять программой stunnel может владелец stunnel.pem, обычно это root.
  • x11vnc -- "VNC for real X displays", которые авторы сочли необходимыми для некоторых OpenGL-разработок. Между прочим, x11vnc включает Enhanced Viewer package, который соответствует требованиям проекта, описанного в этой статье.
  • "Hamachi -- приложение, реализующее VPN, практически не требующее конфигурирования", как сказано на домашней странице проекта. Существует бесплатная "базовая версия" для Linux, хотя в настоящее время она доступна только как консольное приложение.
  • "SSL client authentication: It's a matter of trust" (developerWorks, март 1998) знакомит с Secure Sockets Layer и приемами авторизации клиента. SSL может рассматриваться как "дополнение" о шифровании, подтверждении и аутентификации, основанных на протоколе IP. Авторы используют его, чтобы устанавливать безопасные связи между процессом, который обслуживает копии десктопа, или через Web-браузер с поддержкой Java.
  • "SSL-Explorer -- "полноценный, базирующийся на Web SSL VPN сервер", как сказано на его домашней странице на SourceForge. Его возможности и преимущества частично совпадают с возможностями технологии VNC-через-SSL, представленной здесь.
  • "Revisiting Java technology on the client" (developerWorks, март 2001) рассматривает удаленный viewer, клиентское приложение со стороны Java. Код, использованный в этой статье, требует JVM версии 1.2 или выше. Хотя широко используемые в Win98 и Win2000 браузеры предоставляют только версию 1.1, и некоторые он-лайн банковские приложения по-прежнему нуждаются в них, более современные браузеры имеют версии 1.4 или выше.
  • "The X Window System" ("Система X Window") -- официальное название графического набора инструментов, лежащего в основе почти всех десктопов Linux и UNIX. "An Introduction to X11 User Interfaces", написанное Грантом Эдвардсом (Grant Edwards) более десяти лет назад, остается актуальным и сейчас. Технологии предоставления удаленного доступа успешно работают исключительно на уровне VNC и не зависят от X напрямую, однако X являются основой для нескольких конкурирующих методов предоставления удаленного доступа, поэтому их понимание будет полезным.
  • "Connect securely with ssh" (developerWorks, июль 2003) -- обзор возможностей удаленного соединения. ssh -- гибкий протокол, часто используемый для создания "secure tunnel". Осуществление туннелирования VNC через ssh -- возможно, единственная наиболее распространенная технология удаленного доступа в Linux.
  • "Screen -- "терминальный переключатель, который позволяет управлять множеством процессов с одного физического терминала", как сказано в статье 2003 года "Power Sessions with Screen." Screen -- чрезвычайно полезен при работе в командной строке. Он известен по крайней мере с 1991 года.
  • Найдите другие ресурсы для Linux-разработчиков на developerWorks Linux® зоне.
  • Ознакомьтесь с текущими техническими событиями developerWorks и Webcasts.

Получить продукты и технологии

  • Закажите SEK для Linux, набор из двух DVD, содержащих trial-версию последнего программного обеспечения IBM для Linux от DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.
  • Постройте ваш следующий проект разработки в Linux при помощи IBM trial software, доступного непосредственно с developerWorks.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=232421
ArticleTitle=Защита VNC-приложений при помощи SSL
publish-date=06212007