Cloudflare Zero Trust. Доступ к SSH из браузера

Приветствую друзья! Сегодня я бы хотел поделится опытом настройки безопасного туннеля к SSH c помощью сервиса Zero Trust от Cloudflare. В свое время, о возможности получить доступ к консоли VPS из браузера я узнал совершенно случайно, но с тех пор использую такой вариант регулярно. Да, есть свои ограничения и данный способ не является полноценной заменой, например, определенные неудобства будут испытывать те, кто привык к копированию выделенного фрагмента в буфер обмена через правую кнопку мыши, комбинациям CTRL+C/CTRL+V. Тем менее, к этим ограничениям быстро привыкаешь и в большинстве случаев возможностей, которые предлагает данный туннель, хватает для решения большинства повседневных задач.

С подробным описанием этой технологии можно ознакомиться на сайте Cloudfalre. В этой заметке я ограничусь примером настройки туннеля на VPS под управлением Ubuntu 22.04 LTS, но по ссылке выше вы найдете инструкции для множества других поддерживаемых операционных систем.

Шаг 1. Создание туннеля cloudflared

Для работы туннеля на сервере обязательно должна быть установлена служба cloudflared. Есть несколько путей ее установки, на момент написания этой заметки рекомендованный вариант установка через панель управления Cloudflre Zero Trust. Для этого в разделе Access -> Tunnels нужно нажать кнопку Create a tunnel, после чего выполнить инструкции по установке службы cloudflared для операционной системы, установленной на сервере (в моем случае, для Ubuntu 22.04 LTS, это Debian).

Добавление туннеля в Cloudflare Zero Trust,

После успешного выполнения команд, на сервере будет установлена служба cloudflared, прописан токен доступа, а статус соединения сменится на Connected.

Рабочий туннель

Следующим шагом нужно определить по какому адресу и какие сервисы будут доступны через созданный туннель. В данном примере рассматривается SSH, поэтому выбираем соответствующий тип, а в URL пишем localhost:22 (при условии что SSH на вашем сервере использует 22 порт).

Настройка туннелирования SSH

На этом, настройка туннеля завершена и можно переходить непосредственно к настройке доступа к SSH через браузер.

Шаг 2. Настройка доступа к SSH через браузер

Для того чтобы включить рендеринг SSH, нужно добавить Self-hosted приложение в разделе Access -> Applications.

Добавление Self-hosted application

Создание приложения начинается с ввода основных настроек на странице Configure app. Здесь нужно задать имя и адрес для создаваемого приложения. Имя может быть любым, оно будет отображаться при обращении к странице. А вот в качестве адреса указываем тот адрес, который ранее был указан для службы SSH.

Настройка self-hosted приложения

Кроме этого, здесь же задается один или несколько провайдеров для идентификации пользователя. В моем случае настроен только один: Yandex.

Настройка провайдеров авторизации

После ввода основных настроек, нужно определить политику доступа. Это может быть как ранее настроенная группа доступа, так и произвольный набор правил, который будет действовать только для этого приложения.

Настройка политики доступа

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

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

Включение рендеринга для SSH

После нажатия на кнопку Add an application, если все сделано правильно, при переходе по адресу, указанному в приложении, будет отображена страница авторизации в Cloudflare Zero Trust с теми провайдерами, которые были указаны при настройке приложения.

Страница авторизации Cloudflare Zero Trust

После успешной авторизации будет отображена форма для ввода имени и пароля для аутентификации на сервере.

Внешний вид формы авторизации

В принципе, на этом можно остановиться, т.к. после ввода валидной пары логин/пароль в браузере будет отрисована консоль SSH и можно приступать к работе, но я предлагаю продолжить настройку и сконфигурировать автоматический вход с использованием сертификатов.

Рендеринг SSH в браузере Chrome средствами Cloudflare

Шаг 3. Сертификаты с ограниченным временем жизни

Для того чтобы каждый раз не вводить логин и пароль, можно настроить использование сертификатов с ограниченным временем жизни. Самая простая конфигурация заключается в том, чтобы связать имя пользователя Unix и префикс электронной почты, используемой им при авторизации в приложении.

Разберем пример такой конфигурации для пользователя с адресом [email protected]. Пользователь с адресом [email protected] должен существовать у провайдера идентификации, выбранного при настройке приложения. Чтобы конфигурация работала, на сервере должен существовать пользователь some.user. Если такого пользователя нет, то его нужно создать командой adduser. В примере используется имя, содержащее точку, и для создания подобных пользователей необходимо использовать ключ –force-badname. Чтобы создаваемый пользователь мог вызывать команды от имени администратора, используется команда usermod .

sudo adduser --force-badname some.user
sudo usermod -a -G sudo some.user

После добавления нового пользователя переходим в панель управления Cloudflare в раздел Access -> Service Auth. Там выбираем ранее созданное приложение и нажимаем кнопку Generate Certificate. Полученный публичный сертификат следует сохранить на сервере в файле /etc/ssh/ca.pub

sudo nano /etc/ssh/ca.pub

Последний шаг – модификация файла /etc/ssh/sshd_config. Нужно найти и раcкомментировать строчку (удалить символ #):

# PubkeyAuthentication yes

Сразу после этой строчки добавить

TrustedUserCAKeys /etc/ssh/ca.pub

Сохраняем файл и перезапускаем службу ssh:

sudo systemctl restart ssh

Теперь, после аутентификации, при обращении по адресу выбудете входить в учетную запись some.user автоматически.

Вместо заключения

В качестве дополнительных мер, направленных на усиление безопасности, я рекомендую отключение возможности входа для пользователя root по SSH. Для отключения возможности авторизации пользователя root, достаточно изменить параметр PermitRootLogin в файле /etc/ssh/sshd_config и перезапустить службу.

PermitRootLogin no 

Лучшим вариантом будет, на мой взгляд, полное отключение аутентификации по паролю, но не все провайдеры VPS дают возможность подключиться по VNC, а это значит, что в случае каких-то проблем с Cloudflare и потери SSH ключей резервного канала доступа к серверу не будет. В общем, рекомендация не для всех.

А на этом у меня пока все. Надеюсь эта заметка кому-нибудь пригодится =)