SSH Web (webshell)

来源:互联网 发布:javascript 策略模式 编辑:程序博客网 时间:2024/06/18 16:59

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/websshausprobieren.

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 von shellinabox unter http://code.google.com/p/shellinabox/ herunter. Entpacken Sie den Inhalt des Archivs und kompilieren bzw. installieren Sie das Tool mit den im Verzeichnis des Quellcodes ausgeführten Befehlen ./configuremake undmake 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'

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

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" = "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 -p $port $username@$host;


0 0