SSH Web Gateway mit dem OpenSource Tool shellinabox
Der eigentlich für den direkten Konsolenzugriff über Web gedachte Dienst shellinabox lässt sich hervorragend dazu verwenden ein Gateway für SSH-Verbindungen herzustellen. Dies ist vor allem, dann interessant wenn des Öfteren Maschinen aus Netzen die keine Verbindungen zu Port 22 oder manuell definierten Ports über 1024 zulassen, gewartet werden müssen.
Aus Sicherheitsgründen sollten Sie so einen Dienst nur auf einer eigenen Maschine (z.B. virtuell) einrichten, für das zugrunde liegende System eigene sonst nicht verwendete Passwörter definieren und den shellinabox-Daemon nur mit eingeschränkten Rechten starten.
Der Service lässt sich unter https://tools.bartlweb.net/webssh ausprobieren.
Die HTML-Implementierung funktioniert in allen modernen Browsern und lässt sich via Apache mod_proxy ins Netz bringen. Die Eingabe von Sonderzeichen macht allerdings in Firefox Probleme, daher empfehle ich die Nutzung unter Chrome. Wer dennoch auf Firefox angewiesen ist kann zumindest mathematische Symbole anstelle der normalen Tasten über das Nummernpad eingeben.
Installation
Richten Sie eine eigene Linux-Installation für den Service ein. Dann laden Sie sich die aktuelle Version (Clone des Master-Branch) von shellinabox unter github.com/shellinabox/shellinabox herunter. Entpacken Sie den Inhalt des Archivs und kompilieren bzw. installieren Sie das Tool mit den im Verzeichnis des Quellcodes ausgeführten Befehlen ./configure, make und make install.
Autostart und Startparameter
Um shellinabox mit der gewünschten Konfiguration zu starten benötigen wir ein Wrapper-Skript die wir z.B. in das Home-Verzeichnis (hier /home/webssh/start_shellinabox.sh) unseres Benutzers, unter dem wir shellinabox ausführen wollen (hier webssh), legen. Darin rufen wir das Tool shellinabox auf und konfigurieren es wie folgt:
- --background: Im Hintergrund als Dienst starten.
- --service: Wir bieten unserer nachfolgendes Shelllskript als Service an. Dabei wird der Service nach dem folgenden Schema definiert /:<username>:<group>:HOME:'<script>'
- <username> / <group>: Username und Gruppe des Nutzers, mit dessen Rechte das angegebene Skript ausgeführt wird.
- HOME: Definiert das Home-Verzeichnis des angegebenen Benutzers als zu verwendendes Arbeitsverzeichnis.
- <script>: Pfad zum Skript, dessen Ausgabe bei Aufruf des Dienstes über die Weboberfläche angezeigt wird.
Daraus ergibt sich der folgende Inhalt für unser Wrapper-Skript:
#!/bin/sh
/usr/local/bin/shellinaboxd --background --service=/:webssh:webssh:HOME:'/home/webssh/shellinabox_sshwrapper.sh'
shellinabox liefert nach dem Start über Port 4200 via HTTP seine Weboberfläche aus. Der Port lässt sich mittels Parameter --port anpassen.
Damit der shellinabox-Daemon nun bei jedem Start ausgeführt wird, rufen wir das angelegte Skript über die Crontab-Datei des Nutzers webssh auf.
@reboot /home/webssh/start_shellinabox.sh >> /dev/null 2>&1
Weitere Informationen und Parameter lassen sich über shellinaboxd --help oder in der Projektdokumentation herausfinden: github.com/shellinabox/shellinabox/wiki/Shell-In-A-Box-manual
SSH-Service Shellskript
Die Ausgabe des folgenden Shellskripts wird dem Nutzer bei Aufruf der Weboberfläche angezeigt. Hier fragen wir nach den Parametern des Remotehosts (Hostadresse, Hostport und Benutzername), fangen Anfragen an interne IPs ab und starten die eigentliche SSH-Verbindung. Um SSH-Verbindungen nicht aufgrund von wechselnden Hostkeys zu blockieren, akzeptieren wir unbekannte Hosts automatisch und verwerfen diese durch Speichern in /dev/null.
Kopieren Sie den nachfolgenden Code in die Datei /home/webssh/shellinabox_sshwrapper.sh.
#!/bin/bash # # get host # read -p "SSH remote host (hostname or ip address): " host; if [ -z "$host" ]; then echo "" echo "" echo "A hostname or ip address of the remote host is required." echo "" echo "" exit fi if [[ "$host" == "localhost" ]] || [[ "$host" = "0" ]] || [[ "$host" = "::" ]] || [[ "$host" = "::1" ]] || [[ "$host" = "127.0.0."* ]] || [[ "$host" = "0.0.0.0" ]] || [[ "$host" = "10."* ]] || [[ "$host" = "192.168."* ]]; then echo "" echo "" echo "Connections to internal network devices are not supported." echo "" echo "" exit fi # # get port # read -p "SSH remote port [22]: " port; if [ -z "$port" ]; then port=22; fi if [[ -n ${port//[0-9]/} ]]; then echo "" echo "" echo "Port must be a number between 0 and 65535." echo "" echo "" exit fi # # get username # read -p "SSH remote username: " username; if [ -z "$username" ]; then echo "" echo "" echo "A username of the remote host is required." echo "" echo "" exit fi # # execute ssh command # echo "" echo "" exec ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o "LogLevel ERROR" -p $port $username@$host;
Moin,
funzt alles prima. Eine Anmerkung: In die Liste de lokalen Adressen im wrapper muss auch 0.0.0.0 hinzugefügt werden, ansonsten kann es passieren dass man doch lokal rauskommt.
Gruß
-- hgb