Как подключиться к терминалу из браузера с помощью Python WebSSH

0 Акции
0
0
0
0

Введение

Обычно для подключения к SSH-серверу используется утилита командной строки в терминале или эмуляторе терминала, включающая SSH-клиент. Некоторые инструменты, например, WebSSH на Python, позволяют подключаться по SSH и запускать терминал непосредственно в веб-браузере.

Эта функция полезна в различных ситуациях. Она особенно полезна во время презентаций или демонстраций, где сложно организовать доступ к обычному окну терминала в понятной форме. Она также полезна в образовательных учреждениях, предоставляя доступ людям, не знакомым с командной строкой, поскольку не требует установки программного обеспечения на их компьютеры (особенно в Windows, где параметры по умолчанию неудобны). Наконец, Python WebSSH отличается высокой портативностью и не требует установки каких-либо других зависимостей, кроме Python. Другие стеки веб-терминалов могут быть более сложными и специфичными для Linux.

В этом руководстве вы настроите WebSSH и подключитесь к нему по SSH в браузере. Затем, при необходимости, защитите его SSL-сертификатом и разместите за обратным прокси-сервером Nginx для развертывания в рабочей среде.

Предпосылки
  • Среда Windows, Mac или Linux с запущенной службой SSH. WebSSH удобно запускать локально, но если на вашем компьютере нет службы SSH, можно использовать удалённый сервер Linux.
  • Язык программирования Python устанавливается с помощью менеджера пакетов pip. Чтобы установить Python и pip в Ubuntu, обратитесь к первой части этого руководства.
  • При необходимости для включения HTTPS в браузере вам понадобятся SSL-сертификаты и ваше доменное имя. Вы можете получить их с помощью Certbot в автономном режиме.

Шаг 1 — Установка WebSSH

Если у вас установлены Python и pip, вы сможете установить пакеты Python из PyPI (репозитория программного обеспечения Python). WebSSH предназначен для установки и запуска непосредственно из командной строки, поэтому нет необходимости настраивать ещё одну виртуальную среду, как в Руководство по установке Python 3 Как уже говорилось, нет. Виртуальные среды более полезны при работе над собственными проектами, а не при установке системных инструментов.

Чтобы установить пакет WebSSH, используйте следующую команду:

sudo pip3 install webssh

Вывод должен быть следующим:

Output
…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0

Использование sudo установит команду wssh глобально. Вы можете проверить, где установлен wssh, с помощью команды which:

which wssh

Вывод должен выглядеть примерно так:

/usr/local/bin/wssh

Теперь у вас установлен WebSSH. Теперь вам нужно запустить его и подключиться к нему. Однако сначала необходимо добавить правило брандмауэра. По умолчанию WebSSH работает на порту 8888. Если вы используете UFW в качестве брандмауэра, разрешите этот порт через UFW:

sudo ufw allow 8888

Шаг 2 — Запустите WebSSH и подключитесь к нему

Если вы используете WebSSH на локальном компьютере, вы можете запустить команду wssh без дополнительных аргументов. Если вы используете WebSSH на удалённом сервере, необходимо использовать опцию -s. --fbidhttp=False Используйте для разрешения удалённых подключений по HTTP. Это соединение небезопасно, если вы используете незащищённую сеть, но оно полезно для демонстрации, а на следующих шагах вы обеспечите безопасность WebSSH.

wssh --fbidhttp=False

Теперь вы можете подключиться к WebSSH и войти в систему. По адресу ваш_домен:8888 В веб-браузере перейдите по адресу (если вы работаете локально, то с сайта) локальный хост:8888 Должна отобразиться страница входа в WebSSH.

Введите ваши обычные учётные данные SSH. Если вы следовали руководству по настройке сервера DigitalOcean, вам следует использовать аутентификацию на основе ключей, а не паролей. Поэтому вам нужно указать только имя хоста сервера, ваше имя пользователя и ключ SSH, который должен находиться в папке .ssh/ расположенный в вашем домашнем каталоге (обычно называется id_rsa является).

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

Для подключения нажмите кнопку. Соединять Щелкните, и вы увидите экран приветствия терминала по умолчанию.

На этом этапе вы можете использовать терминал как обычно, как при подключении по SSH. Несколько пользователей также могут одновременно подключаться через экземпляр WebSSH. Это может понадобиться, если WebSSH используется на локальном компьютере только для потоковой передачи или записи видео. Вы можете нажать Ctrl+C в терминале, где был запущен WebSSH (не в терминале WebSSH), чтобы остановить сервер WebSSH после завершения его работы.

Если вы работаете на удалённом сервере, вам не следует использовать WebSSH в рабочей среде, используя незащищённое HTTP-соединение. Хотя механизм аутентификации SSH-сервиса по-прежнему защищает вас, использование SSH-подключения через HTTP несёт в себе значительный риск безопасности и потенциально может позволить злоумышленникам украсть ваши учётные данные SSH. На следующих этапах вы защитите свой экземпляр WebSSH, сделав его не менее безопасным, чем обычное SSH-подключение.

Шаг 3 — (Необязательно) Защитите WebSSH с помощью SSL-сертификата

Для выполнения этого шага вам необходимо получить домен и SSL-сертификаты. Один из способов — использовать Certbot в автономном режиме.

После получения сертификатов убедитесь, что они находятся по следующему пути:

sudo ls /etc/letsencrypt/live/your_domain

Для запуска WebSSH с поддержкой HTTPS необходимо указать путь к сертификату и ключу:

sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem''

В вашем веб-браузере перейдите по адресу https://ваш_домен:4433 Продолжайте, и вы увидите тот же интерфейс, что и на предыдущем шаге, но теперь с поддержкой HTTPS.

Шаг 4 — (Необязательно) Запуск WebSSH через обратный прокси-сервер Nginx

Разместив веб-сервер, такой как Nginx, перед вашими веб-приложениями, вы сможете повысить производительность и упростить безопасность сайта. Вам предстоит установить Nginx и настроить его для обратного прокси-запроса к WebSSH.

Сначала обновите список пакетов, затем установите Nginx:

sudo apt update nginx
sudo apt install nginx

Если вы используете брандмауэр UFW, вам необходимо изменить его конфигурацию, чтобы разрешить доступ к портам HTTP/HTTPS по умолчанию (порты 80 и 443):

sudo ufw allow “Nginx Full”

Затем скопируйте файл конфигурации Nginx по адресу /etc/nginx/sites-available/webssh Создавать:

sudo nano /etc/nginx/sites-available/webssh

Введите конфигурацию, аналогичную следующей:

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
listen 443 ssl;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}

Эту конфигурацию можно интерпретировать как состоящую из трёх основных “блоков”. Первый блок, перед строкой location/, содержит конфигурацию Nginx для обслуживания веб-сайта на HTTP-порту по умолчанию 80. Блок location/ содержит конфигурацию для проксирования входящих подключений к WebSSH, который работает на внутреннем порту 8888 с сохранением SSL. Конфигурация в конце файла, после блока location/, загружает пары SSL-ключей LetsEncrypt и перенаправляет HTTP-подключения на HTTPS.

Сохраните и закройте файл. Если вы используете nano, нажмите Ctrl+X, затем Y и Enter при появлении запроса.

Далее необходимо включить эту новую конфигурацию. Nginx использует соглашение о создании символических ссылок (например, ярлыков) из файлов в каталоге sites/ на другую папку с именем sites-enabled/, когда вы решаете включить или отключить их. Создайте эту ссылку, используя для ясности полные пути:

sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh

По умолчанию Nginx включает другой файл конфигурации в /etc/nginx/sites-available/default, связанный с /etc/nginx/sites-enabled/default , который также предоставляет главную страницу по умолчанию. Вы хотите отключить это правило, удалив его из /sites-enabled , так как оно конфликтует с вашей новой конфигурацией WebSSH:

sudo rm /etc/nginx/sites-enabled/default

Примечание: Конфигурация Nginx в этом руководстве предназначена для обслуживания одного приложения — WebSSH. Вы можете расширить эту конфигурацию Nginx для обслуживания нескольких приложений на одном сервере, следуя документации по Nginx.

Затем проверьте конфигурацию Nginx:

sudo nginx -t
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

И перезапустите службу Nginx:

sudo systemctl restart nginx

Наконец, вы можете удалить правила брандмауэра, которые вы ранее создали для прямого доступа WebSSH, поскольку весь трафик теперь будет обрабатываться Nginx через стандартные порты HTTP/HTTPS:

sudo ufw delete allow 8888
sudo ufw delete allow 4433

На этот раз вам не нужно указывать пути к сертификату и ключу, так как Nginx сделает это за вас. Затем перейдите на your_domain в веб-браузере.

Обратите внимание, что WebSSH теперь обслуживается по HTTPS через Nginx без необходимости указывать порт. На этом этапе вы автоматизировали всё, кроме настройки wssh. Это нужно сделать на последнем шаге.

Шаг 5 — (Необязательно) Создание службы Systemd для WebSSH

Развёртывание серверных приложений, которые не запускаются автоматически в фоновом режиме, поначалу может быть непрактичным, поскольку приходится каждый раз запускать их непосредственно из командной строки. Решение — запустить собственную фоновую службу.

Для этого вам нужно создать один файл, который может использоваться системой инициализации вашего сервера. Практически во всех современных дистрибутивах Linux система инициализации называется Systemd, и вы можете взаимодействовать с ней с помощью команды systemctl.

Если WebSSH всё ещё запущен в вашем терминале, нажмите Ctrl+C, чтобы остановить его. Затем с помощью nano или вашего любимого текстового редактора откройте новый файл с именем /etc/systemd/system/webssh.service:

sudo nano /etc/systemd/system/webssh.service

В вашем файле модуля должен быть как минимум один раздел [Unit], один раздел [Service] и один раздел [Install]:

[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target

Этот файл можно разделить следующим образом:

  • Раздел [Unit] содержит простое текстовое описание вашей новой службы, а также хук After, который указывает, когда она должна запускаться при запуске системы, в данном случае после того, как будут активированы сетевые интерфейсы вашего сервера.
  • Раздел [Service] определяет, какую команду следует выполнить, а также какой пользователь должен её запустить. В данном случае www-data — это пользователь Nginx по умолчанию на сервере Ubuntu, а wssh — сама команда.
  • Раздел [install] содержит только строку WantedBy=multi-user.target, которая работает вместе со строкой After в разделе [unit], чтобы гарантировать запуск службы, когда сервер готов принимать входы пользователей.

После сохранения файла запустите службу и включите ее запуск при старте системы:

sudo systemctl start webssh
sudo systemctl enable webssh

Используйте команду systemctl status webssh, чтобы убедиться в успешном запуске. Вы должны получить тот же результат, что и при первом запуске команды в терминале.

sudo systemctl status webssh
Output
● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)

Теперь вы можете перезагрузить https://your_domain в браузере, и интерфейс WebSSH должен снова появиться. С этого момента WebSSH и Nginx будут автоматически перезапускаться вместе с вашим сервером и работать в фоновом режиме.

Результат

В этом руководстве вы установили WebSSH и создали портативное решение для предоставления интерфейса командной строки в веб-браузере. Затем вы улучшили его развёртывание, добавив SSL, обратный прокси-сервер Nginx и создав службу systemd. Эта модель очень полезна для развёртывания небольших серверных приложений, особенно в контексте безопасности SSH, использующей пары ключей для аутентификации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться