Wie man sich über den Browser mit einem Terminal verbindet, indem man Python WebSSH verwendet
Einführung
Normalerweise verbinden Sie sich über eine Kommandozeilenanwendung in einem Terminal oder einer Terminalemulator-Software, die einen SSH-Client enthält, mit einem SSH-Server. Einige Tools, wie Python's WebSSH, ermöglichen es, sich über SSH zu verbinden und ein Terminal direkt in Ihrem Webbrowser auszuführen.
Dies kann in einer Reihe von Situationen nützlich sein. Es ist besonders hilfreich für Live-Präsentationen oder Demos, wenn es schwierig wäre, ein normales Terminalfenster auf eine visuell sinnvolle Art und Weise zu teilen. Es kann auch in Bildungseinrichtungen nützlich sein, wenn man Anfängern im Umgang mit der Befehlszeile Zugang gewährt, da sie dadurch nicht gezwungen sind, Software auf ihren Maschinen zu installieren (insbesondere unter Windows, wo die Standardoptionen mit Einschränkungen verbunden sind). Schließlich ist Python's WebSSH insbesondere sehr portabel und erfordert keine Abhängigkeiten außer Python, um es zum Laufen zu bringen. Andere webbasierte Terminalstacks können viel komplizierter und spezifisch für Linux sein.
In diesem Tutorial richten Sie WebSSH ein und verbinden sich über SSH in Ihrem Browser. Sie können es dann optional mit einem SSL-Zertifikat sichern und hinter einem Nginx-Reverse-Proxy für eine Produktionsbereitstellung betreiben.
Voraussetzungen
Eine Windows-, Mac- oder Linux-Umgebung mit einem laufenden SSH-Dienst. Es kann nützlich sein, WebSSH lokal auszuführen, aber wenn Sie keinen laufenden SSH-Dienst auf einem lokalen Rechner haben, können Sie einen Remote-Linux-Server verwenden, indem Sie unser Anleitung zur ersten Servereinrichtung für Ubuntu 22.04 folgen.
-
Die Programmiersprache Python wird zusammen mit
pip, ihrem Paketmanager, installiert. Sie können Python undpipauf Ubuntu installieren, indem Sie Schritt 1 dieses Tutorials folgen. Optional können Sie HTTPS im Browser aktivieren, indem Sie SSL-Zertifikate und Ihren eigenen Domainnamen benötigen. Sie können diese erhalten, indem Sie die Anleitung 'Wie man Certbot im Standalone-Modus verwendet, um Let’s Encrypt SSL-Zertifikate abzurufen' befolgen. Wenn Sie keinen eigenen Domainnamen haben, können Sie für die ersten beiden Schritte dieses Tutorials eine IP-Adresse verwenden.
Schritt 1 – WebSSH installieren
Wenn Sie bereits Python und pip installiert haben, sollten Sie in der Lage sein, Python-Pakete aus PyPI, dem Python-Software-Repository, zu installieren. WebSSH ist so konzipiert, dass es direkt über die Kommandozeile installiert und ausgeführt wird, sodass Sie keine weitere virtuelle Umgebung einrichten müssen, wie im Abschnitt "So installieren Sie Python 3 und richten eine Programmierumgebung ein" besprochen. Virtuelle Umgebungen sind nützlicher, wenn Sie an Ihren eigenen Projekten arbeiten, nicht beim Installieren systemweiter Tools.
Verwenden Sie pip install, um das WebSSH-Paket zu installieren:
- 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
Die Installation über sudo wird den Befehl wssh global installieren. Sie können dies überprüfen, indem Sie which wssh verwenden:
- which wssh
/usr/local/bin/wssh
Sie haben jetzt WebSSH installiert. Im nächsten Schritt werden Sie es ausführen und sich damit verbinden. Zunächst müssen Sie jedoch eine Firewall-Regel hinzufügen. WebSSH läuft standardmäßig auf Port 8888. Wenn Sie ufw als Firewall verwenden, erlauben Sie diesen Port durch ufw:
- sudo ufw allow 8888
Sie werden diese Firewall-Regel später in diesem Tutorial wieder besuchen.
Schritt 2 – Ausführen und Verbinden mit WebSSH
Wenn Sie WebSSH auf einem lokalen Rechner ausführen, können Sie wssh alleine ohne zusätzliche Argumente starten. Wenn Sie WebSSH auf einem Remote-Server ausführen, müssen Sie das --fbidhttp=False Flag hinzufügen, um entfernte Verbindungen über reguläres HTTP zuzulassen. Dies ist nicht sicher, wenn Sie über ein ungeschütztes Netzwerk verbinden, aber es ist nützlich für eine Demo, und Sie werden WebSSH später in diesem Tutorial sichern.
- wssh --fbidhttp=False
Jetzt können Sie sich mit WebSSH verbinden und anmelden. Navigieren Sie zu deine_domain:8888 in einem Webbrowser (verwenden Sie localhost anstelle von deine_domain, wenn Sie lokal arbeiten). Sie werden die WebSSH-Anmeldeseite sehen:
Geben Sie Ihre regulären SSH-Anmeldeinformationen an. Wenn Sie dem ursprünglichen Servereinrichtungsleitfaden von DigitalOcean gefolgt sind, verwenden Sie die schlüsselbasierte Authentifizierung anstelle eines Passworts. Das bedeutet, dass Sie nur den Hostname des Servers, mit dem Sie sich verbinden, Ihren Benutzernamen für den Server und Ihren SSH-Schlüssel angeben müssen, der sich im .ssh/-Ordner Ihres lokalen Home-Verzeichnisses (gewöhnlich benannt id_rsa) befinden sollte.
Hinweis: Wie Sie vielleicht erraten können, da Sie einen Hostnamen manuell angeben müssen, kann WebSSH auch verwendet werden, um sich mit anderen Servern zu verbinden als dem, auf dem es läuft. In diesem Tutorial wird es auf demselben Server ausgeführt, mit dem Sie sich verbinden.
Klicken Sie auf die Verbinden-Schaltfläche, und Sie sollten mit Ihrem standardmäßigen Terminal-Begrüßungshinweis empfangen werden:
An diesem Punkt können Sie Ihr Terminal wie gewohnt verwenden, genau so, als ob Sie über SSH verbunden wären. Mehrere Benutzer können gleichzeitig über dasselbe WebSSH-Exemplar verbunden sein. Wenn Sie WebSSH auf einem lokalen Gerät ausschließlich zum Streamen oder Aufnehmen von Videos ausführen, könnte dies alles sein, was Sie benötigen. Sie können Strg+C im Terminal eingeben, von dem Sie WebSSH gestartet haben (nicht im WebSSH-Terminal), um den WebSSH-Server nach Beendigung zu stoppen.
Wenn Sie auf einem Remote-Server arbeiten, möchten Sie WebSSH in der Produktion nicht hinter einer unsicheren HTTP-Verbindung verwenden. Obwohl Sie weiterhin durch den Authentifizierungsmechanismus Ihres SSH-Dienstes geschützt sind, birgt die Verwendung einer SSH-Verbindung über HTTP ein erhebliches Sicherheitsrisiko und wird wahrscheinlich anderen ermöglichen, Ihre SSH-Anmeldeinformationen zu stehlen. In den nächsten Schritten werden Sie Ihre WebSSH-Instanz sichern, sodass sie nicht weniger sicher ist als eine reguläre SSH-Verbindung.
Schritt 3 – (Optional) WebSSH mit einem SSL-Zertifikat sichern
Um diesen Schritt abzuschließen, sollten Sie bereits Ihren eigenen Domainnamen und SSL-Zertifikate erhalten haben. Eine Möglichkeit, dies zu tun, besteht darin, LetsEncrypt im Standalone-Modus zu verwenden.
Wenn LetsEncrypt Zertifikate abruft, speichert es sie standardmäßig in /etc/letsencrypt/live/deine_domain. Überprüfe, ob du sie hast:
- sudo ls /etc/letsencrypt/live/your_domain
README cert.pem chain.pem fullchain.pem privkey.pem
Um WebSSH mit HTTPS-Unterstützung auszuführen, müssen Sie einen Pfad zu einem Zertifikat und einen Pfad zu einem Schlüssel angeben. Diese sind fullchain.pem und privkey.pem. Standardmäßig bietet WebSSH HTTPS-Zugriff auf Port 4433, also öffnen Sie auch diesen Port in Ihrer Firewall:
- sudo ufw allow 4433
Als nächstes müssen Sie erlauben
Führen Sie dann WebSSH mit den Pfaden zu Ihrem Zertifikat und Ihrem Schlüssel aus:
- sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem'
Öffnen Sie in einem Webbrowser die Adresse https://your_domain:4433, und Sie sollten dieselbe Benutzeroberfläche wie im vorherigen Schritt sehen, jetzt mit HTTPS-Unterstützung. Dies ist nun eine ausreichende Einrichtung für eine sichere Produktionskonfiguration. Sie führen jedoch die wssh-App direkt von Ihrem Terminal aus und greifen über einen ungewöhnlichen Port darauf zu. In den letzten beiden Schritten dieses Tutorials werden Sie beide dieser Einschränkungen beseitigen.
Schritt 4 – (Optional) WebSSH hinter einem Nginx Reverse Proxy ausführen
Das Voranstellen eines Webservers wie Nginx vor anderen webgestützten Anwendungen kann die Leistung verbessern und es erheblich einfacher machen, eine Website zu sichern. Sie werden Nginx installieren und es so konfigurieren, dass es Anfragen an WebSSH reverse proxy bearbeitet, was bedeutet, dass es sich um die Bearbeitung der Anfragen Ihrer Benutzer an WebSSH und zurück kümmert.
Aktualisieren Sie Ihre Paketliste und installieren Sie dann Nginx mit apt:
- sudo apt update nginx
- sudo apt install nginx
Wenn Sie eine ufw-Firewall verwenden, sollten Sie an diesem Punkt einige Änderungen an Ihrer Firewall-Konfiguration vornehmen, um den Zugriff auf die Standard-HTTP/HTTPS-Ports 80 und 443 zu ermöglichen. ufw hat eine Standardkonfiguration namens „Nginx Full“, die den Zugriff auf beide dieser Ports ermöglicht:
- sudo ufw allow “Nginx Full”
Nginx ermöglicht es Ihnen, spezifische Konfigurationen für jede Seite in einzelnen Dateien in einem Unterverzeichnis namens sites-available/ hinzuzufügen. Verwenden Sie nano oder Ihren bevorzugten Texteditor, um eine neue Nginx-Konfiguration unter /etc/nginx/sites-available/webssh zu erstellen:
- sudo nano /etc/nginx/sites-available/webssh
Fügen Sie das Folgende in die neue Konfigurationsdatei ein und denken Sie daran, your_domain durch Ihren Domänennamen zu ersetzen.
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;
}
}
Sie können diese Konfiguration als bestehend aus drei Hauptblöcken betrachten. Der erste Block, der vor der Zeile location / kommt, enthält eine Standard-Nginx-Konfiguration zum Bereitstellen einer Website über den Standard-HTTP-Port 80. Der Block location / enthält eine Konfiguration zum Proxying eingehender Verbindungen zu WebSSH, das intern auf Port 8888 läuft, während SSL beibehalten wird. Die Konfiguration am Ende der Datei, nach dem Block location /, lädt Ihre LetsEncrypt-SSL-Schlüsselpaare und leitet HTTP-Verbindungen auf HTTPS um.
Speichern und schließen Sie die Datei. Wenn Sie nano verwenden, drücken Sie Ctrl+X, dann, wenn Sie dazu aufgefordert werden, Y und danach die Eingabetaste.
Als nächstes müssen Sie diese neue Konfiguration aktivieren. Nginx hat die Konvention, symbolische Links (wie Verknüpfungen) von Dateien in sites-available/ zu einem anderen Ordner namens sites-enabled/ zu erstellen, je nachdem, ob Sie sie aktivieren oder deaktivieren möchten. Verwenden Sie vollständige Pfade zur Klarheit, erstellen Sie diesen Link:
- sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh
Standardmäßig enthält Nginx eine weitere Konfigurationsdatei unter /etc/nginx/sites-available/default, die mit /etc/nginx/sites-enabled/default verknüpft ist und ebenfalls die Standard-Indexseite bereitstellt. Sie sollten diese Regel deaktivieren, indem Sie sie aus /sites-enabled entfernen, da sie mit Ihrer neuen WebSSH-Konfiguration in Konflikt steht:
- sudo rm /etc/nginx/sites-enabled/default
Hinweis: Die Nginx-Konfiguration in diesem Tutorial ist darauf ausgelegt, eine einzelne Anwendung, WebSSH, zu bedienen. Sie könnten diese Nginx-Konfiguration erweitern, um mehrere Anwendungen auf demselben Server zu bedienen, indem Sie die Nginx-Dokumentation befolgen.
Führen Sie als Nächstes nginx -t aus, um Ihre Konfiguration zu überprüfen, bevor Sie Nginx neu starten:
- sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Jetzt können Sie Ihren Nginx-Dienst neu starten, damit er Ihre neue Konfiguration widerspiegelt:
- sudo systemctl restart nginx
Schließlich können Sie die Firewall-Regeln entfernen, die Sie zuvor erstellt haben, um direkt auf WebSSH zuzugreifen, da der gesamte Datenverkehr jetzt über die standardmäßigen HTTP/HTTPS-Ports von Nginx abgewickelt wird:
- sudo ufw delete allow 8888
- sudo ufw delete allow 4433
Starte webssh in der Eingabeaufforderung neu:
- wssh
Du musst dieses Mal die Zertifikat- und Schlüsselpfade nicht angeben, da Nginx das übernimmt. Navigiere dann in einem Webbrowser zu deinem_domain.
Beachten Sie, dass WebSSH jetzt über HTTPS über Nginx bereitgestellt wird, ohne dass ein Port angegeben werden muss. An diesem Punkt haben Sie alles automatisiert, außer dem Start von wssh selbst. Das werden Sie im letzten Schritt tun.
Schritt 5 – (Optional) Erstellen eines Systemd-Dienstes für WebSSH
Das Bereitstellen von serverseitigen Anwendungen, die nicht automatisch im Hintergrund ausgeführt werden, kann zunächst unintuitiv sein, da Sie sie jedes Mal direkt über die Kommandozeile starten müssen. Die Lösung dafür ist, einen eigenen Hintergrunddienst einzurichten.
Um dies zu tun, erstellen Sie eine Einheitendatei, die von dem Init-System Ihres Servers verwendet werden kann. In fast allen modernen Linux-Distributionen wird das Init-System Systemd genannt, und Sie können damit interagieren, indem Sie den Befehl systemctl verwenden.
Wenn WebSSH noch in Ihrem Terminal läuft, drücken Sie Ctrl+C, um es zu stoppen. Öffnen Sie dann mit nano oder Ihrem bevorzugten Texteditor eine neue Datei mit dem Namen /etc/systemd/system/webssh.service:
- sudo nano /etc/systemd/system/webssh.service
Ihre Einheitsdatei benötigt mindestens einen [Unit]-Abschnitt, einen [Service]-Abschnitt und einen [Install]-Abschnitt:
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
Diese Datei kann wie folgt aufgeschlüsselt werden:
Der
[Unit]Abschnitt enthält eine Klartextbeschreibung Ihres neuen Dienstes sowie einenAfterHook, der angibt, wann er beim Systemstart ausgeführt werden soll, in diesem Fall nachdem die Netzwerkinterfaces Ihres Servers eingerichtet wurden.Der
[Service]-Bereich gibt an, welches Kommando tatsächlich ausgeführt werden soll, sowie welcher Benutzer dies ausführen sollte. In diesem Fall istwww-datader standardmäßige Nginx-Benutzer auf einem Ubuntu-Server, undwsshist der Befehl selbst.Der
[Install]-Abschnitt enthält nur die ZeileWantedBy=multi-user.target, die zusammen mit derAfter-Zeile im[Unit]-Abschnitt dafür sorgt, dass der Dienst gestartet wird, wenn der Server bereit ist, Benutzeranmeldungen anzunehmen.
Speichern und schließen Sie die Datei. Sie können jetzt Ihren neuen WebSSH-Dienst starten und enablen, damit er beim Booten automatisch gestartet wird:
- sudo systemctl start webssh
- sudo systemctl enable webssh
Verwenden Sie systemctl status webssh, um zu überprüfen, ob es erfolgreich gestartet wurde. Sie sollten eine ähnliche Ausgabe erhalten wie bei der ersten Ausführung des Befehls in einem 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)
Sie können jetzt https://your_domain in Ihrem Browser neu laden, und Sie sollten erneut die WebSSH-Oberfläche erhalten. Von nun an werden WebSSH und Nginx automatisch mit Ihrem Server neu gestartet und im Hintergrund ausgeführt.
Schlussfolgerung
In diesem Tutorial haben Sie WebSSH installiert, eine tragbare Lösung, um eine Befehlszeilenoberfläche in einem Webbrowser bereitzustellen. Sie haben Ihr Deployment verbessert, indem Sie SSL hinzugefügt haben, dann einen Nginx-Reverse-Proxy hinzugefügt haben und schließlich einen Systemdienst für WebSSH erstellt haben. Dies ist ein gutes Modell für die Bereitstellung kleiner serverseitiger Webanwendungen im Allgemeinen und besonders wichtig für SSH, das auf Schlüsselpaare zur Sicherheit angewiesen ist.
Als Nächstes möchten Sie möglicherweise mehr über andere Verbindungsoptionen für SSH erfahren.


