Keine Passwörter ins Wohnheimnetz!
Inhalt
Das Problem
Alles, was ein Rechner ins Netz schickt, kann prinzipiell von allen anderen Rechnern im gleichen Netzsegment gelesen werden. Das ergibt sich aus der Funktionsweise von Ethernet. Im Fall der Wohnheimnetze umfaßt das Netzsegment alle Rechner im HaDiKo. Selbstverständlich ist das Abhören fremder Daten per Benutzerordnung verboten, technisch verhindern läßt es sich aber mit der derzeit eingesetzten Netztechnik nicht.Daher muß man sich bei der Benutzung von Netzdiensten Gedanken machen, welche Gefahren die Abhörbarkeit mit sich bringt. Besonders kritisch in dieser Hinsicht sind jede Art von Passwörtern: wer sich in den Besitz eines gültigen Accountname/Passwort-Paars bringt, kann damit auf fremden Rechnern beliebigen Unfug treiben, für den sich der legitime Inhaber des Accounts dann am Ende noch verantworten muß. Ein normales Telnet, FTP mit Passwort und andere Standarddienste übertragen immer Passwörter im Klartext und stellen damit ein beträchtliches Risiko dar.
Es sollte deswegen ein vorrangiges Ziel sein, niemals Passwörter im Klartext über das Netz zu senden. Dieses Ziel läßt sich mit passender Software erreichen. Grundsätzlich sind folgende Möglichkeiten dafür denkbar:
- Verwendung von Einmalpasswörtern;
- Authentifizierung mit Challenge-Response-Verfahren;
- Verschlüsselung des gesamten Datenverkehrs.
(2) und (3) hängen eng zusammen, da teilweise die gleichen Verfahren verwendet werden. Verschlüsselung des gesamten Traffics ist allgemeiner und schützt auch gegen Ausspähen der Nutzdaten.
Ein spezieller, in letzter Zeit bekannt gewordener Angriff erlaubt es unter bestimmten Bedingungen, eine bestehende Verbindung (z.B. Telnet-Login) auf einen anderen Rechner umzuleiten. Diese Bedingungen sind im Wohnheimnetz erfüllbar. Dagegen schützt nur Methode (3).
Das Softwaresystem ssh (Secure Shell) implementiert die Methoden (2) und (3). Seine Verwendung ist auf allen Rechnern, wo die Software verfügbar ist (momentan Unix, OS/2, Amiga, Macintosh und Windows), dringend angeraten. Auf den Unix-Rechnern von Uni-Rechenzentrum und IRA ist ssh normalerweise standardmäßig installiert.
ssh bietet hinreichend allgemeine Möglichkeiten, um die meisten Netzdienste über verschlüsselte Kanäle ablaufen zu lasssen. Bei richtiger Konfiguration und konsequenter Anwendung ist es möglich, einen Rechner am Netz so zu betreiben, daß kein unverschlüsseltes Paket mehr den Rechner verläßt. (Abgesehen von nicht sicherheitsbedenklichen Daten wie Nameserveranfragen, etc.)
Beschreibung von ssh
ssh ist als "plug-in-compatible" zu den Standard-Unix-Programmen rsh und rlogin konzipiert. Mit diesen kann man sich auf anderen Rechnern einloggen oder direkt Programme starten. Dabei muß man kein Passwort eingeben, wenn auf dem Zielrechner konfiguriert ist, von welchen IP-Adressen Verbindungen angenommen werden. Das ist sehr bequem, aber IP-Adressen sind generell fälschbar und damit zur Authentifizierung nicht geeignet.Daher bietet ssh eine Reihe von Sicherheitsmechanismen, mit denen diesem Problem abgeholfen wird. Neben der Verschlüsselung des gesamten Datenstroms mit Stromchiffren werden Hosts und User mit dem RSA-Verfahren durch public keys abgesichert.
Grundlegendes
(Hier muß noch was geschrieben werden...)Authentifizierungsverfahren
ssh bietet mehrere Möglichkeiten, wie sich der Benutzer dem Server gegenüber authentifiziert. Relevant sind insbesondere die Methoden "PasswordAuthentication" und "RSAAuthentication".Passwort
Dieses Verfahren wird dann verwendet, wenn eine Authentifizierung mit anderen Methoden nicht klappt. Dabei fragt der ssh-Client das Userpasswort in konventioneller Weise ab, schickt es aber verschlüsselt zum Server. Der Server wiederum behandelt das Passwort in der gewohnten Weise. Damit ist das Verfahren genauso zu handhaben wie telnet, aber sicherer - kein Abhören möglich.RSA
Wirklich interessant ist die RSA-Authentifizierung. Dabei wird der RSA-Public-Key-Algorithmus verwendet: der Benutzer besitzt einen geheimen Schlüssel und der Host, auf dem er sich einloggen will (Zielhost) den dazugehörigen öffentlichen Schlüssel. Wie bei der Verifikation einer PGP-Signatur kann der Server feststellen, ob der geheime Schlüssel stimmt, ohne daß direkt brauchbare Klartextdaten übertragen werden. Es ist möglich, mit einem geheimen Schlüssel Zugriff auf mehreren Accounts zu erlauben, indem man den öffentlichen Schlüssel kopiert. Das macht das Verfahren sehr bequem in der Handhabung - ein Passwort muß weder gemerkt noch eingegeben oder regelmäßig geändert werden, es sei denn der geheime Schlüssel ist selber passwortgesichert.Die Handhabung erfolgt so: zuerst erzeugt man sich mit dem Programm
ssh-keygen
ein Schlüsselpaar. Das wird (auf
Unix-Systemen) normalerweise in den Dateien
~/.ssh/identity
und ~/.ssh/identity.pub
gespeichert. Letzteres ist der öffentliche Schlüssel. Er hat
die Form einer Textdatei, die aus einer langen Zeile besteht.
Auf jedem Zielhost kopiert man jetzt die
identity.pub
-Datei in
~/.ssh/authorized_keys
. Ein Schlüssel muß
genau eine Zeile sein, ggf. automatischen Zeilenumbruch im Editor
deaktivieren. Der geheime Schlüssel darf natürlich nicht
kopiert werden! Ein öffentlicher Schlüssel in
authorized_keys
bedeutet: Erlaube dem Inhaber des
zugehörigen geheimen Schlüssels Zugriff auf diesen Account.
Die Erlaubnis wird widerrufen, indem man die Zeile mit dem
öffentlichen Schlüssel löscht.
Mit ssh-keygen
kann der geheime Schlüssel
zusätzlich passwortgeschützt werden. Dann muß man die
hier definierte "Passphrase" bei jedem Zugriff auf den geheimen
Schlüssel eingeben. Das ist wiederum unbequemer, aber
schützt davor, daß der geheime Schlüssel in falsche
Hände gerät.
Wenn ein geheimer Schlüssel unberechtigt kopiert wurde oder
auch nur der Verdacht besteht, ist es - anders als bei PGP - ohne
Umstände möglich, einen neuen anzulegen. Man muß nur
darauf achten, daß man den alten öffentlichen
Schlüssel aus allen authorized_keys
-Files entfernt.
Filetransfer
ssh bietet das Kommando "scp" als plug-in-compatible zu rcp an. Damit lassen sich Files einfacher als mit FTP zwischen zwei Rechnern kopieren, wobei automatisch ssh verwendet wird. Anwendung wie in diesen Beispielen:scp -p *.html rzstud1:.public_html scp s_newuser@studsun1.ira.uka.de:perl-examples.ps ./miscWeitere Erläuterungen sind in der Manpage.
TCP-Portumlenkung
Gleichzeitig mit der Login-Funktion arbeitet ssh auch als TCP-Proxy. Beim Aufruf des ssh-Befehls kann man beliebig angeben, daß TCP-Verbindungen auf bestimmten Ports der einen Seite auf Verbindungen auf der anderen Seite umgelenkt werden sollen. Dabei kommt zwischen beiden wiederum ein verschlüsselter Kanal zum Einsatz.Eine solche Umlenkung wird mit den Kommandozeilenoptionen
-L
bzw. -R
im ssh-Aufruf aktiviert. Dann
passiert folgendes:
-Lport1:host:port2
- Verbindungen auf den Port
port1
des Clients werden vom Server auf den Portport2
des Hostshost
vorgenommen -Rport1:host:port2
- Verbindungen auf den Port
port1
des Servers werden vom Client auf den Portport2
des Hostshost
vorgenommen
ssh rzstud1 -L9876:mailhost.rz.uni-karlsruhe.de:25
X11 über ssh
Ein Sonderfall ist in ssh fest eingebaut, der die Bedienung sehr bequem macht: wenn man ssh aus einer X11-Session aufruft (DISPLAY ist gesetzt), dann wird eine Umlenkung für X11 aktiviert und gleichzeitig auf dem Zielhost DISPLAY und xauth passend gesetzt. Damit ist ohne weiteres Zutun der Aufruf von X11-Programmen sofort möglich, und das richtige Display wird benutzt.Es ist zu empfehlen, X11-Verbindungen nur über ssh laufen zu
lassen und niemals DISPLAY unbesehen umzusetzen, da das X11-Protokoll
sehr unsicher ist. Niemals sollte man mit xhost
Zugriff auf ein Display erlauben. X-Displays sollten immer so
konfiguriert werden, daß sie mindestens "Magic
Cookie"-Autorisierung verwenden. Das gilt auch außerhalb
der Wohnheimnetze.
Konfiguration
Un*x-Client
In der Datei/etc/ssh_config
finden sich Parameter
für ssh. Das meiste, was standardmäßig eingestellt
ist, funktioniert so. Man kann allerdings etwas optimieren. Ich
verwende folgende Einstellungen:
# Site-wide defaults for various options Host * ForwardAgent no ForwardX11 yes RhostsAuthentication no RhostsRSAAuthentication no RSAAuthentication yes PasswordAuthentication yes FallBackToRsh no UseRsh no IdentityFile ~/.ssh/identity Port 22 Cipher blowfish EscapeChar none KeepAlive noDamit wird einiges, was ich nicht brauche, z.B. die rhosts-Authentikation, oder was ich unter keinen Umständen haben will (FallBackToRsh) gar nicht erst versucht. Als Verschlüsselung sollte man "blowfish" wählen, das ist am schnellsten. "arcfour" ist in neueren ssh-Versionen wegen eines potentiell die Sicherheit gefährdenden Fehlers deaktiviert.
Vor(!) dieser Defaulteinstellung können hostspezifische Optionen stehen, z.B. abgekürzte Hostnamen, Usernamen...:
Host rzstud1 HostName rzstud1.rz.uni-karlsruhe.de IdentityFile ~olaf/.ssh/identity User uknf(wer das mit meinem Usernamen übernimmt, bekommt eins an die Löffel ;-)).
Ansonsten lese man sich die Manpage zu ssh durch, da ist eigentlich alles Notwendige zu finden.
Un*x-Server
Wer die Möglichkeit haben will, sich von außen (von
anderen Rechnern im Netz oder auch aus der Uni) auf seinem eigenen
Rechner einzuloggen, sollte den sshd
aus einem der
zahlreichen Initialisierungs-Skripts starten. Ich empfehle, ihn direkt
nach dem inetd
einzutragen, da paßt er systematisch
hin.
Analog zum Client gibt es auch für den ssh-Server eine
Konfigurationsdatei /etc/sshd_config
. Die sieht bei mir so
aus:
# This is ssh server systemwide configuration file. Port 22 ListenAddress 0.0.0.0 HostKey /etc/ssh_host_key ServerKeyBits 768 LoginGraceTime 600 KeyRegenerationInterval 7200 PermitRootLogin yes QuietMode no FascistLogging no PrintMotd yes SyslogFacility AUTH RhostsAuthentication no RhostsRSAAuthentication yes RSAAuthentication yes PasswordAuthentication yesWichtig: RhostsAuthentication unbedingt auf "no" stellen. Außerdem im
/etc/inetd.conf
den telnetd, rlogind,
rshd und rexecd (und auch den ftpd, es sei denn, man betreibt einen
Anonymous-FTP-Server) auskommentieren. Diese nehmen Passwörter im
Klartext über das Netz an.
Weitere Informationen gibt es auch im SSH-FAQ.
Andere Systeme
Anleitungen für andere Systeme finden sich auf den Seiten der HaDiNet-Benutzerbetreuung.Verwendung von normalen Netzdiensten mit ssh
Sämtliche Netzdienste, die eine Benutzeridentifikation mit Passwort benötigen, sollten nur über eine ssh-Verbindung benutzt werden. Das ist gar nicht schwer, sobald man es verstanden hat.POP
(Bitte diesen Abschnitt auch lesen, wenn man selber kein POP verwendet, da die grundlegende Technik der Portumlenkung an diesem Beispiel erläutert wird.)Mail mit POP zu verarbeiten, ist bequem und daher recht beliebt (und in den Standard-Mailprogrammen mancher Systeme eingebaut), stellt aber ein erhebliches Sicherheitsproblem dar. POP verlangt die Angabe des eigenen Account-Passwortes, das im Klartext übertragen wird (abgesehen davon, daß die Mail selber ebenfalls im Klartext durchs Netz geht). POP arbeitet auf einer einzelnen TCP-Verbindung zu einem bekannten Port und ist dadurch sehr einfach mit ssh zu sichern, so daß dieses Problem nicht mehr auftritt. Mit folgendem Befehl:
ssh rzstud1 -L110:poprzstud:110
-La:b:c
sagt dem ssh-Client, daß jede
Verbindung auf den Port a der lokalen Maschine auf den Port c der
Maschine b weitergeleitet werden soll. Im Beispiel bedeutet das also,
daß der lokale Port 110 auf Port 110 (POP3) auf der Maschine
poprzstud
umgeleitet wird. Diese Weiterleitung benutzt
einen verschlüsselten Kanal.
Da man jetzt den lokalen POP-Port so belegt hat, daß Zugriffe
darauf auf den POP-Port der rzstud1 weitergeleitet werden, kann und
sollte man localhost
als POP-Server konfigurieren. Dann
muß man allerdings immer den oben genannten ssh-Befehl laufen
haben, während man seine Mail liest - wenn er beendet wird, wird
auch die Portumlenkung beendet.
Das gleiche Verfahren funktioniert mit allen Diensten, die auf einer einzigen TCP-Verbindung zu einer bekannten Portnummer basieren, also allen, die prinzipiell auch mit "telnet host port" angesprochen werden können. Beispiele für diese Dienste sind SMTP, aber auch telnet (als Notnagel für Maschinen, die noch keinen sshd haben).
Da die Umlenkung über einen Uni-Rechner läuft, kann es sich dabei auch um Maschinen außerhalb der Uni handeln. Mehr zu diesem Thema weiter unten.
Nicht-anonymes FTP
FTP paßt leider nicht in das im letzten Absatz beschriebene Schema, da für einen FTP-Transfer mehrere Verbindungen auf vorher nicht bekannten Nummern geöffnet werden müssen. Anonymes FTP enthält genau wie normale WWW-Zugriffe per se erst einmal keine kritischen Daten; relevant wird das aber bei Zugriffen mit Passwort, wie beim Transfer von Daten zwischen lokalem Rechner und Uni-Account.Hierzu ist die beste Methode, ganz auf FTP zu verzichten und scp aus dem ssh-Paket zu benutzen, wo immer möglich. Eine allgemeine Lösung für FTP gibt es leider nicht. Als Notnagel könnte man SOCKS über ssh benutzen (s.u.), dann aber auch innerhalb der Uni! Ein HTTP-Proxy sollte für diesen Zweck ebenfalls nicht verwendet werden: das Passwort ist Bestandteil der URL und wird mit dem Request im Klartext übertragen, außerdem kann es vom Proxy mitgeloggt werden.
Sonstige
Mail verschickt wird mit SMTP (Port 25). Jede Mail, die wirklich niemand mitlesen soll, sollte eigentlich mit PGP verschlüsselt werden. Zumindest innerhalb des Wohnheimnetzes läßt sich aber das Mitlesen auf dem Netz mit einer ssh-Umlenkung des SMTP-Ports auf den Uni-Mailserver (nicht den HaDiKo-Mailserver!) verhindern.Manche per HTTP zu erreichenden Dienste brauchen die Eingabe eines
Passworts oder sonstiger geheimer Daten. Dafür sollte man den
betreffenden Host auf einen beliebigen lokalen Port umlenken und in
der URL localhost:port
statt des Original-Hosts
verwenden:
- eine Umlenkung
-L8765:www.foo.com:80
und - die URL
http://localhost:8765/path/doc.html
http://www.foo.com:80/path/doc.html
wirdhttp:// www.foo.com : 80 /path/doc.html ||||||||||| || ssh -L 8765 : www.foo.com : 80 || |||| http:// localhost : 8765 /path/doc.html
Man sollte beachten, daß die Benutzung eines HTTP-Proxys für solche Dienste grundsätzlich nicht zu empfehlen ist, da der Proxy prinzipiell die Passwörter loggen kann.
Für https sind diese Verrenkungen nicht erforderlich, das Protokoll verschlüsselt selber. Man sollte darauf achten, keine älteren "Export"-Browser mehr zu verwenden, die nur 40-Bit-Schlüssel verwenden können.
Welche Dienste man sonst noch benutzt, bei denen Passwörter verwendet werden, sollte man selber wissen...
Anmerkungen
Selbstverständlich erlaubt ssh die Angabe von mehreren Portumlenkungen als-Lport:host:port
-Argumente auf einer
Kommandozeile. Das können ruhig viele sein, der zusätzliche
Speicherbedarf fällt nicht ins Gewicht. Am einfachsten schreibt
man sich den Aufruf in ein kleines Shellscript. Alternativ definiert
man dafür im /etc/ssh_config
eine Pseudosite und schreibt
die zusätzlichen Argumente dort rein:
Host relayer HostName rzstud1.rz.uni-karlsruhe.de IdentityFile ~foo/.ssh/identity User ufoo LocalForward 110 poprzstud.rz.uni-karlsruhe.de:110 # und weitere LocalForwards. Syntax beachten: nur ein DoppelpunktDann reicht ein "ssh relayer" als Aufruf.
Wenn auf der lokalen Seite Ports im "reservierten" Bereich
(unterhalb von 1024) umgelenkt werden, muß man den ssh-Client
als root aufrufen. Für jeden Port kann immer nur ein ssh-Prozess
mit der Umlenkung aktiv sein, weitere ssh-Clients können aber
ohne die -L
-Parameter gestartet werden.
Bei neueren Versionen von ssh sind die lokal umgelenkten Ports nur
von localhost
aus erreichbar. Dies verhindert, daß andere
Rechner im Netz die Umlenkung benutzen und damit ihre Identität hinter
dem Inhaber der Umlenkung verstecken (und eventuellen Unfug ihm
anlasten). Daher muß man z.B. als POP-Server localhost
und nicht den eigentlichen Rechnernamen angeben. Wer mehrere Rechner
hat und von allen diesen aus die Umlenkung nutzen will, muß ssh mit
dem Parameter -g
starten und unbedingt mittels
entsprechender Firewall-Regeln dafür sorgen, daß die umgelenkten Ports
aus dem restlichen Netz nicht erreichbar sind.
SOCKS und ssh
Funktion von SOCKS
SOCKS ist ein Protokoll, mit dem sich die Beschränkung auf das Uninetz überwinden läßt. Es benötigt zwar angepaßte Software, die ist aber leicht zu bekommen. Je nach Betriebssystem braucht man nur eine SOCKS-Library zu installieren oder maximal die Netzwerkprogramme unter Verwendung dieser Library neu zu compilieren, Änderungen am Programm sind in der Regel nicht erforderlich. Manche Programme haben SOCKS-Unterstützung auch gleich eingebaut. Es gibt zwei Versionen von SOCKS, 4 und 5. Vom RZ wird nur Version 5 unterstützt; es existiert ein SOCKS-Server auf rzstud1.SOCKS funktioniert so: jeder Versuch, eine Netzwerkverbindung (außerhalb des uni-internen Bereichs) zu öffnen, wird nicht vom Betriebssystem direkt ausgeführt, sondern die SOCKS-Library öffnet zuerst eine Verbindung (Kontrollverbindung) zum SOCKS-Server und authentifiziert sich bei diesem. Dann schickt die Library den Verbindungswunsch an den SOCKS-Server, der den Verbindungsaufbau vornimmt. Anschließend kann die Kontrollverbindung als Datenverbindung benutzt werden.
Es handelt sich also um einen TCP-Proxy ähnlich der Portumlenkung von ssh. Allerdings ist SOCKS allgemeiner: es erlaubt auch passive Verbindungen und Verbindungen auf nicht von vornherein bekannte Ports. Damit sind auch Protokolle wie FTP möglich. SOCKS 5 erlaubt mit Einschränkungen auch das Weiterleiten von UDP-Paketen.
SOCKS verlangt nach einer Benutzeridentifikation mit Username und Passwort, die im Klartext über die Kontrollverbindung gehen. Daher ist von der direkten Verwendung von SOCKS im Wohnheimnetz dringend abzuraten.
SOCKS über ssh
Wie oben am Beispiel POP geschildert, läßt sich eine SOCKS-Verbindung aber ohne weiteres über eine ssh-Portumlenkung betreiben: die Kontrollverbindung geht auf einen festen Host (rzstud1) und Port (1080). Nach dem Aufruf einer Portumlenkung wie mitssh rzstud1 -L1080:rzstud1:1080
localhost
als SOCKS-Server fungieren.
libsocks-Konfiguration
Un*x
Verwendet man unter Un*x die NWSL-libsocks von NEC (die gleiche Software, mit der der RZ-SOCKS-Server betrieben wird), dann wird diese in einer Datei/etc/libsocks5.conf
konfiguriert.
Dafür sind folgende Einträge zu empfehlen:
# type prot dest-addr dest-port userlist proxy socks5 - - 21 - 127.0.0.1 noproxy - 129.13. - - - socks5 - - - - 127.0.0.1Die Bedeutung dieser drei Zeilen (die erste ist Kommentar): lasse alles ins Uninetz bis auf FTP direkt, außerhalb und für FTP (wegen der Passwörter) nimm
localhost
(127.0.0.1)
als SOCKS-Server. Achtung: ein FTP innerhalb des
Wohnheimnetzes ist auch mit dieser Konfiguration unsicher: die
Verbindung geht zwar verschlüsselt zum RZ, von dort aus aber
unverschlüsselt wieder ins Wohnheimnetz.
Außerdem müssen für SOCKS-Programme folgende Environment-Variablen gesetzt werden:
SOCKS5_USER
- Username auf dem SOCKS-Server (also rzstud1)
SOCKS5_PASSWD
- dazu passendes Passwort
SOCKS5_UDPBIND
- Flag, daß UDP benutzt werden soll (siehe unten)
SOCKS5_LOG_SYSLOG
- wenn gesetzt, logge Messages auf Syslog
SOCKS5_LOG_STDERR
- wenn gesetzt, logge auf stderr - das sollte man unbedingt setzen, dann werden Fehlermeldungen verständlicher
SOCKS5_DEBUG
- Debuglevel, nur bei Problemen auf Zahl größer 0 setzen
Sonstige
Mit SOCKS-Libraries und -Anwendungen auf anderen Betriebssystemen kenne ich mich leider nicht aus, nur so viel: wenn man keinen Usernamen/Passwort angeben kann, handelt es sich um SOCKS4 und funktioniert hier (mangels sinnvoller Authentikationsmöglichkeit) nicht.Einschränkungen
Ein mitunter lästiges Problem tritt bei dieser Methode allerdings auf: Wenn die ssh-Umlenkung aktiv ist, funktioniert UDP über SOCKS nicht. Das liegt am SOCKS-Protokoll. Eine Lösung dafür in Gestalt eines alternativen SOCKS-Servers ist verfügbar, siehe die Infoseite dazu.Anhang
Referenzen
- SSH-Protokoll (Internet-Draft ylonen-ssh-protocol-00)
- SOCKS-Protokoll (RFC 1928)
Bezugsquellen
Siehe ftp://ftp.hadiko.de/pub/systems/.Fehler etc. bitte an mich mailen.