Einrichtung eines UUCP-über-SSH-Tunnels


Dieses Dokument beschreibt die Benutzung von UUCP über eine per SSH (secure shell) verschlüsselte TCP/IP-Verbindung. Ich setze an dieser Stelle grundsätzliche Kenntnisse über die Einrichtung und Benutzung von UUCP und der SSH voraus und gehe lediglich auf die Eigenheiten im Zusammenhang mit der Verwendung beider in Kombination ein. Als Referenzbetriebssystem wurde FreeBSD verwendet, gleichartige Konfigurationen sollten aber auf jeden Fall unter anderen Unix-Betriebssystemen oder Unix-artigen Systemen (z. B. Linux) möglich sein. Portierungen von SSH oder UUCP existieren auch für Windows, ich selbst habe eine solche Konfiguration aber noch nie eingesetzt oder gesehen.

Martin Welk <mw@sax.de>, 2000-01-29


Inhaltsverzeichnis

1. Einleitung

1.1. Warum UUCP über SSH?
1.2. Was ist ein SSH-Tunnel?
1.3. Systemvoraussetzungen

2. Einrichtung

2.1. Authentifizierung mittels SSH
2.2. Einrichten eines SSH-Tunnels
2.3. UUCP-Konfiguration
2.4. UUCP über IP mit sax.sax.de

3. Weitere Informationen

3.1. Informationen auf sax.sax.de
3.2. Informationen im Rest der Welt

4. Sonstiges

4.1. Quellen
4.2. Danksagungen
4.3. Copyright

1. Einleitung

1.1. Warum UUCP über SSH?

Der Transfer von Dateien per UUCP eignet sich auch heute noch gut für die Übertragung größerer Mengen von E-Mails, News-Artikeln oder anderen Dateien über Wählverbindungen. Der klassische UUCP-Transfer zwischen zwei beteiligten Rechnern erfolgt dabei mittels der direkten Modemeinwahl des einen beim anderen.
Darüber hinaus kann UUCP (hier: Taylor UUCP) auch Daten per TCP/IP über eine Internet-Verbindung übertragen. Im Fall eines SaxNet-Mitglieds könnte das eine direkte ISDN-Einwahl über die SaxNet-Zugangstechnik sein, der UUCP-Transfer ist aber beispielsweise auch über beliebige andere IP-Diensteanbieter möglich, die insbesondere tagsüber teilweise Zugangsgebühren unter den Telefongebühren einer Ortsverbindung - darüber hinaus gibt es mit dem Autor mindestens ein Mitglied, für den die SaxNet-Einwahl nicht zum Ortstarif erfolgt. Denkbar ist auch, daß sich jemand seine Post über einen anderen Internet Service Provider aus der Ferne von unterwegs zum Ortstarif (bzw. günstiger) auf diesem Weg abholt.

Die Übertragung jeglicher Daten (z. B. E-Mail) erfolgt bei einem UUCP-Transfer unverschlüsselt. Das ist nicht so furchtbar kritisch - im Wesentlichen wird UUCP für News und E-Mail benutzt, Usenet-News sind sowieso öffentlich zugänglich und auch unverschlüsselte E-Mail ist bereits schon einmal vorher ohne Verschlüsselung durch das Netz gegangen. Insofern läßt sich durch eine Verschlüsselung des Transportwegs vom SaxNet-Server zum Benutzer-Rechner kaum eine höhere Datensicherheit erreichen. Dummerweise wird aber auch das UUCP-Passwort unverschlüsselt übertragen und könnte somit mitgeschnitten und mißbraucht werden.

Die Secure Shell (SSH) bietet die Möglichkeit an, sowohl eine sicher Authentifizierung als auch verschlüsselte Übertragung für Terminalverbindungen an, außerdem kann man SSH für weitere Datenübertragungen als Transportweg benutzen.

1.2. Was ist ein SSH-Tunnel?

Ein Tunnel ist grundsätzlich eine Röhre, die zwei Punkte in Verbindung bringt. Bei der SSH bedeutet dies die Verbindung eines SSH-Clients zu einem SSH-Server in einer Weise, daß darüber keine direkte Terminalverbindung (shell login) erfolgt, sondern diese Verbindung von anderen Programmen aus genutzt werden kann.

Der Tunnel muß entweder auf der Server-Seite der Verbindung permanent bereitgestellt oder von der Client-Seite aus initiiert werden.

1.3. Systemvoraussetzungen

Auf beiden Seiten sind zueinander kompatible Versionen der SSH erforderlich. Dazu genügt es im Normalfall, wenn auf beiden Seiten eine SSH der Version 1.x oder 2.x vorhanden ist. Die Versionen 1.x und 2.x unterscheiden sich in der Protokollsicherheit und insbesondere auch in den zugrunde liegenden Lizenzbestimmungen - die Version 2.x darf nicht mehr für gewerbliche Zwecke kostenlos verwendet werden.

2. Einrichtung

2.1. Authentifizierung mittels SSH

Für die Authentifzierung eines Benutzers (d. h., der Feststellung, ob ein Benutzer tatsächlich der ist, für den er sich ausgibt), ist der klassiche Weg ein Passwort. Darüber hinaus kann man die Passworteingabe bei manchen Diensten umgehen, in dem man serverseitig vorgibt, welche Benutzer von wo aus freien Zugang bekommen sollen - aber das ist z. B. bei Terminalverbindungen nicht immer sinnvoll und auch nur machbar, wenn die IP-Adresse der Seite, die die Verbindung initiiert, bekannt und statisch ist (z. B. rlogin - Datei .rhosts), für eine Umgebung mit dynamischer Adressvergabe ist dies nicht geeignet. Bei Verbindungen über telnet, rlogin usw. wird das Passwort allerdings unverschlüsselt übertragen, kann somit von Personen mit hinreichend krimineller Energie an einer geeigneten Stelle des Internet unter Umständen mitgeschnitten werden.

Die SSH (secure shell!) ist nicht wie z. B. die Bourne Shell (sh) oder C-Shell (csh) und ähnliche ein weiterer Kommandozeileninterpreter, sondern eigentlich ein sicherer Weg, um eine Shell oder Shell-Funktionen auf einem entfernten Rechner auszuführen, lehnt sich vom Namen her deshalb an die remote shell (rsh) und remote login (rlogin) an (ssh/slogin).

Auf dem Server muß in jedem Fall ein SSH Daemon (sshd) laufen, der über ein eigenes Protokoll die Verbindung vom Client entgegennimmt und bedient. Es bietet sich an, den sshd als daemon im Hintergrund laufen zu lassen - der Start über einen Internet ``super-server'' (unter Unix normalerweise der inetd) könnte aufgrund relativ zeitintensiver Rechenprozesse beim Start sonst durch massive "Anstürme" auf den Port effektiv au&szer;er Betrieb gesetzt werden (denial of service attack).

Die Authentifizierung kann über einen der nachfolgend beschriebenen Wege erfolgen:

2.1.1 Authentifizierung über host.equiv oder shosts.equiv

In einer Datei hosts.equiv (meist unter /etc abgelegt) sind Rechner eingetragen, die das lokale System als vertrauenswürdig ("trusted") einstufen soll. Dann werden Benutzer von diesen Rechnern, die sich per rlogin anmelden möchten bzw. per rsh Aufrufe auf dem Rechner starten wollen, ohne Passwort zugelassen, wenn für sie ein gleichnamiges lokales gütiges Login existiert. Die Echtheitsprüfung der Rechner erfolgt auf Basis der IP-Adresse. In der Datei .rhosts im home directory eines Benutzers kann jeder Benutzer selbst die Hosts und Benutzernamen eintragen, denen er Zugang ohne Passwort ermöglichen will.

Diese Variante ist allgemein unsicher, ermöglicht vergleichsweise einfache Angriffe und ist deshalb normalerweise abgeschaltet.

2.1.2 Authentifizierung auf Basis von Host und Login

Diese Variante baut auf der unter 2.1.1 beschriebenen Technik auf, ergänzt diese aber um eine Echtheitsprüfung durch host keys. Dabei wird auf jedem Rechner beim ersten Aufruf von ssh oder sshd ein privater und ein öffentlicher Schlüssel für den Rechner selbst erzeugt und gespeichert, damit er künftig immer wieder verwendet werden kann.

Ist der Zugang nach .rhosts bzw. .shosts auf dem Server freigegeben, überprüft SSH die host keys - wenn diese gegenseitige Überprüfung positiv beendet wird, ist ein Zugang ohne Eingabe des Benutzerpassworts möglich. Diese Variante wird nicht bei einer Einwahl mit einem Zugang per dynamischer Adressvergabe funktionieren, da hier zwar der host key stimmt, aber meistens nicht zum host passen wird. Die host key Authentifizierung ist die einfache Variante für die Anmeldung auf Rechnern mit statischen IP-Adressen.

2.1.3 Authentifizerung mit Benutzer-Schlüsseln

Die Authentifizierung eines Benutzers mit einem oder mehreren Benutzerschlüsseln funktioniert analog zu der Echtheitsprüfung mit Rechnerschlüsseln, aber einem kleinen Unterschied: ein Benutzer muß ein persönliches Schlüsselpaar erzeugen. Dieses Schlüsselpaar besteht aus einem öffentlichen ("public") und einem privaten Schlüssel: der public key wird auf allen Rechnern hinterlegt, die einem Benutzer, der den dazu passenden private key mitbringt, Zugang (ohne Passworteingabe) gewähren sollen. Zum Erzeugen eines solchen Schlüsselpaares dient das Programm ssh-keygen, der private Schlüssel liegt üblicherweise in .ssh/identity, der dazugehörige public key liegt in .ssh/identiy.pub und öffentliche Schlüssel, denen Zutritt gewährt werden soll, müssen in .ssh/authorized_keys eingetragen werden.

Achtung: das Programm ssh-keygen erwartet beim Erzeugen eines Schlüsselpaares eine passphrase, ein Kennwort, mit dem der private Schlüssel auf der Festplatte gesichert wird. Man kann dieses Feld leer lassen, dann wird nie nach einer passphrase gefragt werden. Besser ist aber, sich mit dem ssh-agent vertraut zu machen, der (z. B. bei der Anmeldung) einmalig die passphrase erfragt und dann den damit entschlüsselten private key für andere Prozesse bei Bedarf bereitstellt.

2.1.4 Authentifizierung über TIS

Die Grundidee ist, daß ein Benutzer bei der Anmeldung mittels einer Seriennummer über einen Authentifizierungsserver überprüft wird und keine öffentlichen keys lokal bekannt sein müssen.

2.2. Einrichten eines SSH-Tunnels

Die Funkionsweise wurde bereits bei 1.2 kurz erläutert. Es gibt bei der SSH die Möglichkeit, einen lokalen Port per SSH zu erzeugen, der auf einen anderen Port auf einem entfernten Rechner weitergeleitet wird. Der uucpd (Taylor UUCP) wird standardmäßzig auf dem Port 540 gestartet (über inetd) - das bedeutet, ein beliebiger freier lokaler Port muß auf den Port 540 eines entfernten Rechners weitergeleitet werden.

Das erreicht man mit der SSH so:

ssh -f [-l <id>] -L <localport>:<remotehost>:540 [-C] <remotehost> <cmd>

Die (optionale) Angabe der (alphanumerischen) ID des Benutzers, dessen Zugang benutzt werden soll, erfolgt mit -l >id<. Der umzuleitende lokale Port muß ein freier Port auf dem lokalen Rechner sein. Die Angabe des entfernten Rechners remotehost muß sowohl als Ziel für die Portumleitung als auch als Ziel für den SSH-Aufruf angegeben werden. Die wahlweise anzugebende Option -C aktiviert die Kompression (mittels des auch in gzip verwendeten Kompressionsalgorithmus) der Daten auf dem Transportweg.

Beim SSH-Aufruf muß in jedem Fall ein auf dem entfernten Rechner auszuführendes Kommando angegeben werden. Die Verbindung wird dann geöffnet und bleibt offen, bis entweder eine zwischenzeitlich geöffnete Verbindung auf dem weitergeleiteten Port geschlossen wird oder das Kommando beendet wird. Es bietet sich hier an, kurzerhand den Befehl sleep zu starten, der eine anzugebende Zeitspanne wartet und sich danach einfach beendet. Ein vollständiger SSH-Aufruf als Vorbereitung für einen UUCP-Transfer könnte also so aussehen:

ssh -f -l mw -L 44444:sax.sax.de:540 -C sax.sax.de sleep 10

(Der Port 44444 des lokalen Rechners wird weitergeleitet an den Port 540 auf dem Rechner sax.sax.de. Die Datenübertragung erfolgt komprimiert, es wird der Login-Name mw auf dem entfernten Rechner verwendet und das Kommando sleep 10 ausgeführt, damit das port forwarding wenigstens 10 Sekunden lang geöffnet bleibt. An dieser Stelle kann nun der UUCP-Datenaustausch gestartet werden. Mit dem Ende des UUCP-Transfers oder nach maximal 10 Sekunden wird der weitergeleitete Port geschlossen.

2.3. UUCP-Konfiguration

Ich setze an dieser Stelle eine laufende UUCP-over-IP-Konfiguration mit Taylor UUCP voraus. Mir ist nicht bekannt, daß andere UUCP-Implementationen UUCP-over-IP unterstützen und ich betrachte Taylor UUCP als de facto Standard.

An einer bestehenden UUCP-über-IP-Konfiguration muß eigentlich nicht viel geändert werden: es muß lediglich der Eintag in der Datei sys auf dem lokalen Rechner so abgeändert werden, daß die Verbindung für das UUCP-Zielsystem nicht mehr über die IP-Adresse bzw. den Hostnamen des Zielrechners auf den UUCP-Port erfolgt, sondern auf den lokalen Rechner und den weitergeleiteten Port:

system sax
call-timegrade z AllTimes
chat login: \L Password: \P
protocol t
port type tcp
#address sax.sax.de
address 127.0.0.1
port service 44444
commands rmail rnews

Der ursprüngliche Eintrag wurde auskommentiert stehengelassen, um den Unterschied zu verdeutlichen.

Es ist natürlich sinnvoll, den SSH-Aufruf entweder in einem Script vorher ausführen zu lassen oder die erforderlichen Einstellungen in der Konfigurationsdatei für SSH (ssh_config) entsprechend einzutragen.

2.4. UUCP über IP mit sax.sax.de

Der erste Schritt, um UUCP über eine verschlüsselte SSH-Verbindung zu sax.sax.de laufen zu lassen, ist das Erzeugen eines neuen Schlüsselpaares, daß ohne Verschlüsselungsmantra (passphrase) genutzt werden kann. Das erreicht man mit ssh-keygen:

mw@theatre:/home/mw 678 $ ssh-keygen
Initializing random number generator...
Generating p: ............++ (distance 130)
Generating q: .......++ (distance 94)
Computing the keys...
Key generation complete.
Enter file in which to save the key (/home/mw/.ssh/identity): uucp.key
Enter passphrase: (Leereingabe, also 1 x Enter)
Enter the same passphrase again: (dito)
Your identification has been saved in uucp.key.
Your public key is:
1024 33 133903226487936036068107189442272513503126890581198060504786340415583155492058067019690939110609705800820957393827530238990873660654263685410407615469487066793865888759452753694644416994810962105715588754062698419817473439169059018673200810315317349095664304155285481483471933905819513462779551854638227029159 mw@theatre.sax.de
Your public key has been saved in uucp.key.pub
mw@theatre:/home/mw 679 $

In diesem Fall enthält die Datei uucp.key (im Verzeichnis .ssh des angemeldeten Benutzers) den privaten Schlüssel und uucp.key.pub den öffentlichen Schlüssel. Der private Schlüssel muß künftig für den Benutzer, der die verschlüsselte UUCP-Verbindung initiiert, erreichbar sein (Zugriffsrechte des Dateisystems entsprechend gesetzt bzw. Datei an geeignete Stelle gelegt, wie z. B. home directory des Benutzers). Den öffentlichen Schlüssel schickst Du per E-Mail an die Mailadresse uucpovip@sax.sax.de - von da wird sie automatisch an einen Verantwortlichen weitergeleitet. Zum Zeitpunkt der letzten Änderung dieses Dokuments ist das der Autor. Der UUCP-over-IP maintainer auf sax.sax.de muß nun den Schlüssel als zulässigen solchen eintragen und wird dich informieren, wenn er das getan hat.

Wenn der Schlüssel eingetragen ist, kannst Du künftig eine verschlüsselte Verbindung als SSH-Tunnel starten:

/usr/local/bin/ssh -f -l uucpovip -L 43721:sax.sax.de:540 -C sax.sax.de
/usr/libexec/uucp/uucico -S sax --nodetach

Die lokale Port-Nummer (hier 43721) muß einen freien TCP-Port bezeichnen. Auf einem Unix-System kann dieser Port durch eine Anwendung grundsätzlich bereits belegt werden, es sollte also vorher geprüft werden, ob der Port verwendbar ist. Dummerweise erwartet uucico diese Angabe in der Konfigurationsdatei für UUCP-Systeme (sys) und mensch sollte sich einen Port aussuchen, der immer frei ist. Daß kann ein unbenutzter privilegierter Port sein für einen Server-Dienst, den man lokal nicht benutzt (vgl. /etc/inetd.conf und /etc/services). Ein bei dem SSH-Aufruf eventuell zur Ausführung auf sax.sax.de angegebenes Kommando wird ignoriert. Die Verbindung wird für mindestens 10 Sekunden seitens sax offen gehalten und danach beendet, wenn sie nicht benutzt wird. Wenn sie benutzt wird, endet sie nach Ende der Benutzung.

3. Weitere Informationen

3.1. Informationen auf sax.sax.de

man pages auf sax.sax.de:

Info-Seiten über UUCP auf sax.sax.de ("info uucp")

3.2. Informationen im Rest der Welt

4. Sonstiges

4.1. Quellen

Als Quellen wurden ie unter 3.1. genannten manual pages (SSH) und GNU info Dokumente (UUCP) verwendet.

4.2. Danksagungen

Mein Dank geht an die Autoren der verwendeten Software für eine hervorragende Leistungen, an die an der Entwicklung von FreeBSD beteiligten Programmierer, an Christoph Weisgerber, Fernando Sapachnik und insbesondere einmal mehr an Jörg Wunsch als denjenigen, der wieder mal die letzten offenen Fragen beim Verständnis der SSH geklärt hat.

4.3. Copyright

Das geistige Eigentum an diesem Dokument verbleibt beim Autor. Eine Veröffentlichung auf anderem Wege als dem WWW-Server des Verein zur Förderung der privat betriebenen Datenkommunikation SaxNet e. V. in Dresden (http://www.sax.de/) erfordert ausdrücklich in jedem Fall die Zustimmung des Autors.