Recherche de site Web

Comment se connecter à un terminal depuis votre navigateur en utilisant Python WebSSH


Introduction

Normalement, vous vous connectez à un serveur SSH en utilisant une application en ligne de commande dans un terminal, ou 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. C'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 classique de manière visuelle. Cela peut également être utile dans des contextes éducatifs lorsqu'on donne l'accès à des novices de la ligne de commande, car cela leur évite d'avoir à installer des logiciels sur leurs machines (surtout sous Windows, où les options par défaut comportent des limitations). Enfin, le WebSSH de Python en particulier est très portable et ne nécessite aucune dépendance autre que Python pour fonctionner. D'autres piles de terminaux basées sur le web peuvent être beaucoup plus compliquées et spécifiques à Linux.

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

Prérequis

  • 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 est installé avec pip, son gestionnaire de paquets. Vous pouvez installer Python et pip sur Ubuntu en suivant l'Étape 1 de ce tutoriel.

  • Optionnellement, 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 les certificats SSL de 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 - Installer WebSSH

Si vous avez déjà installé Python et pip, vous devriez pouvoir installer des paquets Python depuis PyPI, le dépôt de logiciels Python. WebSSH est conçu pour être installé et exécuté directement depuis la ligne de commande, donc vous n'aurez pas besoin de configurer un autre environnement virtuel comme expliqué dans le guide Comment installer Python 3 et configurer un environnement de programmation. Les environnements virtuels sont plus utiles lorsque vous travaillez sur vos propres projets, pas lorsque vous installez des outils pour l'ensemble du système.

Utilisez pip install pour installer le paquet WebSSH :

sudo pip3 install webssh
…
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'installation via sudo installera la commande wssh globalement. Vous pouvez vérifier cela en utilisant which wssh :

which wssh
/usr/local/bin/wssh

Vous avez maintenant installé WebSSH. À l'étape suivante, vous le lancerez et vous y connecterez. Cependant, vous devrez d'abord ajouter une règle de pare-feu. WebSSH fonctionne par défaut sur le port 8888. Si vous utilisez ufw comme pare-feu, allow ce port via ufw :

sudo ufw allow 8888

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

Étape 2 - Exécution et connexion à WebSSH

Si vous exécutez WebSSH sur une machine locale, vous pouvez lancer wssh seul sans arguments supplémentaires pour démarrer. Si vous exécutez WebSSH sur un serveur distant, vous devrez ajouter le paramètre --fbidhttp=False pour permettre les connexions à distance via HTTP ordinaire. Ceci n'est pas sécurisé si vous vous connectez via un réseau non protégé, mais cela 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 identifier. Accédez à votre_domaine:8888 dans un navigateur web (en utilisant localhost à la place de votre_domaine si vous exécutez localement). Vous verrez la page de connexion WebSSH :

Fournissez vos identifiants SSH habituels. Si vous avez suivi le guide de configuration initiale du serveur de Linux-Console.net, vous utiliserez une authentification par clé plutôt qu'un mot de passe. Cela signifie que vous ne devriez avoir besoin que de spécifier le Nom d'hôte du serveur auquel vous vous connectez, votre Nom d'utilisateur pour le serveur, et votre clé SSH, qui devrait se trouver dans le dossier .ssh/ de votre répertoire personnel local (généralement nommé id_rsa).

Remarque : Comme vous pouvez le deviner en devant spécifier manuellement un nom d'hôte, WebSSH peut également être utilisé pour se connecter à des serveurs autres que celui sur lequel il fonctionne. Pour ce tutoriel, 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 par défaut de votre terminal :

À 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 au même instance de WebSSH. Si vous exécutez WebSSH sur une machine locale uniquement dans le but de diffuser ou d'enregistrer des vidéos, cela peut être tout ce dont vous avez besoin. Vous pouvez entrer Ctrl+C dans le terminal à partir duquel vous avez lancé WebSSH (pas dans le terminal WebSSH) pour arrêter le serveur WebSSH une fois terminé.

Si vous utilisez 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, utiliser une connexion SSH via HTTP présente un risque de sécurité important, et permettra probablement à d'autres de voler vos identifiants 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 - (Optionnel) Sécuriser WebSSH avec un certificat SSL

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

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

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

Pour exécuter WebSSH avec le support HTTPS, vous devrez fournir un chemin vers un certificat et un chemin vers une clé. Il s'agit de fullchain.pem et privkey.pem. Par défaut, WebSSH offre un accès HTTPS sur le port 4433, donc 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, naviguez vers https://votre_domaine:4433, et vous devriez voir la même interface que lors de l'étape précédente, maintenant avec la prise en charge de HTTPS. Cela constitue maintenant une configuration suffisante pour une mise en production sécurisée. Cependant, vous exécutez toujours l'application wssh directement depuis votre terminal, et vous y accédez depuis le navigateur via un port non standard. Dans les deux dernières étapes de ce tutoriel, vous allez supprimer ces deux limitations.

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

Mettre un serveur web tel que Nginx devant d'autres applications accessibles sur le web peut améliorer les performances et rendre beaucoup plus simple la sécurisation d'un site. Vous installerez Nginx et le configurerez pour faire un proxy inverse des requêtes vers WebSSH, ce qui signifie qu'il se chargera de traiter les requêtes de vos utilisateurs vers WebSSH et inversement.

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

sudo apt update nginx

sudo apt install nginx

Si vous utilisez un pare-feu ufw, vous devriez apporter certaines 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 dispose d'une configuration standard appelée « Nginx Full » qui permet l'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/. En utilisant nano ou votre éditeur de texte préféré, créez une nouvelle configuration Nginx dans /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 par votre nom de domaine.

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 principaux « blocs ». Le premier bloc, situé avant la ligne location /, contient une configuration standard Nginx pour servir un site web sur le port HTTP par défaut, 80. Le bloc location / contient une configuration pour faire passer les connexions entrantes vers WebSSH, qui fonctionne en interne sur le port 8888, tout en conservant SSL. La configuration à la fin du fichier, après le bloc location /, charge vos paires de clés SSL LetsEncrypt et redirige les connexions HTTP vers HTTPS.

Enregistrez et fermez le fichier. Si vous utilisez nano, appuyez sur Ctrl+X, puis lorsqu'on vous le demande, Y et ensuite Entrée.

Ensuite, vous devrez activer cette nouvelle configuration. La convention de Nginx est de créer des liens symboliques (comme des raccourcis) à partir des fichiers dans sites-available/ vers un autre dossier appelé sites-enabled/ au fur et à mesure que vous décidez de les activer ou de les désactiver. En utilisant des 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 dans /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 retirant de /sites-enabled, car elle entre en conflit avec votre nouvelle configuration WebSSH :

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

Remarque : La configuration Nginx dans ce tutoriel 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
nginx: 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émarrez webssh en ligne de commande :

wssh

Vous n'avez pas besoin de fournir les chemins du certificat et de la clé cette fois, puisque Nginx s'en occupe. Ensuite, naviguez vers votre_domaine dans un navigateur web.

Remarquez que le WebSSH est maintenant servi via HTTPS grâce à Nginx sans avoir besoin de spécifier un port. À ce stade, vous avez automatisé tout sauf le lancement de wssh lui-même. Vous ferez cela à l'étape finale.

Étape 5 - (Optionnel) 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 devez les démarrer directement depuis la ligne de commande à chaque fois. La solution consiste à configurer votre propre service en arrière-plan.

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

Si WebSSH fonctionne toujours 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é nécessite, au minimum, une section [Unit], une section [Service] et une section [Install] :

[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 section [Unit] contient une description en texte clair de votre nouveau service, ainsi qu'un hook After 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 soient opérationnelles.

  • La section [Service] spécifie quelle commande doit réellement être 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 section [Install] contient uniquement la ligne WantedBy=multi-user.target, qui fonctionne avec la ligne After dans la section [Unit] pour s'assurer que le service est démarré lorsque le serveur est prêt à accepter les connexions des utilisateurs.

Enregistrez et fermez le fichier. Vous pouvez maintenant démarrer votre nouveau service WebSSH, et l’activer pour qu’il s’exécute automatiquement au démarrage :

sudo systemctl start webssh

sudo systemctl enable webssh

Utilisez systemctl status webssh pour vérifier qu'il a démarré avec succès. Vous devriez recevoir une sortie similaire à celle lorsque vous avez exécuté la commande pour la première fois dans un terminal.

sudo systemctl status webssh
● 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://votre_domaine dans votre navigateur, et vous devriez à nouveau obtenir l'interface WebSSH. Dorénavant, WebSSH et Nginx redémarreront automatiquement avec votre serveur et fonctionneront en arrière-plan.

Conclusion

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

Ensuite, vous pourriez vouloir en savoir plus sur d'autres options de connexion pour SSH.