Comment se connecter à un terminal depuis votre navigateur à l'aide de Python WebSSH

De Get Docs
Aller à :navigation, rechercher

Introduction

Habituellement, vous vous connectez à un serveur SSH à l'aide d'une application de ligne de commande dans un terminal ou d'un logiciel d'émulation de terminal qui inclut un client SSH. Certains outils, comme WebSSH de Python, permettent de se connecter via SSH et d'exécuter un terminal directement dans votre navigateur Web.

Cela peut être utile dans un certain nombre de situations. Il est particulièrement utile pour donner des présentations ou des démonstrations en direct, lorsqu'il serait difficile de partager une fenêtre de terminal régulière d'une manière visuellement logique. Cela peut également être utile dans les environnements éducatifs lors de l'octroi de l'accès aux novices en ligne de commande, car cela leur évite d'avoir à installer un logiciel sur leurs machines (en particulier sous Windows, où les options par défaut sont accompagnées de mises en garde). Enfin, WebSSH de Python en particulier est très portable et ne nécessite aucune dépendance autre que Python pour être opérationnel. D'autres piles de terminaux Web peuvent être beaucoup plus compliquées et spécifiques à Linux.

Dans ce didacticiel, vous allez configurer WebSSH et vous connecter via SSH dans votre navigateur. Vous pourrez ensuite éventuellement le sécuriser avec un certificat SSL et l'exécuter derrière un proxy inverse Nginx pour un déploiement en production.

Conditions préalables

  • Un environnement Windows, Mac ou Linux avec un service SSH en cours d'exécution. Il peut être utile d'exécuter WebSSH localement, mais si vous n'avez pas de service SSH en cours d'exécution sur une machine locale, vous pouvez utiliser un serveur Linux distant en suivant notre guide de configuration initiale du serveur pour Ubuntu 22.04.
  • Le langage de programmation Python installé avec pip, son gestionnaire de paquets. Vous pouvez installer Python et pip sur Ubuntu en suivant l'étape 1 de ce tutoriel.
  • En option, pour activer HTTPS dans le navigateur, vous aurez besoin de certificats SSL et de votre propre nom de domaine. Vous pouvez les obtenir en suivant Comment utiliser le mode autonome de Certbot pour récupérer des certificats SSL Let's Encrypt. Si vous n'avez pas votre propre nom de domaine, vous pouvez utiliser une adresse IP pour les deux premières étapes de ce tutoriel.

Étape 1 - Installation de WebSSH

Si vous avez déjà installé Python et pip, vous devriez pouvoir installer les packages Python à partir de PyPI, le référentiel de logiciels Python. WebSSH est conçu pour être installé et exécuté directement à partir de la ligne de commande, vous n'aurez donc pas besoin de configurer un autre environnement virtuel comme indiqué dans Comment installer Python 3 et configurer un environnement de programmation. Les environnements virtuels sont plus utiles lorsque vous travaillez sur vos propres projets, et non lors de l'installation d'outils à l'échelle du système.

Utilisation pip install pour installer le package 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

Installation via sudo installera le wssh commande à l'échelle mondiale. Vous pouvez le vérifier en utilisant which wssh:

which wssh
Output/usr/local/bin/wssh

Vous avez maintenant installé WebSSH. À l'étape suivante, vous allez l'exécuter et vous y connecter. Cependant, vous devez d'abord ajouter une règle de pare-feu. WebSSH s'exécute sur le port 8888 par défaut. Si vous utilisez ufw comme pare-feu, allow ce port à travers ufw:

sudo ufw allow 8888

Vous reviendrez sur cette règle de pare-feu plus tard dans ce didacticiel.

Étape 2 - Exécution et connexion à WebSSH

Si vous exécutez WebSSH sur une machine locale, vous pouvez exécuter wssh par lui-même sans arguments supplémentaires pour commencer. Si vous exécutez WebSSH sur un serveur distant, vous devrez ajouter le --fbidhttp=False flag pour autoriser les connexions à distance via HTTP standard. Ce n'est pas sécurisé si vous vous connectez sur un réseau non protégé, mais c'est utile pour une démonstration, et vous sécuriserez WebSSH plus tard dans ce tutoriel.

wssh --fbidhttp=False

Vous pouvez maintenant vous connecter à WebSSH et vous connecter. Aller vers your_domain:8888 dans un navigateur Web (à l'aide localhost à la place de votre_domaine si vous exécutez localement). Vous verrez la page de connexion WebSSH :

Fournissez vos informations d'identification SSH habituelles. Si vous avez suivi le guide de configuration initiale du serveur de DigitalOcean, vous utiliserez une authentification basée sur une clé plutôt qu'un mot de passe. Cela signifie que vous n'avez qu'à spécifier le Hostname du serveur auquel vous vous connectez, votre Username pour le serveur, et votre clé SSH, qui doit se trouver dans le .ssh/ dossier dans votre répertoire personnel local (généralement nommé id_rsa).

Remarque : Comme vous pouvez le deviner en spécifiant manuellement un nom d'hôte, WebSSH peut également être utilisé pour se connecter à des serveurs autres que celui sur lequel il s'exécute. Pour ce didacticiel, il est exécuté sur le même serveur auquel vous vous connectez.


Cliquez sur le bouton Connecter et vous devriez être accueilli par l'invite de bienvenue de votre terminal par défaut :

À ce stade, vous pouvez utiliser votre terminal normalement, exactement comme si vous vous étiez connecté via SSH. Plusieurs utilisateurs peuvent également se connecter simultanément via la même instance WebSSH. Si vous exécutez WebSSH sur une machine locale uniquement dans le but de diffuser ou de capturer des vidéos, c'est peut-être tout ce dont vous avez besoin. Vous pouvez entrer Ctrl+C dans le terminal à partir duquel vous avez lancé WebSSH (pas le terminal WebSSH) pour arrêter le serveur WebSSH lorsque vous avez terminé.

Si vous exécutez sur un serveur distant, vous ne voudrez pas utiliser WebSSH en production derrière une connexion HTTP non sécurisée. Bien que vous soyez toujours protégé par le mécanisme d'authentification de votre service SSH, l'utilisation d'une connexion SSH sur HTTP pose un risque de sécurité important et permettra probablement à d'autres de voler vos informations d'identification SSH. Dans les étapes suivantes, vous sécuriserez votre instance WebSSH afin qu'elle ne soit pas moins sûre qu'une connexion SSH normale.

Étape 3 - (Facultatif) Sécuriser WebSSH avec un certificat SSL

Pour terminer cette étape, vous devez déjà avoir obtenu votre propre nom de domaine et vos propres certificats SSL. Une façon de le faire est d'utiliser LetsEncrypt en mode autonome.

Lorsque LetsEncrypt récupère les certificats, par défaut, il les stocke dans /etc/letsencrypt/live/your_domain. Vérifiez que vous les avez :

sudo ls /etc/letsencrypt/live/your_domain
OutputREADME  cert.pem  chain.pem  fullchain.pem  privkey.pem

Pour exécuter WebSSH avec la prise en charge HTTPS, vous devez fournir un chemin vers un certificat et un chemin vers une clé. Ceux-ci sont fullchain.pem et privkey.pem. Par défaut, WebSSH fournit un accès HTTPS sur le port 4433, alors ouvrez également ce port dans votre pare-feu :

sudo ufw allow 4433

Ensuite, vous devrez autoriser

Ensuite, exécutez WebSSH avec les chemins vers votre certificat et votre clé :

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

Dans un navigateur Web, accédez à https://your_domain:4433, et vous devriez voir la même interface qu'à l'étape précédente, maintenant avec la prise en charge HTTPS. C'est maintenant une configuration suffisante pour une configuration de production sûre. Cependant, vous exécutez toujours le wssh app directement depuis votre terminal, et vous y accédez dans le navigateur depuis un port inhabituel. Au cours des deux dernières étapes de ce didacticiel, vous supprimerez ces deux limitations.

Étape 4 - (Facultatif) Exécution de WebSSH derrière un proxy inverse Nginx

Placer un serveur Web tel que Nginx devant d'autres applications Web peut améliorer les performances et simplifier la sécurisation d'un site. Vous allez installer Nginx et le configurer pour les requêtes reverse proxy vers WebSSH, ce qui signifie qu'il se chargera de gérer les requêtes de vos utilisateurs vers WebSSH et inversement.

Actualisez votre liste de packages, puis installez Nginx en utilisant apt:

sudo apt update nginx
sudo apt install nginx

Si vous utilisez un ufw pare-feu, vous devez apporter quelques modifications à la configuration de votre pare-feu à ce stade, pour permettre l'accès aux ports HTTP/HTTPS par défaut, 80 et 443. ufw a une configuration de stock appelée "Nginx Full" qui donne accès à ces deux ports :

sudo ufw allow “Nginx Full”

Nginx vous permet d'ajouter des configurations par site à des fichiers individuels dans un sous-répertoire appelé sites-available/. Utilisant nano ou votre éditeur de texte préféré, créez une nouvelle configuration Nginx sur /etc/nginx/sites-available/webssh:

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

Collez ce qui suit dans le nouveau fichier de configuration, en veillant à remplacer your_domain avec votre nom de domaine.

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

Vous pouvez lire cette configuration comme ayant trois "blocs" principaux. Le premier bloc, venant avant le location / ligne, contient une configuration standard Nginx pour servir un site Web sur le port HTTP par défaut, 80. La location / Le bloc contient une configuration pour la transmission par proxy des connexions entrantes à WebSSH, s'exécutant sur le port 8888 en interne, tout en préservant SSL. La configuration à la fin du fichier, après le location / bloquer, charge vos paires de clés SSL LetsEncrypt et redirige les connexions HTTP vers HTTPS.

Enregistrez et fermez le fichier. Si vous utilisez nano, presse Ctrl+X, puis lorsque vous y êtes invité, Y puis Entrée.

Ensuite, vous devrez activer cette nouvelle configuration. La convention de Nginx est de créer des liens symboliques (comme des raccourcis) à partir de fichiers dans sites-available/ dans un autre dossier appelé sites-enabled/ que vous décidez de les activer ou de les désactiver. En utilisant les chemins complets pour plus de clarté, créez ce lien :

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

Par défaut, Nginx inclut un autre fichier de configuration à /etc/nginx/sites-available/default, lié à /etc/nginx/sites-enabled/default, qui sert également sa page d'index par défaut. Vous voudrez désactiver cette règle en la supprimant de /sites-enabled, car cela entre en conflit avec votre nouvelle configuration WebSSH :

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

Remarque : La configuration Nginx de ce didacticiel est conçue pour servir une seule application, WebSSH. Vous pouvez étendre cette configuration Nginx pour servir plusieurs applications sur le même serveur en suivant la Documentation Nginx.


Ensuite, exécutez nginx -t pour vérifier votre configuration avant de redémarrer Nginx :

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

Vous pouvez maintenant redémarrer votre service Nginx, afin qu'il reflète votre nouvelle configuration :

sudo systemctl restart nginx

Enfin, vous pouvez supprimer les règles de pare-feu que vous avez créées précédemment pour accéder directement à WebSSH, puisque tout le trafic sera désormais géré par Nginx via les ports HTTP/HTTPS standard :

sudo ufw delete allow 8888
sudo ufw delete allow 4433

Redémarrer webssh sur la ligne de commande :

wssh

Vous n'avez pas besoin de fournir le certificat et les chemins de clé cette fois, car Nginx s'en charge. Accédez ensuite à votre_domaine dans un navigateur Web.

Notez que WebSSH est maintenant servi sur HTTPS via Nginx sans qu'il soit nécessaire de spécifier un port. À ce stade, vous avez tout automatisé sauf le lancement wssh lui-même. Vous le ferez à l'étape finale.

Étape 5 - (Facultatif) Création d'un service Systemd pour WebSSH

Le déploiement d'applications côté serveur qui ne s'exécutent pas automatiquement en arrière-plan peut être peu intuitif au début, car vous devrez les démarrer directement à partir de la ligne de commande à chaque fois. La solution à cela est de configurer votre propre service d'arrière-plan.

Pour ce faire, vous allez créer un fichier d'unité pouvant être utilisé par le système d'initialisation de votre serveur. Sur presque toutes les distributions Linux modernes, le système d'initialisation s'appelle Systemd, et vous pouvez interagir avec lui en utilisant le systemctl commande.

Si WebSSH est toujours en cours d'exécution dans votre terminal, appuyez sur Ctrl+C pour l'arrêter. Ensuite, en utilisant nano ou votre éditeur de texte préféré, ouvrez un nouveau fichier appelé /etc/systemd/system/webssh.service:

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

Votre fichier d'unité a besoin, au minimum, d'un [Unit] rubrique, une [Service] section, et une [Install] section:

/etc/systemd/system/webssh.service

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

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

[Install]
WantedBy=multi-user.target

Ce fichier peut être décomposé comme suit :

  • La [Unit] section contient une description en clair de votre nouveau service, ainsi qu'un After crochet qui spécifie quand il doit être exécuté au démarrage du système, dans ce cas après que les interfaces réseau de votre serveur sont apparues.
  • La [Service] section spécifie quelle commande doit être réellement exécutée, ainsi que quel utilisateur doit l'exécuter. Dans ce cas, www-data est l'utilisateur Nginx par défaut sur un serveur Ubuntu, et wssh est la commande elle-même.
  • La [Install] section ne contient que la WantedBy=multi-user.target ligne, qui fonctionne avec le After ligne dans le [Unit] pour vous assurer que le service est démarré lorsque le serveur est prêt à accepter les connexions des utilisateurs.

Enregistrez et fermez le fichier. Tu peux maintenant start votre nouveau service WebSSH, et enable pour qu'il s'exécute automatiquement au démarrage :

sudo systemctl start webssh
sudo systemctl enable webssh

Utilisation systemctl status webssh pour vérifier qu'il a bien démarré. Vous devriez recevoir une sortie similaire à celle de la première exécution de la commande dans un 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)

Vous pouvez maintenant recharger https://your_domain dans votre navigateur, et vous devriez à nouveau obtenir l'interface WebSSH. Désormais, WebSSH et Nginx redémarreront automatiquement avec votre serveur et s'exécuteront en arrière-plan.

Conclusion

Dans ce tutoriel, vous avez installé WebSSH, une solution portable pour fournir une interface de ligne de commande dans un navigateur Web. Vous avez amélioré votre déploiement en ajoutant SSL, puis en ajoutant un reverse proxy Nginx, et enfin en créant un service système pour WebSSH. Il s'agit d'un bon modèle pour déployer de petites applications Web côté serveur en général, et particulièrement important pour SSH, qui s'appuie sur des paires de clés pour la sécurité.

Ensuite, vous voudrez peut-être en savoir plus sur les autres options de connexion pour SSH.