Веб-консоль 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!

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


  1. raamid
    09.01.2023 12:51
    +2

    Правильно ли я понимаю, что в локальной сети (без Интернет) не получится работать с Tailscale? Или все-таки можно установить собственные сервера Headscale и дальше уже дело техники?


    1. Rastler
      09.01.2023 14:04
      +1

      Правильно. P-to-P возможно, но без подключения к их серверам работать не будет.


      1. Aelliari
        10.01.2023 11:35

        Есть сторонняя OpenSource реализация их сервера, так что если он доступен в локальной сети...


  1. event1
    09.01.2023 19:33
    +8

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

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

    К чему остальная статья, не вполне понятно

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

    То есть админ tailscale может зайти на любой мой хост если там запущен клиент tailscale? А сам клиент запущен с правами суперпользователя. В чём же тут трюк?


    1. domix32
      10.01.2023 12:19

      А сам клиент запущен с правами суперпользователя. В чём же тут трюк?

      Трюк в том, что суперпользователя нет, т.к. это всё внутри браузера на виртуальной файловой системе.

      админ tailscale может зайти

      А вот это сомнительно, если не MITMить трафик. Но вроде алгоритмы не дают этого делать.


      1. event1
        10.01.2023 13:27

        Трюк в том, что суперпользователя нет, т.к. это всё внутри браузера на виртуальной файловой системе.

        Имеется ввиду система на которой запущен ssh-сервер и timescaled

        А вот это сомнительно, если не MITMить трафик.

        Если целевая система авторизует клиентов на основании wg-туннеля до инфраструктуры timescale, то что помешает админу timescale поднять wg-туннель без моего участия и зайти на "мой" хост?


  1. czz
    09.01.2023 20:52
    +2

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

    клиент Tailscale;
    клиент WireGuard;
    весь сетевой стек пользовательского пространства (из проекта gVisor, который копирует интерфейсы системных вызовов из ядра Linux и переписывает их на Go для использования в сторонних приложениях);
    клиент SSH.

    Жесть какая. А уже есть браузер на wasm, чтобы запускать его в браузере?


    1. rPman
      10.01.2023 00:08
      +3

      консольный браузер lynx вроде бы скомпилировали, вот тут это показано/

      ну и гуглится такой gist хз рабочий или нет но почему нет


    1. Pinkbyte
      11.01.2023 08:13

      Ну есть n.eko, а уж есть ли там wasm - тут я не в курсе


  1. UrfeenJ
    10.01.2023 09:28

    Таки получается все равно есть единая точка отказа? Блокировки, санкции накрыли координационный сервер и всё, приехали.