Ricerca nel sito web

Come connettersi a un terminale dal browser utilizzando Python WebSSH


introduzione

In genere, ti connetti a un server SSH utilizzando un'app della riga di comando in un terminale o un software di emulazione di terminale che include un client SSH. Alcuni strumenti, come WebSSH di Python, consentono di connettersi tramite SSH ed eseguire un terminale direttamente nel browser web.

Questo può essere utile in una serie di situazioni. È particolarmente utile per dare presentazioni dal vivo o demo, quando sarebbe difficile condividere una normale finestra di terminale in un modo che abbia un senso visivo. Può anche essere utile in contesti educativi quando si concede l'accesso ai principianti della riga di comando, in quanto evita loro di dover installare software sulle proprie macchine (specialmente su Windows, dove le opzioni predefinite sono accompagnate da avvertimenti). Infine, WebSSH di Python in particolare è molto portabile e non richiede dipendenze diverse da Python per essere installato e funzionante. Altri stack di terminali basati sul Web possono essere molto più complicati e specifici di Linux.

In questo tutorial, configurerai WebSSH e ti connetterai tramite SSH nel tuo browser. Facoltativamente, lo proteggerai con un certificato SSL e lo eseguirai dietro un proxy inverso Nginx per una distribuzione di produzione.

Prerequisiti

  • Un ambiente Windows, Mac o Linux con un servizio SSH in esecuzione. Può essere utile eseguire WebSSH localmente, ma se non si dispone di un servizio SSH in esecuzione su un computer locale, è possibile utilizzare un server Linux remoto seguendo la nostra guida alla configurazione iniziale del server per Ubuntu 22.04.
  • Il linguaggio di programmazione Python installato insieme a pip, il suo gestore di pacchetti. Puoi installare Python e pip su Ubuntu seguendo il passaggio 1 di questo tutorial.
  • Facoltativamente, per abilitare HTTPS nel browser, avrai bisogno di certificati SSL e del tuo nome di dominio. Puoi ottenerli seguendo How To Use Certbot Standalone Mode to Retrieve Let's Encrypt SSL Certificates. Se non disponi di un tuo nome di dominio, puoi utilizzare un indirizzo IP per i primi due passaggi di questo tutorial.

Passaggio 1: installazione di WebSSH

Se hai già installato Python e pip, dovresti essere in grado di installare i pacchetti Python da How To Install Python 3 e Set Up a Programming Environment. Gli ambienti virtuali sono più utili quando si lavora sui propri progetti, non quando si installano strumenti a livello di sistema.

Usa pip install per installare il pacchetto WebSSH:

  1. 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

L'installazione tramite sudo installerà il comando wssh a livello globale. Puoi verificarlo usando which wssh:

  1. which wssh
Output
/usr/local/bin/wssh

Ora hai installato WebSSH. Nel passaggio successivo, eseguirai e ti connetterai ad esso. Prima, però, dovrai aggiungere una regola firewall. WebSSH viene eseguito sulla porta 8888 per impostazione predefinita. Se stai usando ufw come firewall, consenti quella porta attraverso ufw:

  1. sudo ufw allow 8888

Rivisiterai quella regola del firewall più avanti in questo tutorial.

Passaggio 2: esecuzione e connessione a WebSSH

Se stai eseguendo WebSSH su una macchina locale, puoi eseguire wssh da solo senza argomenti aggiuntivi da avviare. Se stai eseguendo WebSSH su un server remoto, dovrai aggiungere il flag --fbidhttp=False per consentire le connessioni remote tramite il normale HTTP. Questo non è sicuro se ti connetti su una rete non protetta, ma è utile per una demo e proteggerai WebSSH più avanti in questo tutorial.

  1. wssh --fbidhttp=False

Ora puoi connetterti a WebSSH e accedere. Passa a tuo_dominio:8888 in un browser Web (utilizzando localhost al posto di tuo_dominio se stai eseguendo localmente). Vedrai la pagina di accesso WebSSH:

Fornisci le tue normali credenziali SSH. Se hai seguito la guida alla configurazione iniziale del server di DigitalOcean, utilizzerai l'autenticazione basata su chiave anziché una password. Ciò significa che dovresti solo specificare il Nome host del server a cui ti stai connettendo, il tuo Nome utente per il server e la tua chiave SSH, che dovrebbe trovarsi nella Cartella .ssh/ all'interno della tua home directory locale (solitamente denominata id_rsa).

Nota: come si può intuire dalla necessità di specificare manualmente un nome host, WebSSH può essere utilizzato anche per connettersi a server diversi da quello su cui è in esecuzione. Per questo tutorial, viene eseguito sullo stesso server a cui ti stai connettendo.

Fai clic sul pulsante Connetti e dovresti essere accolto con il messaggio di benvenuto del terminale predefinito:

A questo punto, puoi utilizzare il tuo terminale normalmente, esattamente come se ti fossi connesso tramite SSH. Più utenti possono anche connettersi simultaneamente tramite la stessa istanza WebSSH. Se stai eseguendo WebSSH su un computer locale esclusivamente allo scopo di eseguire lo streaming o l'acquisizione di video, questo potrebbe essere tutto ciò di cui hai bisogno. Puoi inserire Ctrl+C nel terminale da cui hai avviato WebSSH (non nel terminale WebSSH) per arrestare il server WebSSH al termine.

Se stai eseguendo su un server remoto, non vorrai utilizzare WebSSH in produzione dietro una connessione HTTP non protetta. Sebbene tu sia comunque protetto dal meccanismo di autenticazione del tuo servizio SSH, l'utilizzo di una connessione SSH su HTTP rappresenta un rischio significativo per la sicurezza e probabilmente consentirà ad altri di rubare le tue credenziali SSH. Nei passaggi successivi, proteggerai la tua istanza WebSSH in modo che non sia meno sicura di una normale connessione SSH.

Fase 3 – (Facoltativo) Protezione di WebSSH con un certificato SSL

Per completare questo passaggio, dovresti aver già ottenuto il tuo nome di dominio e i certificati SSL. Un modo per farlo è utilizzare LetsEncrypt in modalità autonoma.

Quando LetsEncrypt recupera i certificati, per impostazione predefinita, li memorizza in /etc/letsencrypt/live/tuo_dominio. Verifica di averli:

  1. sudo ls /etc/letsencrypt/live/your_domain
Output
README cert.pem chain.pem fullchain.pem privkey.pem

Per eseguire WebSSH con supporto HTTPS, dovrai fornire un percorso a un certificato e un percorso a una chiave. Questi sono fullchain.pem e privkey.pem. Per impostazione predefinita, WebSSH fornisce l'accesso HTTPS sulla porta 4433, quindi apri anche quella porta nel tuo firewall:

  1. sudo ufw allow 4433

Successivamente, dovrai consentire

Quindi, esegui WebSSH con i percorsi del tuo certificato e della tua chiave:

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

In un browser Web, vai a https://your_domain:4433 e dovresti vedere la stessa interfaccia del passaggio precedente, ora con il supporto HTTPS. Questa è ora una configurazione sufficiente per una configurazione di produzione sicura. Tuttavia, stai ancora eseguendo l'app wssh direttamente dal tuo terminale e stai accedendo ad essa nel browser da una porta insolita. Negli ultimi due passaggi di questo tutorial, rimuoverai entrambe queste limitazioni.

Passaggio 4: (facoltativo) eseguire WebSSH dietro un proxy inverso Nginx

Mettere un server Web come Nginx davanti ad altre applicazioni rivolte al Web può migliorare le prestazioni e rendere molto più semplice la protezione di un sito. Installerai Nginx e lo configurerai per le richieste di proxy inverso a WebSSH, il che significa che si occuperà di gestire le richieste dei tuoi utenti a WebSSH e viceversa.

Aggiorna l'elenco dei pacchetti, quindi installa Nginx usando apt:

  1. sudo apt update nginx
  2. sudo apt install nginx

Se stai utilizzando un firewall ufw, a questo punto dovresti apportare alcune modifiche alla configurazione del tuo firewall, per abilitare l'accesso alle porte HTTP/HTTPS predefinite, 80 e 443. ufw ha una configurazione standard chiamata \Nginx Full che fornisce l'accesso a entrambe queste porte:

  1. sudo ufw allow “Nginx Full”

Nginx ti consente di aggiungere configurazioni per sito a singoli file in una sottodirectory chiamata sites-available/. Utilizzando nano o il tuo editor di testo preferito, crea una nuova configurazione Nginx in /etc/nginx/sites-available/webssh:

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

Incolla quanto segue nel nuovo file di configurazione, assicurandoti di sostituire tuo_dominio con il tuo nome di dominio.

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

Puoi leggere questa configurazione come composta da tre \blocchi principali. Il primo blocco, che precede la riga location /, contiene una configurazione standard di Nginx per servire un sito Web sulla porta HTTP predefinita, 80 Il blocco location / contiene una configurazione per l'inoltro delle connessioni in entrata a WebSSH, eseguito internamente sulla porta 8888, preservando SSL. La configurazione alla fine del file, dopo la location / block, carica le tue coppie di chiavi SSL LetsEncrypt e reindirizza le connessioni HTTP a HTTPS.

Salva e chiudi il file. Se stai usando nano, premi Ctrl+X, quindi, quando richiesto, Y e poi Invio.

Successivamente, dovrai attivare questa nuova configurazione. La convenzione di Nginx è quella di creare collegamenti simbolici (come scorciatoie) dai file in sites-available/ a un'altra cartella chiamata sites-enabled/ mentre decidi di abilitarli o disabilitarli. Usando i percorsi completi per chiarezza, crea quel collegamento:

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

Per impostazione predefinita, Nginx include un altro file di configurazione in /etc/nginx/sites-available/default, collegato a /etc/nginx/sites-enabled/default, che serve anche la sua pagina indice predefinita. Ti consigliamo di disabilitare quella regola rimuovendola da /sites-enabled, perché è in conflitto con la tua nuova configurazione WebSSH:

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

Nota: la configurazione di Nginx in questo tutorial è progettata per servire una singola applicazione, WebSSH. È possibile espandere questa configurazione Nginx per servire più applicazioni sullo stesso server seguendo la documentazione Nginx.

Successivamente, esegui nginx -t per verificare la tua configurazione prima di riavviare Nginx:

  1. 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

Ora puoi riavviare il tuo servizio Nginx, quindi rifletterà la tua nuova configurazione:

  1. sudo systemctl restart nginx

Infine, puoi rimuovere le regole del firewall che hai creato in precedenza per accedere direttamente a WebSSH, poiché tutto il traffico verrà ora gestito da Nginx sulle porte HTTP/HTTPS standard:

  1. sudo ufw delete allow 8888
  2. sudo ufw delete allow 4433

Riavvia webssh dalla riga di comando:

  1. wssh

Questa volta non è necessario fornire il certificato e i percorsi chiave, poiché Nginx lo sta gestendo. Quindi vai a tuo_dominio in un browser web.

Si noti che WebSSH viene ora servito su HTTPS tramite Nginx senza la necessità di specificare una porta. A questo punto, hai automatizzato tutto tranne l'avvio di wssh stesso. Lo farai nel passaggio finale.

Passaggio 5: (facoltativo) Creazione di un servizio Systemd per WebSSH

La distribuzione di applicazioni lato server che non vengono eseguite automaticamente in background può inizialmente non essere intuitiva, poiché è necessario avviarle ogni volta direttamente dalla riga di comando. La soluzione a questo è impostare il proprio servizio in background.

Per fare ciò, creerai un file unit che può essere utilizzato dal sistema init del tuo server. In quasi tutte le distribuzioni Linux moderne, il sistema init si chiama Systemd e puoi interagire con esso usando il comando systemctl.

Se WebSSH è ancora in esecuzione nel tuo terminale, premi Ctrl+C per interromperlo. Poi, usando nano o il tuo editor di testo preferito, apri un nuovo file chiamato /etc/systemd/system/webssh.service:

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

Il tuo file unit richiede, come minimo, una sezione [Unit], una sezione [Service] e una sezione [Install]:

[Unit]
Description=WebSSH terminal interface
After=network.target

[Service]
User=www-data
Group=www-data
ExecStart=wssh

[Install]
WantedBy=multi-user.target

Questo file può essere suddiviso come segue:

  • La sezione [Unit] contiene una descrizione in chiaro del tuo nuovo servizio, così come un hook After che specifica quando deve essere eseguito all'avvio del sistema, in questo caso dopo il tuo le interfacce di rete del server sono state attivate.
  • La sezione [Service] specifica quale comando dovrebbe essere effettivamente eseguito, così come quale utente dovrebbe eseguirlo. In questo caso, www-data è l'utente Nginx predefinito su un server Ubuntu e wssh è il comando stesso.
  • La sezione [Install] contiene solo la riga WantedBy=multi-user.target, che funziona insieme alla riga Dopo nel [Unit] per garantire che il servizio venga avviato quando il server è pronto per accettare gli accessi degli utenti.

Salva e chiudi il file. Ora puoi avviare il tuo nuovo servizio WebSSH e abilitarne l'esecuzione automatica all'avvio:

  1. sudo systemctl start webssh
  2. sudo systemctl enable webssh

Usa systemctl status webssh per verificare che sia stato avviato correttamente. Dovresti ricevere un output simile a quando hai eseguito il comando per la prima volta in un terminale.

  1. 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)

Ora puoi ricaricare https://tuo_dominio nel tuo browser e dovresti ottenere nuovamente l'interfaccia WebSSH. D'ora in poi, WebSSH e Nginx si riavvieranno automaticamente con il tuo server e funzioneranno in background.

Conclusione

In questo tutorial, hai installato WebSSH, una soluzione portatile per fornire un'interfaccia a riga di comando in un browser Web. Hai migliorato la tua implementazione aggiungendo SSL, quindi aggiungendo un proxy inverso Nginx e infine creando un servizio di sistema per WebSSH. Questo è un buon modello per la distribuzione di piccole applicazioni Web lato server in generale e particolarmente importante per SSH, che si basa su coppie di chiavi per la sicurezza.

Successivamente, potresti voler conoscere altre opzioni di connessione per SSH.