Shellinabox является веб-клиентом для SSH. Он не обладает всеми возможностями обычной программы ssh, но может использоваться в качестве резервного варианта: на случай, если протокол ssh вдруг окажется недоступен (например, заблокирован за возможность организации туннелей), или в ситуации, когда нужно зайти на сервер, а под рукой нет SSH-клиента (впрочем, он наверняка есть на вашем компьютере, телефоне и, может быть, даже в часах).
В данной статье мы рассмотрим настройку shellinabox на примере Debian GNU/Linux и веб-сервера Apache. Мы установим пакет shellinabox и настроим Apache для доступа к shellinaboxd.
После установки и минимальной настройки вы сможете просто открыть в браузере определённую страницу на вашем сайте и увидеть там приглашение ввести логин. Для большей безопасности эту страницу можно спрятать на имеющемся сайте, точнее говоря, вносить изменения в код сайта не потребуется, просто для определённого (заведомо не существующего) адреса ваш веб-сервер будет выполнять функцию обратного прокси-сервера и обращаться к локальному адресу, на котором будет работать shellinaboxd.
Конечно для безопасной работы нужно чтобы работа с вашим сайтом осуществлялось по защищённому соединению, иначе ваши пароли могут быть перехвачены. Настройка HTTPS и получение сертификата выходит за рамки данного материала, просто упомянем, что это очень просто делается при помощи приложения certbot.
Далее предполагается, что вы зашли на сервер с правами пользователя root. Итак, сначала просто устанавливаем shellinabox:
apt install shellinabox
Программа работает на порту 4200, это почти то, что нам нужно, за исключением того, что она по умолчанию будет настроена на использование HTTPS. Поскольку защищённое соединение у нас будет обеспечивать Apache (с имеющимся сертификатом), можно переключиться на использование в shellinabox протокола HTTP, и конечно его нужно ограничить локальным интерфейсом. Добиться этого можно отредактировав файл /etc/default/shellinabox
. Необходимо в опции командной строки при запуске приложения добавить ключи -t
и --localhost-only
, то есть, исправить в данном конфигурационном файле строку:
SHELLINABOX_ARGS="--no-beep"
В нашем случае она должна приобрести следующий вид:
SHELLINABOX_ARGS="--no-beep -t --localhost-only"
Дальше нам необходимо отредактировать конфигурацию Apache. Как уже ранее было сказано, он должен быть настроен на использование HTTPS. Также вам нужно убедиться, что установлен и подключён mod_proxy. В Debian он устанавливается в составе пакета apache2, и, если модуль отключён, вам нужно просто выполнить команду:
a2enmod proxy proxy_http
Далее в конфигурационный файл Apache нужно добавить директиву ProxyPass
. Наверняка вы знаете, который из файлов в вашем случае нужно отредактировать, если вы использовали certbot, то скорее всего это будет файл с именем вида /etc/apache2/sites-available/example.com-le-ssl.conf , добавьте туда, между тегами <VirtualHost *:443>
и </VirtualHost>
, следующий код (поменяйте путь в теге Location):
<Location /your/secret/path/to/web/ssh>
ProxyPass http://127.0.0.1:4200
</Location>
Более-менее сложный путь (в нашем примере /your/secret/path/to/web/ssh
) можно рассматривать как дополнительную защиту, для того, чтобы посторонний не знал, куда подключаться, чтобы получить доступ к веб-интерфейсу для SSH (и даже не смог проверить его наличие). Совсем не обязательно, чтобы элементы пути существовали на сервере. Также вы должны быть уверены в том, что этот путь не может использоваться на вашем сайте (иначе это может помешать его нормальной работе). Защиту можно ещё усилить включив парольную аутентификацию средствами Apache.
Теперь перезапустите Apache, и shellinabox, чтобы изменения настроек вступили в силу:
systemctl restart apache2 shellinabox
Теперь по адресу вида https://example.com/your/secret/path/to/web/ssh откроется страница shellinabox, и вы сможете управлять своим сервером через веб-интерфейс, примерно как на картинке:
Конечно, чтобы когда-нибудь не оказаться перед запертой дверью, нужно не забыть пароль от вашего сервера (что при постоянном использовании ключей для аутентификации сделать достаточно просто), также следует помнить, что парольная аутентификация для пользователя root может быть отключена.
Возможно это не самое лучшее решение для обычного использования, но нельзя исключать, что в текущих условиях такой вариант поможет сохранить контроль за сервером на иностранном VPS-хостинге в случае ухудшения ситуации с блокировками.
Комментарии (13)
wlw
03.06.2022 06:50Последний раз пользовался https://github.com/tsl0922/ttyd. Также положительный опыт с https://github.com/stuicey/SSHy. Список подобного обычно можно посмотреть https://xtermjs.org/ и выбирать по разным параметрам
balamutang
03.06.2022 10:15Еще есть guacamole, который может быть терминалом и для ssh и для rdp и тд
MUTbKA98
03.06.2022 10:49Мне всегда казалось, что аренда какого-нибудь (виртуального) сервера где-то "там" всегда подразумевает наличие аварийного доступа через какой-нибудь VNC, и с терминалом как раз через сайт провайдера подобного рода услуг.
То есть, ровно то, что и предлагается тут.
askharitonov Автор
03.06.2022 11:26Если работать только самому и только со своего компьютера, то разница небольшая (надо сравнивать, что быстрее, возможно этот вариант, поскольку там передаётся текст, а не изображение). Но если надо дать доступ другим людям или если требуется зайти с чужого компьютера (допустим, используя отдельный аккаунт, компрометация которого не вызовет серьёзных последствий), то использовать доступ через панель управления аккаунтом у провайдера — значит дать возможность посторонним зайти в систему как администратор (или вообще удалить все виртуальные машины). Даже если для доступа к экрану виртуальной машины используется пароль, отличный от пароля к панели управления хостингом, всё равно можно перезагрузить виртуальную машину, изменить настройки GRUB (init=/bin/bash и т.д.) и войти в систему без пароля.
В общем, данный вариант безопаснее.
amarao
03.06.2022 12:02+9В такой ситуации наиболее эффективным транспортным протоколом для администрирования является авиационный.
Достаточно перевезти администратора в страну, где ssh работает, и проблема блокировки ssh решена.
t13s
03.06.2022 13:43Авиационный протокол файерволами с обеих сторон плотно заблокирован.
Тут надо роутинг продумывать, а то и где трафик мимикрировать.
HabraZ0
03.06.2022 13:32-2Уже давно использую webmin для всех серверов по умолчанию. Кроме ssh на https имеет кучу приятных плюшек.
Kremleb0t
Проще сам ssh тунеллировать через ssl-соединение, например с помощю stunel.
Если слушать 443 порт то DPI не сможет отличить это соединение от браузерного https-запроса.
kt97679
ssh можно туннелировать через websockets, тогда он вообще будет неотличим от http траффика, вот статья на эту тему.
tendium
Даже делал такое намедни. Вот пример (не мой) как это сделать: https://github.com/leihaiyong/MiniWebSSHServer
Там, правда, маленькая ошибка в коде есть, из-за чего соединение рвётся, но суть ясна. Однако, так не сделаешь VPN. Но было бы любопытно увидеть websocket-based впн :)
Aelliari
Wstunnel?
tendium
Оказывается, я видел этот проект (судя по цвету ссылки), но забыл. Спасибо.