Как стать автором
Обновить
2722.28
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Консоль SSH на WebAssembly внутри браузера: как это сделано

Время на прочтение5 мин
Количество просмотров14K
Веб-консоль SSH запускается по нажатию кнопки на сайте

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

В наше трудное время безопасность не бывает лишней, а область использования SSH и RDP сильно расширяется. Есть смысл шифровать каналы связи при подключении к любым устройствам, в том числе в своей домашней сети. Например, из любой точки мира вы можете подключиться к домашнему компьютеру в РФ и работать внутри страны — заходить на местные сайты типа госуслуг, сбера, оплачивать пошлины, оформлять документы и т. д.

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

Один из главных инструментов в нашем арсенале — клиент SSH. Это может быть и отдельная программа, приложение с красивым GUI, веб-приложение для браузера и т. д. Как мы уже упоминали, такие веб-приложения используются хостерами и облачными провайдерами. Единственный недостаток приложения от провайдера — оно работает через браузер только с этим конкретным провайдером. А нам хочется подключиться ко всем своим машинам в любом месте.

▍ Универсальный солдат


Несколько месяцев канадская компания Tailscale выпустила клиент Tailscale SSH Conscole, который выделяется из общего ряда привычных веб-клиентов.

Главное отличие состоит в том, что это не просто отдельное приложение. Здесь браузер реально становится консолью, а уже внутри неё устанавливается SSH-тоннель к любому устройству, на котором установлен Tailscale. Авторизация 2FA или MFA при этом производится любым способом, к которому вы привыкли (через стороннего провайдера, например, через Github, как на демонстрации внизу).


Рис. 1. Демо консольной сессии Tailscale SSH

По сути, приложение Tailscale SSH Conscole превращает браузер в рядовое устройство вашей частной сети tailnet, куда входят все ваши устройства с установленным клиентом Tailscale.

Как работает эта магия?

Если в двух словах, разработчики портировали на WebAssembly (низкоуровневый язык для исполнения бинарников внутри браузера) следующие программы:


В результате получается реальный кусочек ядра Linux и ключевых приложений SSH и VPN, который выполняется непосредственно внутри браузера движком WebAssembly на скорости, сравнимой с нативными программами любой ОС (оверхед Webasm минимален, если сравнивать с нативным кодом). Для связи с координационным сервером и шифровальным ретранслятором (DERP) используется своеобразный «тоннель через WebSockets» с использованием этой библиотеки на Go (большинство инструментов для проекта изначально написаны на Go, поэтому и трансляция в WebAssembly прошла более-менее гладко).

И вот у нас получился универсальный SSH-клиент внутри браузера, который работает по такой схеме.



Подробнее о механизме работы см. ниже.

▍ Tailscale и WireGuard


Для контекста нужно понимать, что такое Tailscale. Это децентрализованная опенсорсная VPN-сеть нового поколения, построенная на базе опенсорсного VPN-клиента WireGuard по принципу mesh-сети.

WireGuard — протокол связи и опенсорсная программа для организации зашифрованных тоннелей (VPN). Автор — канадский специалист по информационной безопасности Джейсон Доненфилд (@zx2c4). Первый выпуск WireGuard состоялся в 2015 году и произвёл определённый фурор, потому что программа кардинально превосходила IPsec и OpenVPN по производительности, а программный код WireGuard очень лаконичен. Для сравнения, вся основная логика WireGuard занимает менее 4000 строк кода, тогда как OpenVPN и IPsec это сотни тысяч строк. Код WireGuard на порядок проще и логичнее предыдущих VPN — а значит по определению и безопаснее, и производительнее.

Сравнительные тесты WireGuard, OpenVPN и IPsec создают впечатление, что это инструменты вообще из разных лиг.

Тесты производительности с официального сайта:

Пропускная способность (мегабит/с)



Пинг (мс)



В августе 2018 года Линус Торвальдс признался в любви к WireGuard, а 29 января 2020 года включил его в ядро Linux 5.6, так что это теперь дефолтный VPN в Linux.

В 2019 году на волне всеобщей любви к WireGuard канадская компания Tailscale разработала проприетарную технологию mesh-сетей VPN на базе WireGuard. Для понимания, обычный гейт VPN старого поколения работает через центральный узел:


(здесь и далее иллюстрации из блога Tailscale)

Это и небезопасно, и неудобно, потому что приходится гонять трафик к центральному серверу и обратно.



Теоретически, P2P mesh-сеть Tailscale могла бы выглядеть так:



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



Примерная схема координационных серверов и клиентов с 2FA выглядит так:



Tailscale продаёт платный сервис, покрывающий сетью любое количество устройств и пользователей. Бесплатный тариф — это один пользователь, двадцать устройств, один маршрутизатор подсети. Все они между собой безопасно соединяются по VPN.

Маршрутизатор подсети — это что-то вроде прокси, через который все устройства из частной закрытой сети выходят в интернет. В этом случае на них самих необязательно устанавливать клиент Tailscale.

▍ Tailscale SSH


Возвращаясь к веб-клиенту Tailscale SSH Conscole, то эта программа работает внутри общей сети Tailscale, то есть на всей описанной выше инфраструктуре.

Когда вы на веб-странице управления своими серверами нажимаете кнопку SSH..., то на координационном сервере Tailscale создаётся эфемерный ключ аутентификации — и он передаётся клиенту Tailscale, запущенному в вашем браузере (тому самому, который на webasm'е). Получив ключ, этот клиент поднимает стандартный узел Tailscale и начинает работать наравне с ними.

Затем клиент создаёт эфемерную пару ключей WireGuard (они тоже хранятся только в памяти) и связывается с координационным сервером Tailscale, чтобы обнаружить все остальные устройства вашей сети tailnet и маршрутизаторы DERP.

Шифровальный ретранслятор пакетов (DERP, Designated Encrypted Relay for Packets) служит для связи между собой отдельных частных сетей. Этот трафик шифруется и не виден Tailscale. То есть даже если мы пользуемся их координационными серверами, там пакеты только в зашифрованном виде.

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

Чтобы опробовать эту SSH-консоль, нужно сначала включить Tailscale SSH на устройстве, к которому вы пытаетесь подключиться. Затем на админской панели во вкладке «Машины» выбрать SSH..., чтобы подключиться к любой машине, которую вы контролируете. После дополнительной аутентификации будет установлено подключение.

Как мы уже говорили, у Tailscale есть полноценный бесплатный тарифный план (они очень гордятся такой бизнес-моделью, которая отличается от стандартного фримиума и никак не принуждает пользователей переходить на платные тарифы). Клиентский софт открыт, как и шифровальный ретранслятор DERP. И клиенты, и DERP можно установить на своей инфраструктуре (в том числе проверить исходный код и подкорректировать его для своих нужд).

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

Дополнительные сведения см. в официальной документации.

Играй в нашу новую игру прямо в Telegram!
Теги:
Хабы:
Всего голосов 31: ↑30 и ↓1+42
Комментарии11

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds