Web-Shell-Server
================


Wenn man von einem Firmen-Netzwerk auf seinen heimischen Server zugreifen
möchte, ergibt sich oftmals das Problem, dass der Firmen-Firewall alle
Ports ausser 80 (HTTP) und 443 (HTTPS) blockiert, so dass ein Zugriff
via SSH meist nicht möglich ist. Um dieses Problem zu umgehen, bietet
dieses OPT-Paket einen Shell-Server, der mittels Javascript funktioniert
und deshalb meist problemlos über Firmen-Firewalls und -Proxies hinweg
arbeiten kann. Dazu läuft auf dem fli4l-Router ein kleiner Webserver,
der über HTTP mit einem beliebigen, JavaScript-fähigen Webbrowser
kommuniziert. Der Webserver baut dann vom Router aus eine SSH-Verbindung
zum Zielrechner im lokalen Netzwerk auf und vermittelt die entsprechenden
Daten (also Tastatureingaben und Bildschirmausgaben).

Um auf den Shell-Webserver zuzugreifen, bietet dieses OPT-Paket zwei
Möglichkeiten an:

1.) Der Webserver läuft direkt auf Port 443 (also dem HTTPS-Port):
    In diesem Fall muss man auf dem Router ein Sicherheits-Zertifikat
    hinterlegen, um die Verbindung nach aussen abhörsicher zu machen.
    Ausserdem kann dann auf dem entsprechenden Router-Port kein weiterer
    Webserver mehr laufen - auch nicht per Port-Forwarding.

2.) Der Webserver ist nicht direkt von aussen erreichbar:
    In diesem Fall wird der Zugriff über einen Reverse-Proxy wie beispiels-
    weise pound (zu finden im OPT_POUND) gesteuert. Durch eine URL-Angabe
    ist es auf diese Weise möglich, auch mehrere Webserver von aussen
    anzusprechen. Pound ist dann in der Lage, anhand der URL die Web-
    Anfragen aus dem Internet entsprechend zu routen. Allerdings erlaubt
    das OPT_POUND ohne weitere Konfiguration keine verschlüsselten Verbin-
    dungen, was für den Shell-Zugriff fatal wäre, da das einzugebende
    Passwort abgehört werden könnte. Insofern ist der Installationsauf-
    wand etwas höher, um diesem Problem abzuhelfen.

Welche Variante man wählt hängt von den eigenen Bedürfnissen ab. Hat man
auf dem Router den Port 443 sowieso frei, kann man die Variante 1 wählen.
Anderenfalls wäre Variante 2 besser.



Installation Variante 1
=======================

Diese Variante wird gewählt, wenn man der Konfigurationsvariablen
SHELLINABOX_PORT einen Wert zuweist (meist wohl die Nummer 443). Dann
ist es aber auch notwendig, noch ein Sicherheitszertifikat zu installieren.
Dieses muss ein PEM-File sein, das man auf einem beliebigen Rechner, auf
dem openssl installiert ist, wie folgt erzeugen kann:

openssl req -x509 -nodes -days 7300 -newkey rsa:1024 \
                  -keyout /dev/stdout -out /dev/stdout \
                  -subj '/CN=fli4l.domain/' >certificate.pem

Auf diese Weise wird ein selbst-signiertes Zertifikat erzeugt, das
7300 Tage gültig ist, und auf die Domain 'fli4l.domain' ausgestellt
wurde. Hat man bereits ein anderes Zertifikat, kann man natürlich
auch das einsetzen. Die Datei 'certficate.pem' muss dann in das
Verzeichnis config/etc/shellinabox im fli4l-Verzeichnis kopiert werden.

Wichtig ist ausserdem, dass man in der config-Datei base.txt auch
den mit SHELLINABOX_PORT gewählten Port nach aussen hin öffnet (siehe
fli4l-Basis-Dokumentation).



Installation Variante 2
=======================

Bei dieser Variante muss die Konfigurationsvariable SHELLINABOX_PORT
leer bleiben. Auf den Webserver kann dann nur direkt auf dem Router auf
Port 4200 zugegriffen werden. Um trotzdem einen Internet-Zugang zu
ermöglichen, muss man einen Reverse-Proxy einsetzen. Hierzu kann
OPT_POUND verwendet werden. Allerdings verbindet sich Pound standard-
mäßig mit HTTP auf Port 80 ohne Verschlüsselung, so dass der Installa-
tionsaufwand etwas größer ist, um eine gesicherte Verbindung zu ermög-
lichen. Man muss nämlich eine Konfigurationsdatei für Pound manuell
neu erstellen. Diese kann etwa so aussehen:


---------------------------<snip>-----------------------------
Daemon              1
LogLevel            2
LogFacility         user
Alive               30
TimeOut             20
Grace               10
Control             "/var/pound/pound.sock"


# Listen to SSL requests
ListenHTTPs
	Address            :PPP:
	Port               443
	Cert               "/etc/pound/pound.pem"
	Ciphers            "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
	xHTTP              1
	RewriteLocation    1
	RewriteDestination 1
End


# Virtual shell server
Service "Shell"
	URL "^/shell"
	BackEnd
		Address  localhost
		Port     4200
	End
End


# Default server
Service "Default"
	BackEnd
		Address  www.meinlokalesnetz.local
		Port     80
		Priority 1
	End
End
---------------------------<snip>-----------------------------


Diese Konfigurationsdatei speichert man dann irgendwo auf dem
Router mit dem Namen 'pound.tmp' zusammen mit einem entsprechenden
Server-Zertifikat namens 'pound.pem' ab. Beide Dateien müssen dann
am Ende der Router-Initialisierung in das Verzeichnis '/etc/pound'
kopiert werden. Hierzu kann man beispielsweise das OPT_USERCMD
verwenden. Dieses konfiguriert man dann mit:

USERCMD_BOOT_N='2'
USERCMD_BOOT_1='cp /data/pound.tmp /etc/pound/pound.tmp'
USERCMD_BOOT_2='cp /data/pound.pem /etc/pound/pound.pem'

wenn die entsprechenden Dateien auf einer Festplatte liegen, die
als /data gemountet wurde. Die Datei 'pound.pem' kann wie oben
beschrieben auch ein selbst-signiertes openssl-Zertifikat sein.

Bei dieser Pound-Konfiguration wird eine Art virtueller Webserver
erzeugt, der über

https://mein.fli4l.router/shell

erreicht werden kann und auf den Web-Shell-Server umgeleitet wird.
Alle anderen URL werden direkt an www.meinlokalesnetz.local weiter-
geleitet.



Benutzung
=========

Hat man alles entsprechend konfiguriert, kann man von jedem beliebigen
Web-Browser mit JavaScript-Unterstützung auf seinen Server via SSH
zugreifen. Bei Variante 1 benutzt man

https://mein.fli4l.router

und bei Variante 2

https://mein.fli4l.router/shell

In jedem Fall sollte man dann einen Login-Prompt sehen, an dem man
seinen Login-Namen auf dem Ziel-Server eingeben muss. Eventuell
erscheint danach die SSH-Abfrage, ob man dem Server-Schlüssel
vertrauen möchte, und dann erfolgt die Passwort-Abfrage.

Zu beachten ist, dass der Web-Shell-Server nur bei der Variante 1
vom lokalen Netz aus erreichbar ist.



Konfigurations-Variablen
========================


OPT_SHELLINABOX='yes'

Zum Aktivieren des OPT



SHELLINABOX_URI=''

Dies ist der URL-Pfad, auf den der Web-Shell-Server hört. Bei der
oben dargestellten Variante 2 muss diese Variable den gleichen Wert
haben wie die in der Pound-Konfiguration angegebene URL (also im
obigen Beispiel '/shell'). Bei Variante 1 sollte der Wert dieser
Variablen leer sein.


SHELLINABOX_HOST='server.meinlokalesnetz.local'

Vollständiger Name des Servers, zum dem eine SSH-Verbindung aufge-
baut werden soll.


SHELLINABOX_PORT=''

Port, auf dem der Web-Shell-Server auf eingehende Verbindungen
lauscht. Ist der Wert leer, wird der Server nur lokal gestartet.
Anderenfalls verbindet er sich mit diesem Port auf allen verfüg-
baren Netzwerk-Interfaces. Deshalb ist dann auch die Angabe eines
Sicherheits-Zertifikates notwendig.

