Einführung
Üblicherweise wird ein Kommandozeilenprogramm in einem Terminal oder einer Terminalemulationssoftware mit integriertem SSH-Client verwendet, um eine Verbindung zu einem SSH-Server herzustellen. Einige Tools, wie beispielsweise WebSSH in Python, ermöglichen es, sich via SSH zu verbinden und ein Terminal direkt im Webbrowser auszuführen.
Diese Funktion ist in vielen Situationen nützlich. Besonders hilfreich ist sie bei Live-Präsentationen oder Demos, wo es schwierig ist, ein normales Terminalfenster verständlich zu teilen. Auch im Bildungsbereich ist sie nützlich, um Personen ohne Kommandozeilenkenntnisse Zugang zu ermöglichen, da keine Software auf ihren Rechnern installiert werden muss (insbesondere unter Windows, wo die Standardoptionen problematisch sein können). Zudem ist Python WebSSH besonders portabel und benötigt außer Python keine weiteren Abhängigkeiten. Andere webbasierte Terminal-Stacks können komplexer und Linux-spezifischer sein.
In diesem Tutorial richten Sie WebSSH ein und stellen über SSH in Ihrem Browser eine Verbindung her. Optional können Sie die Verbindung anschließend mit einem SSL-Zertifikat sichern und für den Produktiveinsatz hinter einem Nginx-Reverse-Proxy platzieren.
Voraussetzungen
- Eine Windows-, Mac- oder Linux-Umgebung mit einem laufenden SSH-Dienst. Es ist sinnvoll, WebSSH lokal auszuführen; falls auf Ihrem lokalen Rechner kein SSH-Dienst verfügbar ist, können Sie einen entfernten Linux-Server verwenden.
- Die Programmiersprache Python wird mit pip, ihrem Paketmanager, installiert. Um Python und pip unter Ubuntu zu installieren, können Sie den ersten Teil dieses Tutorials konsultieren.
- Optional können Sie HTTPS im Browser aktivieren. Dazu benötigen Sie SSL-Zertifikate und Ihren Domainnamen. Diese erhalten Sie mit Certbot im Standalone-Modus.
Schritt 1 – WebSSH installieren
Wenn Python und pip installiert sind, können Sie Python-Pakete von PyPI (dem Python-Software-Repository) installieren. WebSSH ist so konzipiert, dass es direkt über die Kommandozeile installiert und ausgeführt werden kann. Daher ist es nicht notwendig, eine weitere virtuelle Umgebung wie die in [Name der Dokumentation/des Tools] einzurichten. Python 3 Installationsanleitung Wie bereits besprochen, nein. Virtuelle Umgebungen sind eher nützlich, wenn man an eigenen Projekten arbeitet, nicht aber, wenn man Systemtools installiert.
Um das WebSSH-Paket zu installieren, verwenden Sie folgenden Befehl:
sudo pip3 install websshDie Ausgabe sollte wie folgt aussehen:
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.0Die Verwendung von sudo installiert den wssh-Befehl global. Sie können mit dem Befehl which überprüfen, wo wssh installiert ist:
which wsshDie Ausgabe sollte in etwa so aussehen:
/usr/local/bin/wsshWebSSH ist nun installiert. Als Nächstes starten Sie es und stellen eine Verbindung her. Dazu müssen Sie jedoch zuerst eine Firewall-Regel hinzufügen. WebSSH läuft standardmäßig auf Port 8888. Wenn Sie ufw als Firewall verwenden, geben Sie diesen Port in ufw frei.
sudo ufw allow 8888
Schritt 2 – WebSSH ausführen und eine Verbindung herstellen
Wenn Sie WebSSH auf einem lokalen Rechner ausführen, können Sie den Befehl `wssh` ohne zusätzliche Argumente verwenden. Wenn Sie WebSSH auf einem Remote-Server ausführen, müssen Sie die Option `-s` verwenden. --fbidhttp=False Dient dazu, Remote-Verbindungen über HTTP zu ermöglichen. Diese Verbindung ist in einem ungesicherten Netzwerk nicht sicher, eignet sich aber für Demonstrationszwecke. WebSSH wird in den nächsten Schritten abgesichert.
wssh --fbidhttp=FalseSie können sich nun per WebSSH verbinden und anmelden. Unter der Adresse Ihre_Domain:8888 Öffnen Sie in Ihrem Webbrowser die Adresse (falls Sie das Programm lokal ausführen, von der entsprechenden Adresse aus). localhost:8888 Die WebSSH-Anmeldeseite sollte angezeigt werden.
Geben Sie Ihre üblichen SSH-Zugangsdaten ein. Wenn Sie der DigitalOcean-Server-Einrichtungsanleitung gefolgt sind, verwenden Sie die schlüsselbasierte Authentifizierung anstelle von Passwörtern. Sie müssen also nur den Server-Hostnamen, Ihren Benutzernamen und den SSH-Schlüssel angeben, der sich im entsprechenden Ordner befinden sollte. .ssh/ befindet sich in Ihrem Home-Verzeichnis (normalerweise benannt id_rsa Ist).
Hinweis: Wie Sie vielleicht schon an der manuellen Angabe des Hostnamens erkennen, kann WebSSH auch verwendet werden, um Verbindungen zu anderen Servern als dem, auf dem es ausgeführt wird, herzustellen. In diesem Tutorial wird es jedoch auf demselben Server ausgeführt, zu dem Sie sich verbinden.
Zum Verbinden klicken Sie auf die Schaltfläche. Verbinden Klicken Sie darauf, und Sie sollten den Standard-Begrüßungsbildschirm Ihres Terminals sehen.
Sie können Ihr Terminal nun wie gewohnt nutzen, als wären Sie per SSH verbunden. Mehrere Benutzer können sich auch gleichzeitig über eine WebSSH-Instanz verbinden. Dies kann erforderlich sein, wenn Sie WebSSH auf einem lokalen Rechner nur zum Streamen oder Aufzeichnen von Videos verwenden. Drücken Sie Strg+C im Terminal, in dem Sie WebSSH gestartet haben (nicht im WebSSH-Terminal), um den WebSSH-Server nach Beendigung der Verbindung zu stoppen.
Wenn Sie auf einem Remote-Server arbeiten, sollten Sie WebSSH nicht in der Produktion über eine unsichere HTTP-Verbindung einsetzen. Obwohl Sie durch den Authentifizierungsmechanismus des SSH-Dienstes geschützt sind, birgt die Verwendung einer SSH-Verbindung über HTTP ein erhebliches Sicherheitsrisiko und könnte es Dritten ermöglichen, Ihre SSH-Zugangsdaten zu stehlen. In den nächsten Schritten sichern Sie Ihre WebSSH-Instanz so ab, dass sie mindestens so sicher ist wie eine reguläre SSH-Verbindung.
Schritt 3 – (Optional) WebSSH mit einem SSL-Zertifikat absichern
Um diesen Schritt abzuschließen, müssen Sie Ihre Domain und SSL-Zertifikate bereits erhalten haben. Eine Möglichkeit besteht darin, Certbot im Standalone-Modus zu verwenden.
Nach Erhalt der Zertifikate überprüfen Sie bitte, ob sie sich im folgenden Pfad befinden:
sudo ls /etc/letsencrypt/live/your_domainUm WebSSH mit HTTPS-Unterstützung auszuführen, müssen Sie den Pfad zum Zertifikat und Schlüssel angeben:
sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem''Öffnen Sie in Ihrem Webbrowser die folgende Adresse: https://your_domain:4433 Fahren Sie fort, und Sie sollten dieselbe Benutzeroberfläche sehen wie im vorherigen Schritt, jetzt jedoch mit HTTPS-Unterstützung.
Schritt 4 – (Optional) WebSSH hinter einem Nginx-Reverse-Proxy ausführen
Durch den Einsatz eines Webservers wie Nginx vor Ihren Webanwendungen können Sie die Performance verbessern und die Sicherheit Ihrer Website vereinfachen. Sie installieren Nginx und konfigurieren ihn so, dass er Anfragen per Reverse-Proxy an WebSSH weiterleitet.
Aktualisieren Sie zuerst Ihre Paketliste, dann installieren Sie Nginx:
sudo apt update nginx
sudo apt install nginxWenn Sie die ufw-Firewall verwenden, müssen Sie deren Konfiguration ändern, um den Zugriff auf die standardmäßigen HTTP/HTTPS-Ports (Ports 80 und 443) zu ermöglichen:
sudo ufw allow “Nginx Full”Kopieren Sie anschließend die Nginx-Konfigurationsdatei in den Pfad /etc/nginx/sites-available/webssh Erstellen:
sudo nano /etc/nginx/sites-available/websshGeben Sie die Konfiguration in etwa wie folgt ein:
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;
}
}Diese Konfiguration lässt sich in drei Hauptblöcke unterteilen. Der erste Block, vor der Zeile `location/`, enthält die Nginx-Konfiguration für die Bereitstellung einer Website auf dem Standard-HTTP-Port 80. Der Block `location/` enthält die Konfiguration für die Weiterleitung eingehender Verbindungen an WebSSH, das intern auf Port 8888 läuft, wobei SSL erhalten bleibt. Die Konfiguration am Ende der Datei, nach dem Block `location/`, lädt Ihre Let's Encrypt SSL-Schlüsselpaare und leitet HTTP-Verbindungen auf HTTPS um.
Speichern und schließen Sie die Datei. Wenn Sie nano verwenden, drücken Sie Strg+X, dann Y und anschließend die Eingabetaste, wenn Sie dazu aufgefordert werden.
Als Nächstes müssen Sie diese neue Konfiguration aktivieren. Nginx erstellt standardmäßig symbolische Links (ähnlich Verknüpfungen) von Dateien im Verzeichnis `sites/` zu einem anderen Ordner namens `sites-enabled/`, wenn Sie diese aktivieren oder deaktivieren. Erstellen Sie diesen Link und verwenden Sie zur besseren Übersicht die vollständigen Pfade:
sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/websshStandardmäßig enthält Nginx eine weitere Konfigurationsdatei in /etc/nginx/sites-available/default, die mit /etc/nginx/sites-enabled/default verknüpft ist und 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 für die Ausführung einer einzelnen Anwendung (WebSSH) ausgelegt. Sie können diese Konfiguration erweitern, um mehrere Anwendungen auf einem Server auszuführen, indem Sie der Nginx-Dokumentation folgen.
Testen Sie anschließend die Nginx-Konfiguration:
sudo nginx -tOutput
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulUnd starten Sie den Nginx-Dienst neu:
sudo systemctl restart nginxSchließlich können Sie die zuvor für den direkten WebSSH-Zugriff erstellten Firewall-Regeln entfernen, da der gesamte Datenverkehr nun von Nginx über die Standard-HTTP/HTTPS-Ports abgewickelt wird:
sudo ufw delete allow 8888
sudo ufw delete allow 4433Dieses Mal müssen Sie die Pfade für Zertifikat und Schlüssel nicht angeben, da Nginx dies übernimmt. Rufen Sie anschließend Ihre Domain in einem Webbrowser auf.
Beachten Sie, dass WebSSH nun über HTTPS via Nginx bereitgestellt wird, ohne dass ein Port angegeben werden muss. Sie haben nun alles automatisiert, außer der eigentlichen WebSSH-Einrichtung. Diese erfolgt im letzten Schritt.
Schritt 5 – (Optional) Erstellen Sie einen Systemd-Dienst für WebSSH
Das Bereitstellen serverseitiger Anwendungen, die nicht automatisch im Hintergrund ausgeführt werden, kann anfangs unpraktisch sein, da sie jedes Mal direkt über die Kommandozeile gestartet werden müssen. Die Lösung besteht darin, einen eigenen Hintergrunddienst zu starten.
Dazu erstellen Sie eine einzelne Datei, die vom Init-System Ihres Servers verwendet werden kann. In fast allen modernen Linux-Distributionen heißt das Init-System Systemd, und Sie können mit dem Befehl systemctl darauf zugreifen.
Falls WebSSH in Ihrem Terminal noch läuft, drücken Sie Strg+C, um es zu beenden. Öffnen Sie anschließend mit nano oder Ihrem bevorzugten Texteditor eine neue Datei namens /etc/systemd/system/webssh.service:
sudo nano /etc/systemd/system/webssh.service
Ihre Unit-Datei 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.targetDiese Datei kann wie folgt unterteilt werden:
- Der Abschnitt [Unit] enthält eine einfache Textbeschreibung Ihres neuen Dienstes sowie einen After-Hook, der angibt, wann er beim Systemstart ausgeführt werden soll, in diesem Fall nachdem die Netzwerkschnittstellen Ihres Servers aktiv sind.
- Der Abschnitt [Service] legt fest, welcher Befehl ausgeführt werden soll und von welchem Benutzer. In diesem Fall ist www-data der Standardbenutzer von Nginx auf dem Ubuntu-Server, und wssh ist der Befehl selbst.
- Der Abschnitt [install] enthält lediglich die Zeile WantedBy=multi-user.target, die in Verbindung mit der Zeile After im Abschnitt [unit] dafür sorgt, dass der Dienst startet, wenn der Server bereit ist, Benutzeranmeldungen entgegenzunehmen.
Nach dem Speichern der Datei starten Sie den Dienst und aktivieren Sie ihn so, dass er beim Systemstart ausgeführt wird:
sudo systemctl start webssh
sudo systemctl enable websshVerwenden Sie `systemctl status webssh`, um zu überprüfen, ob der Dienst erfolgreich gestartet wurde. Sie sollten dieselbe Ausgabe erhalten wie beim ersten Ausführen des Befehls im 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)Sie können nun https://your_domain in Ihrem Browser neu laden und sollten die WebSSH-Oberfläche wieder sehen. WebSSH und Nginx werden ab sofort automatisch mit Ihrem Server neu gestartet und im Hintergrund ausgeführt.
Ergebnis
In diesem Tutorial haben Sie WebSSH installiert und eine portable Lösung für die Nutzung der Kommandozeile im Webbrowser bereitgestellt. Anschließend haben Sie die Bereitstellung durch SSL, einen Nginx-Reverse-Proxy und einen systemd-Dienst erweitert. Dieses Modell eignet sich hervorragend für die Bereitstellung kleiner serverseitiger Anwendungen, insbesondere im Hinblick auf die SSH-Sicherheit, die Schlüsselpaare zur Authentifizierung verwendet.











