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)


  1. Kremleb0t
    03.06.2022 06:38
    +3

    Проще сам ssh тунеллировать через ssl-соединение, например с помощю stunel.
    Если слушать 443 порт то DPI не сможет отличить это соединение от браузерного https-запроса.


    1. kt97679
      03.06.2022 07:38
      +2

      ssh можно туннелировать через websockets, тогда он вообще будет неотличим от http траффика, вот статья на эту тему.


      1. tendium
        03.06.2022 10:07

        Даже делал такое намедни. Вот пример (не мой) как это сделать: https://github.com/leihaiyong/MiniWebSSHServer


        Там, правда, маленькая ошибка в коде есть, из-за чего соединение рвётся, но суть ясна. Однако, так не сделаешь VPN. Но было бы любопытно увидеть websocket-based впн :)


        1. Aelliari
          03.06.2022 13:47
          +1

          1. tendium
            04.06.2022 09:30

            Оказывается, я видел этот проект (судя по цвету ссылки), но забыл. Спасибо.


  1. wlw
    03.06.2022 06:50

    Последний раз пользовался https://github.com/tsl0922/ttyd. Также положительный опыт с https://github.com/stuicey/SSHy. Список подобного обычно можно посмотреть https://xtermjs.org/ и выбирать по разным параметрам


  1. balamutang
    03.06.2022 10:15

    Еще есть guacamole, который может быть терминалом и для ssh и для rdp и тд


  1. MUTbKA98
    03.06.2022 10:49

    Мне всегда казалось, что аренда какого-нибудь (виртуального) сервера где-то "там" всегда подразумевает наличие аварийного доступа через какой-нибудь VNC, и с терминалом как раз через сайт провайдера подобного рода услуг.

    То есть, ровно то, что и предлагается тут.


    1. askharitonov Автор
      03.06.2022 11:26

      Если работать только самому и только со своего компьютера, то разница небольшая (надо сравнивать, что быстрее, возможно этот вариант, поскольку там передаётся текст, а не изображение). Но если надо дать доступ другим людям или если требуется зайти с чужого компьютера (допустим, используя отдельный аккаунт, компрометация которого не вызовет серьёзных последствий), то использовать доступ через панель управления аккаунтом у провайдера — значит дать возможность посторонним зайти в систему как администратор (или вообще удалить все виртуальные машины). Даже если для доступа к экрану виртуальной машины используется пароль, отличный от пароля к панели управления хостингом, всё равно можно перезагрузить виртуальную машину, изменить настройки GRUB (init=/bin/bash и т.д.) и войти в систему без пароля.

      В общем, данный вариант безопаснее.


  1. amarao
    03.06.2022 12:02
    +9

    В такой ситуации наиболее эффективным транспортным протоколом для администрирования является авиационный.

    Достаточно перевезти администратора в страну, где ssh работает, и проблема блокировки ssh решена.


    1. t13s
      03.06.2022 13:43

      Авиационный протокол файерволами с обеих сторон плотно заблокирован.

      Тут надо роутинг продумывать, а то и где трафик мимикрировать.


  1. HabraZ0
    03.06.2022 13:32
    -2

    Уже давно использую webmin для всех серверов по умолчанию. Кроме ssh на https имеет кучу приятных плюшек.


  1. Fullmoon
    03.06.2022 14:29

    Я ещё приплюсую Sshwifty, но в целом, имхо, этот костыль уж очень узкого применения, как-то завернуть в туннель чистый ssh надёжнее и удобнее.