- PVSM.RU - https://www.pvsm.ru -
Веб-консоль SSH запускается по нажатию кнопки на сайте
Почти у каждого VPS- и облачного провайдера есть веб-клиент SSH, который запускается через браузер. Такое приложение помогает вам подключиться по SSH к своим виртуальным машинкам на удалённом сервере, не выходя из браузера.
В наше трудное время безопасность не бывает лишней, а область использования SSH и RDP сильно расширяется. Есть смысл шифровать каналы связи при подключении к любым устройствам, в том числе в своей домашней сети. Например, из любой точки мира вы можете подключиться к домашнему компьютеру в РФ и работать внутри страны — заходить на местные сайты типа госуслуг, сбера, оплачивать пошлины, оформлять документы и т. д.
К счастью, существуют удобные инструменты для выполнения всех этих задач.
Один из главных инструментов в нашем арсенале — клиент SSH. Это может быть и отдельная программа, приложение с красивым GUI, веб-приложение для браузера и т. д. Как мы уже упоминали, такие веб-приложения используются хостерами и облачными провайдерами. Единственный недостаток приложения от провайдера — оно работает через браузер только с этим конкретным провайдером. А нам хочется подключиться ко всем своим машинам в любом месте.
Несколько месяцев канадская компания Tailscale выпустила клиент Tailscale SSH Conscole [1], который выделяется из общего ряда привычных веб-клиентов.
Главное отличие состоит в том, что это не просто отдельное приложение. Здесь браузер реально становится консолью, а уже внутри неё устанавливается SSH-тоннель к любому устройству, на котором установлен Tailscale. Авторизация 2FA или MFA при этом производится любым вам способом, к которому вы привыкли (через стороннего провайдера, например, через Github, как на демонстрации внизу).
Рис. 1. Демо консольной сессии Tailscale SSH
По сути, приложение Tailscale SSH Conscole превращает браузер в рядовое устройство вашей частной сети tailnet [2], куда входят все ваши устройства с установленным клиентом Tailscale.
Как работает эта магия?
Если в двух словах, разработчики портировали на WebAssembly [3] (низкоуровневый язык для исполнения бинарников внутри браузера) следующие программы:
В результате получается реальный кусочек ядра Linux и ключевых приложений SSH и VPN, который выполняется непосредственно внутри браузера движком WebAssembly на скорости, сравнимой с нативными программами любой ОС (оверхед Webasm минимален, если сравнивать с нативным кодом). Для связи с координационным сервером и шифровальным ретранслятором (DERP) используется своеобразный «тоннель через WebSockets» [7] с использованием этой библиотеки на Go [8] (большинство инструментов для проекта изначально написаны на Go, поэтому и трансляция в WebAssembly прошла более-менее гладко).
И вот у нас получился универсальный SSH-клиент внутри браузера, который работает по такой схеме [9].
Подробнее о механизме работы см. ниже [10].
Для контекста нужно понимать, что такое Tailscale [11]. Это децентрализованная опенсорсная VPN-сеть нового поколения, построенная на базе опенсорсного VPN-клиента WireGuard по принципу mesh-сети.
WireGuard [12] — протокол связи и опенсорсная программа для организации зашифрованных тоннелей (VPN). Автор — канадский специалист по информационной безопасности Джейсон Доненфилд (@zx2c4 [13]). Первый выпуск WireGuard состоялся в 2015 году и произвёл определённый фурор, потому что программа кардинально превосходила IPsec и OpenVPN по производительности, а программный код WireGuard очень лаконичен. Для сравнения, вся основная логика WireGuard занимает менее 4000 строк кода, тогда как OpenVPN и IPsec это сотни тысяч строк. Код WireGuard на порядок проще и логичнее предыдущих VPN — а значит по определению и безопаснее, и производительнее.
Сравнительные тесты WireGuard, OpenVPN и IPsec создают впечатление, что это инструменты вообще из разных лиг.
Тесты производительности с официального сайта [14]:
Пропускная способность (мегабит/с)
Пинг (мс)
В августе 2018 года Линус Торвальдс признался в любви к WireGuard [15], а 29 января 2020 года включил его в ядро Linux 5.6 [16], так что это теперь дефолтный VPN в Linux.
В 2019 году на волне всеобщей любви к WireGuard канадская компания Tailscale [17] разработала проприетарную технологию mesh-сетей VPN на базе WireGuard. Для понимания, обычный гейт VPN старого поколения работает через центральный узел:
(здесь и далее иллюстрации из блога Tailscale [11])
Это и небезопасно, и неудобно, потому что приходится гонять трафик к центральному серверу и обратно.
Теоретически, P2P mesh-сеть Tailscale могла бы выглядеть так:
Но с ростом количества узлов количество потенциальных соединений между пирами растёт экспоненциально, поэтому на определённом этапе все клиенты связываются с координационным сервером Tailscale.
Примерная схема координационных серверов и клиентов с 2FA выглядит так:
Tailscale продаёт платный сервис [18], покрывающий сетью любое количество устройств и пользователей. Бесплатный тариф — это один пользователь, двадцать устройств, один маршрутизатор подсети. Все они между собой безопасно соединяются по VPN.
Маршрутизатор подсети — это что-то вроде прокси, через который все устройства из частной закрытой сети выходят в интернет. В этом случае на них самих необязательно устанавливать клиент Tailscale.
Возвращаясь к веб-клиенту Tailscale SSH Conscole, то эта программа работает внутри общей сети Tailscale, то есть на всей описанной выше инфраструктуре.
Когда вы на веб-странице управления своими серверами нажимаете кнопку SSH...
, то на координационном сервере Tailscale создаётся эфемерный ключ аутентификации [19] — и он передаётся клиенту Tailscale, запущенному в вашем браузере (тому самому, который на webasm'е). Получив ключ, этот клиент поднимает стандартный узел Tailscale и начинает работать наравне с ними.
Затем клиент создаёт эфемерную пару ключей WireGuard (они тоже хранятся только в памяти) и связывается с координационным сервером Tailscale, чтобы обнаружить все остальные устройства вашей сети tailnet и маршрутизаторы DERP.
Шифровальный ретранслятор пакетов [20] (DERP, Designated Encrypted Relay for Packets) служит для связи между собой отдельных частных сетей. Этот трафик шифруется и не виден Tailscale. То есть даже если мы пользуемся их координационными серверами, там пакеты только в зашифрованном виде.
Клиент Tailscale SSH проверяет подлинность каждого пакета на основе криптографической подписи WireGuard, поэтому ему не нужно запрашивать пароль, загружать открытый ключ или управлять файлом authorized_keys
. По сути, туннель SSH уже установлен средствами WireGuard, а Tailscale работает как бы поверх него.
Чтобы опробовать эту SSH-консоль, нужно сначала включить Tailscale SSH [21] на устройстве, к которому вы пытаетесь подключиться. Затем на админской панели [22] во вкладке «Машины» выбрать SSH...
, чтобы подключиться к любой машине, которую вы контролируете. После дополнительной аутентификации будет установлено подключение.
Как мы уже говорили, у Tailscale есть полноценный бесплатный тарифный план (они очень гордятся [23] такой бизнес-моделью, которая отличается от стандартного фримиума и никак не принуждает пользователей переходить на платные тарифы). Клиентский софт открыт, как и шифровальный ретранслятор DERP. И клиенты, и DERP можно установить на своей инфраструктуре [24] (в том числе проверить исходный код и подкорректировать его для своих нужд).
В проприетарном пользовании (закрытый код) Tailscale держит только координационные серверы. Но в качестве альтернативы можно попробовать неофициальную свободную реализацию этих серверов Headscale [25]. Тогда вся частная сеть будет работать полностью на нашей инфраструктуре бесплатно и в защищённом виде. В любом случае, опенсорсный веб-клиент Tailscale SSH можно использовать совершенно свободно в любом стороннем приложении или сервисе, которое не нарушает лицензию.
Дополнительные сведения см. в официальной документации [26].
Автор:
ru_vds
Источник [27]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ssh/381914
Ссылки в тексте:
[1] Tailscale SSH Conscole: https://tailscale.com/kb/1193/tailscale-ssh/
[2] tailnet: https://tailscale.com/kb/1136/tailnet/
[3] WebAssembly: https://webassembly.org/
[4] WireGuard: https://www.wireguard.com/
[5] сетевой стек пользовательского пространства: https://gvisor.dev/docs/user_guide/networking/
[6] gVisor: https://gvisor.dev/
[7] «тоннель через WebSockets»: https://github.com/tailscale/tailscale/pull/4781
[8] этой библиотеки на Go: https://github.com/nhooyr/websocket
[9] такой схеме: https://tailscale.com/blog/ssh-console/
[10] ниже: #1
[11] что такое Tailscale: https://tailscale.com/blog/how-tailscale-works/
[12] WireGuard: https://en.wikipedia.org/wiki/WireGuard
[13] @zx2c4: https://twitter.com/zx2c4
[14] Тесты производительности с официального сайта: https://www.wireguard.com/performance/
[15] признался в любви к WireGuard: https://lists.openwall.net/netdev/2018/08/02/124
[16] включил его в ядро Linux 5.6: https://lists.zx2c4.com/pipermail/wireguard/2020-January/004906.html
[17] Tailscale: https://tailscale.com/
[18] платный сервис: https://tailscale.com/pricing/
[19] эфемерный ключ аутентификации: https://tailscale.com/kb/1085/auth-keys/
[20] Шифровальный ретранслятор пакетов: https://pkg.go.dev/tailscale.com/derp
[21] включить Tailscale SSH: https://tailscale.com/kb/1193/tailscale-ssh/#configure-tailscale-ssh
[22] админской панели: https://login.tailscale.com/admin/machines
[23] гордятся: https://tailscale.com/blog/free-plan/
[24] на своей инфраструктуре: https://tailscale.com/kb/1118/custom-derp-servers/#why-run-your-own-derp-server
[25] Headscale: https://github.com/juanfont/headscale
[26] официальной документации: https://tailscale.com/kb/start/
[27] Источник: https://habr.com/ru/post/709546/?utm_source=habrahabr&utm_medium=rss&utm_campaign=709546
Нажмите здесь для печати.