Cómo conectarse a la terminal desde su navegador usando Python WebSSH

0 acciones
0
0
0
0

Introducción

Normalmente, se utiliza una herramienta de línea de comandos en un terminal o un emulador de terminal que incluye un cliente SSH para conectarse a un servidor SSH. Algunas herramientas, como WebSSH en Python, permiten conectarse mediante SSH y ejecutar un terminal directamente en un navegador web.

Esta función es útil en diversas situaciones. Es especialmente útil en presentaciones o demostraciones en vivo, donde es difícil compartir una ventana de terminal estándar de forma fácil de entender. También es útil en entornos educativos, al proporcionar acceso a personas que no están familiarizadas con la línea de comandos, ya que no requiere instalar software en sus equipos (especialmente en Windows, donde las opciones predeterminadas son problemáticas). Por último, Python WebSSH es especialmente portátil y no requiere la configuración de otras dependencias, aparte de Python. Otras pilas de terminales web pueden ser más complejas y específicas de Linux.

En este tutorial, configurará WebSSH y se conectará a él mediante SSH en su navegador. Opcionalmente, podrá protegerlo con un certificado SSL y colocarlo detrás de un proxy inverso Nginx para su implementación en producción.

Requisitos previos
  • Un entorno Windows, Mac o Linux con un servicio SSH en ejecución. Es útil ejecutar WebSSH localmente, pero si no tiene un servicio SSH en su equipo local, puede usar un servidor Linux remoto.
  • El lenguaje de programación Python se instala con pip, su gestor de paquetes. Para instalar Python y pip en Ubuntu, puedes consultar la primera parte de este tutorial.
  • Opcionalmente, para habilitar HTTPS en el navegador, necesitará certificados SSL y su nombre de dominio. Puede obtenerlos usando Certbot en modo independiente.

Paso 1 – Instalar WebSSH

Si tiene Python y pip instalados, debería poder instalar paquetes de Python desde PyPI (el repositorio de software de Python). WebSSH está diseñado para instalarse y ejecutarse directamente desde la línea de comandos, por lo que no es necesario configurar otro entorno virtual como el de... Tutorial de instalación de Python 3 Como ya comentamos, no. Los entornos virtuales son más útiles cuando trabajas en tus propios proyectos, no cuando instalas herramientas del sistema.

Para instalar el paquete WebSSH, utilice el siguiente comando:

sudo pip3 install webssh

El resultado debería ser el siguiente:

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

Usar sudo instalará el comando wssh globalmente. Puedes comprobar dónde está instalado wssh con el comando which:

which wssh

La salida debería verse así:

/usr/local/bin/wssh

Ya tiene instalado WebSSH. A continuación, lo ejecutará y se conectará. Sin embargo, primero debe agregar una regla de firewall. WebSSH se ejecuta en el puerto 8888 por defecto. Si usa ufw como firewall, habilite ese puerto a través de ufw:

sudo ufw allow 8888

Paso 2: Ejecute WebSSH y conéctese a él

Si ejecuta WebSSH en una máquina local, puede ejecutar el comando wssh sin argumentos adicionales. Si ejecuta WebSSH en un servidor remoto, debe usar la opción -s. --fbidhttp=Falso Úselo para permitir conexiones remotas mediante HTTP. Esta conexión no es segura si utiliza una red no segura, pero es útil para una demostración y protegerá WebSSH en los siguientes pasos.

wssh --fbidhttp=False

Ahora puedes conectarte a WebSSH e iniciar sesión. En la dirección tu_dominio:8888 En su navegador web, vaya a (si está ejecutando localmente, desde) host local:8888 Debería mostrarse la página de inicio de sesión de WebSSH.

Ingrese sus credenciales SSH habituales. Si siguió la guía de configuración del servidor de DigitalOcean, debería usar autenticación basada en claves, no contraseñas. Por lo tanto, solo necesita especificar el nombre de host del servidor, su nombre de usuario y la clave SSH, que debe estar en la carpeta. .ssh/ ubicado en su directorio de inicio (generalmente llamado id_rsa es).

Nota: Como puede deducirse al especificar manualmente el nombre de host, WebSSH también puede usarse para conectarse a servidores distintos del que se está ejecutando. En este tutorial, se ejecutará en el mismo servidor al que se está conectando.

Para conectarse, haga clic en el botón. Conectar Haga clic y debería ver la pantalla de bienvenida de su terminal predeterminada.

En este punto, puede usar su terminal como siempre, como si estuviera conectado por SSH. Varios usuarios también pueden conectarse simultáneamente a través de una instancia WebSSH. Esto podría ser necesario si tiene WebSSH en una máquina local solo para transmitir o grabar video. Puede presionar Ctrl+C en la terminal donde inició WebSSH (no en la terminal WebSSH) para detener el servidor WebSSH una vez finalizado.

Si está ejecutando un servidor remoto, no conviene usar WebSSH en producción tras una conexión HTTP insegura. Aunque sigue estando protegido por el mecanismo de autenticación del servicio SSH, usar una conexión SSH a través de HTTP conlleva un riesgo de seguridad significativo y podría permitir que otros roben sus credenciales SSH. En los siguientes pasos, protegerá su instancia de WebSSH para que no sea menos segura que una conexión SSH normal.

Paso 3 – (Opcional) Asegure WebSSH con un certificado SSL

Para completar este paso, ya debe haber obtenido su dominio y certificados SSL. Una opción es usar Certbot en modo independiente.

Luego de recibir los certificados, verifique que se encuentren en la siguiente ruta:

sudo ls /etc/letsencrypt/live/your_domain

Para ejecutar WebSSH con soporte HTTPS, debe proporcionarle la ruta al certificado y la clave:

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

En su navegador web, vaya a https://su_dominio:4433 Continúe y debería ver la misma interfaz que vio en el paso anterior, ahora con soporte HTTPS.

Paso 4 – (Opcional) Ejecutar WebSSH detrás del proxy inverso Nginx

Al instalar un servidor web como Nginx en sus aplicaciones web, puede mejorar el rendimiento y simplificar la seguridad del sitio. Instalará Nginx y lo configurará para revertir las solicitudes de proxy a WebSSH.

Primero, actualice su lista de paquetes, luego instale Nginx:

sudo apt update nginx
sudo apt install nginx

Si está utilizando el firewall ufw, debe cambiar su configuración para permitir el acceso a los puertos HTTP/HTTPS predeterminados (puertos 80 y 443):

sudo ufw allow “Nginx Full”

Luego copie el archivo de configuración de Nginx a la ruta /etc/nginx/sitios-disponibles/webssh Crear:

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

Ingrese a una configuración similar a la siguiente:

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;
}
}

Esta configuración se compone de tres bloques principales. El primer bloque, antes de la línea location/, contiene la configuración de Nginx para servir un sitio web en el puerto HTTP predeterminado, 80. El bloque location/ contiene la configuración para redirigir las conexiones entrantes a WebSSH, que se ejecuta internamente en el puerto 8888, manteniendo el protocolo SSL. La configuración al final del archivo, después del bloque location/, carga los pares de claves SSL de LetsEncrypt y redirige las conexiones HTTP a HTTPS.

Guarde y cierre el archivo. Si usa nano, presione Ctrl+X, luego Y y luego Enter cuando se le solicite.

A continuación, debe habilitar esta nueva configuración. La convención de Nginx es crear enlaces simbólicos (como accesos directos) desde los archivos en sites/ a otra carpeta llamada sites-enabled/ cuando decida habilitarlos o deshabilitarlos. Cree este enlace, utilizando las rutas completas para mayor claridad:

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

De forma predeterminada, Nginx incluye otro archivo de configuración en /etc/nginx/sites-available/default, que está vinculado a /etc/nginx/sites-enabled/default y que también proporciona su página de índice predeterminada. Para deshabilitar esta regla, elimínela de /sites-enabled, ya que entra en conflicto con su nueva configuración de WebSSH:

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

Nota: La configuración de Nginx de este tutorial está diseñada para una sola aplicación: WebSSH. Puede ampliar esta configuración para que funcione con varias aplicaciones en un solo servidor siguiendo la documentación de Nginx.

Luego, prueba la configuración de 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

Y reinicia el servicio Nginx:

sudo systemctl restart nginx

Por último, puedes eliminar las reglas de firewall que creaste previamente para el acceso directo a WebSSH, ya que todo el tráfico ahora será manejado por Nginx a través de puertos HTTP/HTTPS estándar:

sudo ufw delete allow 8888
sudo ufw delete allow 4433

Esta vez no es necesario proporcionar las rutas del certificado ni de la clave, ya que Nginx se encargará de ello. Luego, acceda a "your_domain" en un navegador web.

Tenga en cuenta que WebSSH ahora se sirve mediante HTTPS a través de Nginx sin necesidad de especificar un puerto. En este punto, ha automatizado todo excepto la configuración de wssh. Lo hará en el último paso.

Paso 5 – (Opcional) Crear un servicio Systemd para WebSSH

Implementar aplicaciones del lado del servidor que no se ejecutan automáticamente en segundo plano puede resultar poco práctico al principio, ya que hay que iniciarlas directamente desde la línea de comandos cada vez. La solución es iniciar un servicio en segundo plano propio.

Para ello, crea un único archivo que pueda usar el sistema de inicio de tu servidor. En casi todas las distribuciones modernas de Linux, el sistema de inicio se llama Systemd y puedes interactuar con él mediante el comando systemctl.

Si WebSSH sigue ejecutándose en tu terminal, pulsa Ctrl+C para detenerlo. Luego, con nano o tu editor de texto favorito, abre un nuevo archivo llamado /etc/systemd/system/webssh.service:

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

Su archivo de unidad necesita al menos una sección [Unidad], una sección [Servicio] y una sección [Instalación]:

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

Este archivo se puede dividir de la siguiente manera:

  • La sección [Unidad] contiene una descripción de texto simple de su nuevo servicio, así como un gancho After que especifica cuándo debe ejecutarse al iniciar el sistema, en este caso después de que se hayan activado las interfaces de red de su servidor.
  • La sección [Servicio] especifica qué comando debe ejecutarse y qué usuario debe hacerlo. En este caso, www-data es el usuario predeterminado de Nginx en el servidor Ubuntu y wssh es el comando.
  • La sección [install] solo contiene la línea WantedBy=multi-user.target, que funciona junto con la línea After en la sección [unit] para garantizar que el servicio se inicie cuando el servidor esté listo para aceptar inicios de sesión de usuarios.

Después de guardar el archivo, inicie el servicio y habilítelo para que se ejecute al iniciar el sistema:

sudo systemctl start webssh
sudo systemctl enable webssh

Usa systemctl status webssh para verificar que se haya iniciado correctamente. Deberías obtener el mismo resultado que al ejecutar el comando por primera vez en la terminal.

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)

Ahora puedes recargar https://your_domain en tu navegador y deberías acceder de nuevo a la interfaz WebSSH. A partir de ahora, WebSSH y Nginx se reiniciarán automáticamente con tu servidor y se ejecutarán en segundo plano.

Resultado

En este tutorial, instalaste WebSSH y proporcionaste una solución portátil para proporcionar una interfaz de línea de comandos en un navegador web. Posteriormente, optimizaste su implementación añadiendo SSL, un proxy inverso Nginx y creando un servicio systemd. Este modelo es muy útil para implementar pequeñas aplicaciones del lado del servidor, especialmente en el contexto de la seguridad SSH que utiliza pares de claves para la autenticación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

También te puede gustar