Приветствую друзья! Сегодня я бы хотел поделится опытом настройки безопасного туннеля к 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).
После успешного выполнения команд, на сервере будет установлена служба cloudflared, прописан токен доступа, а статус соединения сменится на Connected.
Следующим шагом нужно определить по какому адресу и какие сервисы будут доступны через созданный туннель. В данном примере рассматривается SSH, поэтому выбираем соответствующий тип, а в URL пишем localhost:22 (при условии что SSH на вашем сервере использует 22 порт).
На этом, настройка туннеля завершена и можно переходить непосредственно к настройке доступа к SSH через браузер.
Шаг 2. Настройка доступа к SSH через браузер
Для того чтобы включить рендеринг SSH, нужно добавить Self-hosted приложение в разделе Access -> Applications.
Создание приложения начинается с ввода основных настроек на странице Configure app. Здесь нужно задать имя и адрес для создаваемого приложения. Имя может быть любым, оно будет отображаться при обращении к странице. А вот в качестве адреса указываем тот адрес, который ранее был указан для службы SSH.
Кроме этого, здесь же задается один или несколько провайдеров для идентификации пользователя. В моем случае настроен только один: Yandex.
После ввода основных настроек, нужно определить политику доступа. Это может быть как ранее настроенная группа доступа, так и произвольный набор правил, который будет действовать только для этого приложения.
Количество поддерживаемых правил достаточно велико, поэтому при необходимости за подробным описанием лучше обращаться к оригиналу.
После определения правил можно переходить к заключительному этапу настройки приложения, где в разделе дополнительных настроек следует включить автоматическую авторизацию cloudflared и рендеринг SSH.
После нажатия на кнопку Add an application, если все сделано правильно, при переходе по адресу, указанному в приложении, будет отображена страница авторизации в Cloudflare Zero Trust с теми провайдерами, которые были указаны при настройке приложения.
После успешной авторизации будет отображена форма для ввода имени и пароля для аутентификации на сервере.
В принципе, на этом можно остановиться, т.к. после ввода валидной пары логин/пароль в браузере будет отрисована консоль SSH и можно приступать к работе, но я предлагаю продолжить настройку и сконфигурировать автоматический вход с использованием сертификатов.
Шаг 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 ключей резервного канала доступа к серверу не будет. В общем, рекомендация не для всех.
А на этом у меня пока все. Надеюсь эта заметка кому-нибудь пригодится =)