Lustige Portweiterleitungen
Unsere Schulhomepage besitzt einen eigenen Loginbereich, für den wir gerne auch die Nutzername/Passwortwortkombination nutzen wollten wie für den Schulserver. Mehrere unterschiedliche Zugänge sind in der Regel nutzerunfreundlich und werden kaum akzeptiert.
Das verwendete Joomla! hat zum Glück eine Reihe von Authentifizierungsplugins, unter anderem LDAP, POP3, IMAP oder Keberos. Am einfachsten geht es über IMAP, d.h. Joomla! versucht sich mit den Nutzerdaten bei Mailserver des Schulservers einzuloggen und wenn das klappt, legt es einen neuen Benutzeraccount an, den es zukünftig immer extern authentifiziert. Dummerweise klappte das bei uns nur über eine unverschlüsselte Verbindung zuverlässig – also keine sinnvolle Option.
Glücklicherweise läuft unser Joomla! auf einem VServer, auf den wir Shellzugriff haben. Mit einem linuxtypischen Einzeiler kann man den Mailserverport durch einen verschlüsselten Kanal auf den VServer tunneln – bei uns:
ssh ‑R 1143:localhost:143 unprivileged@vserver.xy ‑N ‑T
Das sorgt dafür, das der unverschlüsselte Mailserverport 143 auf dem VServer unter der Portnummer 1143 erreichbar ist.
Normalerweise würde nach diesem Kommando das Passwort des Benutzer „unprivileged“ (der Nutzer sollte möglichst wenig Rechte auf dem Zielserver haben, weshalb die Portnummer auch größer als 1024 sein muss) erfragt werden. Damit das nicht geschieht, verwenden wir die Authentifizierung per Public-Key.
Unser Schulserver ist nur per VDSL an das Internet angebunden und wird einmal täglich providerseitig vom Netz getrennt. Damit würde unser Tunnel zusammenbrechen. Damit das erkannt wird, läuft folgendes Script per cronjob alle fünf Minuten:
#!/bin/bash
COUNT=‚ps aux | grep unprivileged | wc ‑l‚
if [ $COUNT ‑ge 2 ]; then
exit 0
else
ssh ‑R 1143:localhost:143 unprivileged@vserver.xy ‑N ‑T
fi
Die Variable COUNT enthält die Ausgabe der Befehlspipe zwischen den Backticks ‚. Wenn der Tunnel offen ist, enthält die Ausgabe zwei Zeilen (den eigentlichen Tunnelprozess und den Suchprozess nach „unprivileged“). Wenn das so ist, tut das Script nichts, wenn nicht, startet es den Tunnel einfach neu. Das Script muss mit Rootrechten laufen, da ein Port unterhalb von 1024 lokal verwendet wird.
Auf diese Weise kann man im Prinzip jeden Dienst lokal auf einen VServer weiterleiten, z.B. auf den LDAP der Musterlösung aus Baden-Württemberg und muss dann keine Klartextpasswörter mehr durch die Gegend schicken.