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

в 9:00, , рубрики: Headscale, ipsec, Mesh-сети, open source, openvpn, rdp, ruvds, ruvds_статьи, ssh, Tailscale, vm, vpn, webassembly, wireguard, Блог компании RUVDS.com, виртуальные машины, информационная безопасность, Серверное администрирование

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

Веб-консоль SSH запускается по нажатию кнопки на сайте

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

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

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

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

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

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

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

Консоль SSH на WebAssembly внутри браузера: как это сделано - 2
Рис. 1. Демо консольной сессии Tailscale SSH

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

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

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

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

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

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

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

▍ Tailscale и WireGuard

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

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

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

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

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

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

Пинг (мс)

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

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

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

Консоль SSH на WebAssembly внутри браузера: как это сделано - 6
(здесь и далее иллюстрации из блога Tailscale)

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

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

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

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

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

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

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

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

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 можно использовать совершенно свободно в любом стороннем приложении или сервисе, которое не нарушает лицензию.

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

Автор:
ru_vds

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js