Консоль SSH на WebAssembly внутри браузера: как это сделано
Веб-консоль 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!