TCP/IP Dienste
Willemers Informatik-Ecke
Die Inhalte dieser Seite sind inzwischen etwas überholt. Der inet-Dämon wird in heutigen Systemen nicht mehr verwendet. FTP ist zwar noch im Einsatz, wird aber schon oft durch sftp ersetzt. Telnet wird meist nur zum Testen von textorientierten Protokollen verwendet und die r-Kommandos sind vollständig durch die SSH-Tools ersetzt worden. Die Verwendung der SSH-Tools werden unter www.willemer.de/srvlinux/ssh.htm in der aktuellen Version erklärt.
TCP/IP bietet eine Vielfalt von Diensten. Der Umfang wird bereits deutlich, wenn man einmal die Datei /etc/services überfliegt. In diesem Abschnitt werden die prominentesten von ihnen vorgestellt.

inet-Dämon

inetd reduziert die Zahl der Dämonen

Die meisten Serverprozesse einer UNIX-Maschine werden relativ selten benötigt. Soll deren Dienst aber angeboten werden, muss ein Prozess ständig den Port abhorchen, ob Anfragen vorliegen. Jeder dieser Prozesse benötigt Hauptspeicher. Zwar wird der Prozess bei Inaktivität bald in den Swapbereich verschoben, aber auch dieser ist nicht unerschöpflich. Zur Lösung dieses Problems gibt es den Internet-Dämon, der mehrere Ports parallel abfragt und sobald auf einem dieser Ports eine Anfrage vorliegt, den entsprechenden Server startet.

/etc/inetd.conf

Gesteuert wird inetd durch die Datei /etc/inetd.conf. Hierin stehen die überwachten Dienste und die zugehörigen Serverprogramme. Jede Zeile hat den folgenden Aufbau:

Name  Typ  Protokoll  Wartestatus  UserID  Server  Argumente

Dabei bedeuten

Name
Name des Dienstes wie er in der /etc/services steht.
Typ
stream, dgram, oder raw
Wartestatus
Hier kann wait oder nowait stehen. Es legt fest, ob eine neue Anfrage des Dienstes wartet, bis die vorherige Anfrage ausgeführt ist. Dies würde die die Parallelität der Anfragen beschränken.
UserID
meist ist die UserID, unter der der Dämon läuft root. Bei finger beispielsweise nobody.
Server
Dateiname inkl. Pfad des Serverprozesses
Argumente
Kommandozeile des Serveraufrufs

Hier als Beispiel die Auszüge aus der inetd.conf für ftp und telnet:

ftp     stream  tcp    nowait  root   /usr/sbin/tcpd  in.ftpd
telnet  stream  tcp    nowait  root   /usr/sbin/tcpd  in.telnetd

Dienst stoppen durch Auskommentieren

Will man aus Sicherheitsgründen keinen Zugang für telnet oder ftp, reicht es aus, den Eintrag in der inetd.conf mit einem Hashzeichen (#) auszukommentieren. Änderungen in der inetd.conf liest der inetd ein, wenn man ihm das Signal SIGHUP sendet.

gaston# ps -ax | grep inetd
  566 ?        S      0:00 /usr/sbin/inetd
gaston# kill -SIGHUP 566

File Transfer Protocol (FTP)

Dateitransfer, nicht Verzeichnisdienst

Wie der Name sagt, dient FTP dem Übertragen von Dateien. Es ist aber nicht ein Verzeichnisdienst wie NFS oder im PC-Bereich Novell oder NT-Server, bei dem der Verzeichnisbaum des entfernten Rechners in den eigenen Baum eingebunden wird. Beim FTP werden einzelne Dateien explizit per Befehl übertragen.

Der Client

Login

Für FTP gibt es einige Clients mit einer grafischen Oberfläche. Hier soll aber das Kommandozeilentool ftp mit seinen Kommandos interessieren. Den FTP-Client startet man es unter Angabe der Internetnummer oder des Hostnamen. Es führt zunächst einen normalen Login aus. Der Anwender wird also aufgefordert, Benutzernamen und Passwort einzugeben. Danach ist man auf dem fremden Rechner angemeldet und erhält einen eigenen ftp-Prompt.

silver> ftp gaston
Connected to gaston.willemer.edu.
220 gaston.willemer.edu FTP server (Version 6.5/OpenBSD, linux port 0.3.2) ready.
Name (gaston:arnold): arnold
331 Password required for arnold.
Password:
230- Have a lot of fun...
230 User arnold logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
silver>

Kommandos

Vom ftp-Prompt kann man wie auf einer Shell verschiedene Kommandos geben.

Daneben kennt ftp noch eine Reihe von Kommandos, die man natürlich in der Manpage findet. Letztlich reichen die vorgestellten Kommandos, um so ziemlich jeder Situation gewachsen zu sein.

time out

Eine Sitzung, über die keine Daten mehr fließen, wird nach 900 Sekunden automatisch beendet.

Mit der Option -P kann ein anderer Port angesprochen werden. Das ist besonders wichtig bei dem Zugriff über Proxies.

Automatisieren des Einloggens

~/.netrc

In manchen Fällen soll der Austausch von Dateien automatisiert werden, also beispielsweise durch Programme oder Skripten gesteuert und auch zeitversetzt durch cron oder at gestartet werden. In solchen Situationen stört die Passwortnachfrage. Durch eine Datei namens .netrc im Heimatverzeichnis kann das Einloggen automatisiert werden. Dabei enthält diese Datei in jeder Zeile die Einträge:

Host    Benutzerkennung   Passwort

Zuerst wird der Host angegeben. Wird dieser Host als Argument des ftp genannt, gilt diese Zeile. Es wird dann automatisch die angegebene Benutzerkennung verwendet und nicht wie sonst, die gleiche, die auf dem lokalen Rechner verwendet wird. Der Eintrag des Passworts ist optional. Ist ein Passwort eingetragen, muss die Datei mit chmod auf 600 gestellt werden. Sie darf also von niemandem gelesen werden können außer dem Besitzer.

Anonymes ftp

Die ftp-Server im Internet erfordern üblicherweise keine Zugangsberechtigung, sondern lassen das so genannte anonyme ftp zu. Dazu meldet man sich mit anonymous an. Als Passwort pflegt man die eigene E-Mail Adresse anzugeben.

Konfiguration des ftp-Servers

Der tandardmäßig auf jedem UNIX System vorzufindende ftp-Server heißt ftpd und wird normalerweise über den inetd gestartet. Man kann ihn aber auch als Dämon aus den rc-Dateien starten. Dann muss ftpd allerdings mit der Option -D aufgerufen werden.

Abklemmen des ftp-Servers

Da ein ungeschützter ftp-Zugriff durchaus sicherheitskritisch ist, kann der Zugang beschränkt werden. Man kann durch Auskommentieren des ftp-Dienstes in der inetd.conf den FTP komplett abschalten.

Abschalten mit Begründung

Existiert eine Datei namens /etc/nologin, wird diese einem Client angezeigt und dann der Zugriff verweigert. Dies ist ideal für kurzfristig abgeschaltete ftp-Zugänge oder wenn man auf einen anderen Rechner verweisen will.

Benutzerausschluss

Einzelne Benutzer können ausgeschlossen werden, indem man sie in der Datei /etc/ftpusers aufführt. Trotz der anders lautenden Intention stehen hier die Anwender, die keinen Zugriff auf den ftp-Server haben sollen.

Anonymer ftp-Server

Der normale ftp-Zugang erfolgt über das Anmelden als Benutzer des Systems. Im Internet gibt es viele ftp-Server, die öffentlich Dateien zur Verfügung stellen. Man spricht von anonymem ftp, weil man sich mit der Kennung >>anonymous<< anmeldet und seine E-Mailadresse als Passwort eingibt. Letzteres ist allerdings freiwillig und nicht zwingend.

Ein Rechner kann nur entweder ein anonymes oder reguläres ftp anbieten. Ist ein anonymer Server aktiv, kann man sich nicht mehr über das normale ftp einwählen. Ein solcher Zugriff wird abgewiesen mit dem Hinweis, dass nur anonymes ftp zugelassen ist.

Der Benutzer ftp

Um ftpd als anonymen Dienst zu starten, wird der ftp-Dämon in der inetd.conf oder in der rc-Datei mit der Option -A gestartet. Es muss außerdem ein Benutzer namens ftp auf dem System existieren. Beim Login als >>anonymous<< werden die Benutzer in dessen Heimatverzeichnis gesetzt. Dort wird intern ein chroot aufgerufen, der verhindert, dass der Benutzer andere Bereiche des Verzeichnisbaums erreichen kann.

# /etc/inetd.conf
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -A
#

Es gibt noch andere FTP-Server, wie beispielsweise der WuFTP-Server, der vor allem sicherheitskritische Einstellungen ermöglicht.

TFTP, schnell und vertrauensvoll

Das Trivial File Transfer Protocol wird auch manchmal Trusted FTP genannt. Der Grund liegt darin, dass es keine Authentifizierung verlangt. Der Zugriff ist nur auf Dateien erlaubt, deren Rechte auf dem System den Zugriff für alle erlauben.

Auf den meisten Systemen ist TFTP in der inetd.conf abgeschaltet. Seine Hauptbedeutung erlangte TFTP im Zusammenhang mit Workstations, die keine eigene Festplatte besaßen, den >>diskless workstations<<. Diese haben per TFTP ihre Grunddaten von anderen Maschinen bezogen. Heutzutage findet man selten solche Geräte und aus Sicherheitsaspekten ist TFTP wenig ratsam.

Der größte Unterschied zu FTP ist eigentlich in der Realisierung. TFTP basiert auf udp, während FTP ein tcp Dienst ist.

Terminaldienst (telnet)

Mit dem Programm telnet kann man eine Terminalsitzung über das Netz auf einem fernen Rechner aufbauen. Aus Sicht des Anwenders unterscheidet sich solch eine Sitzung kaum von einer Terminalsitzung.

telnet überträgt im Klartext.

Da telnet alle Tastendrücke und Bildschirmausgaben direkt über das Netz überträgt, werden auch Passwörter im Klartext über das Netzwerk übertragen. In sicherheitskritischen Umgebungen werden darum Zugriffe per telnet ausgeschlossen. Statt dessen wird ssh (secure shell) verwendet, das die gleiche Leistung bringt, nur dass die übertragenen Daten verschlüsselt werden.

telnet-Client

Als Argument wird \verb+telnet+ die Internetnummer oder der Hostname des Zielrechners angegeben. Auf dem Zielrechner wird ein login wie bei einem normalen Terminal gestartet. Nach der erfolgreichen Anmeldung wird auf dem Zielrechner eine Shell eröffnet und der Benutzer kann so arbeiten, als hätte er eine Terminalsitzung auf der fremden Maschine eröffnet.

Funktionstasten unzuverlässig

telnet leidet unter dem gleichen Problem wie die Terminals, nämlich dass die Terminalemulationen leider auf den Funktionstasten immer wieder versagen. In vielen Fällen werden Terminals emuliert, die gar keine Funktionstasten hatten, als sie gebaut wurden. Wie beim Terminal auch, wird die Terminalemulation über die Umgebungsvariable TERM und die Einträge in der termcap oder der terminfo gesteuert.

Testen textorientierter Server

Mit telnet kann man sehr gut textorierentierte Protokolle testen, wie sie von den meisten Internet-Services verwandt werden (beispielsweise HTTP oder NNTP). Beim Aufruf wird hinter dem Hostnamen als weiterer Parameter die Portnummer des Services angegeben und man sieht die Meldungen des Servers im Klartext. Man kann Antworten und so das Protokoll verfolgen.

Die Sitzung wird durch das Ausloggen auf dem fremden Rechner beendet.

telnet-Dämon

/etc/securetty

In der Datei /etc/securetty wird hinterlegt, welche Terminals so sicher sind, dass sich auch der Anwender root dort einloggen darf. Im Normalfall werden dort die virtuellen Terminals, die telnet verwendet dort nicht aufgeführt. Aus diesem Grund ist es meist nicht möglich, sich als root per telnet direkt anzumelden. Statt dessen verwendet der Administrator eine >>zivile<< Kennung und wechselt per su zum root.

Abschalten des Dämons

Auch der telnet-Server wird über den inetd gestartet. Dementsprechend gibt es auch einen Eintrag in der inetd.conf. Soll es keinen Zugriff per telnet auf die Maschine mehr geben, wird der Eintrag einfach auskommentiert, indem ein # an den Anfang der Zeile gesetzt wird.

r-Kommandos

Da das ständige Authentifizieren beim Anmelden innerhalb eines LANs (Local Area Network) in der Praxis sehr störend ist, gibt es die Möglichkeit, direkt auf die ferne Maschine zuzugreifen. Dabei erteilt der Anwender einem Benutzer einer anderen Maschine die Berechtigung, seinen Zugang zu benutzen. Er erteilt diese Berechtigung, indem er eine Datei namens .rhosts anlegt und in ihr die Computer und Benutzer aufzählt, die ein direktes Zugriffsrecht über die Kommandos rcp, rlogin und rsh haben sollen.

Die Befehle fragen nach der korrekten Konfiguration nicht mehr nach dem Passwort. Wie immer stehen Bequemlichkeit und Sicherheit umgekehrt proportional zueinander. Darum sind diese Protokolle auch sinnvollerweise im LAN und nicht im Internet einzusetzen. Die drei r-Kom­man­dos rcp (remote copy), rsh (remote shell) und rlogin (remote login) entstammen dem BSD und sind auf allen UNIX-Derivaten zu finden.

Die Datei .rhosts und hosts.equiv

~/.rhosts

Die r-Kommandos sollen Anwendern, die auf zwei Hosts ein Benutzerkonto haben, erlauben, sich selbst den direkten Zugang zu den eigenen Ressourcen auf dem anderen Rechner zu erlauben. Dazu legt man im Wurzelverzeichnis des eigenen Heimatverzeichnisses eine Datei namens .rhosts an. Sie darf nur für den Besitzer schreib- und lesbar sein. In dieser Datei stehen die Namen der Rechner, von denen ein Zugriff über rlogin, rcp oder rsh auf diesen Rechner erlaubt sein soll.

Da der Anwender vielleicht einen anderen Benutzernamen auf dem fremden Rechner haben könnte, ist es auch möglich, hinter dem Rechnernamen noch eine Anwenderkennung aufzuführen. Jeder eingetragene Benutzer darf von dem fremden Rechner ohne Passwort auf dem lokalen Rechner einloggen und darf frei Daten hin und her kopieren.

/etc/hosts.equiv

Alternativ kann der Systemadministrator in der Datei /etc/hosts.equiv Maschinen aufführen, denen er eine pauschale Gleichstellung bzgl. rlogin und rcp einräumen möchte. Dabei werden auch die Drucker freigegeben. Auch diese Datei darf nur Schreib- und Leserecht für den Besitzer haben und muss root gehören. Eine solche pauschale Freischaltung wird aber normalerweise nur dann gemacht, wenn beispielsweise mit zwei parallelen Servern gearbeitet wird oder wenn man im privaten Netz ohne Internetzugang arbeitet. Beispiel für eine /etc/hosts.equiv:

+gaston willemer
+idefix
+ pm7500
+@awfriends

Die erste Zeile erlaubt dem Anwender willemer auf gaston den freien Zugriff ohne Passwort. In der zweiten Zeile wird allen Anwendern von idefix der freie Eintritt gestattet.

Die dritte Zeile enthält einen gravierenden Fehler: Hier steht ein Leerzeichen zwischen dem Plus und dem pm7500. Das einzelne + wird so interpretiert, dass jeder(!) Rechner freien Zugriff hat. Dass der alleinstehende pm7500 dieses Recht auch hat, versteht sich dann von selbst.

In der vierten Zeile wird der Netzgruppe awfriends ein solcher Zugriff eingeräumt. Sie muss in der Datei /etc/netgroup definiert sein.

In allen Fällen müssen die Rechnernamen natürlich in der /etc/hosts stehen oder durch einen Namensdienst aufgelöst werden.

Das Sicherheitsproblem

Das Risiko liegt nicht in erster Linie darin, dass neben dem Administrator auch Benutzer Rechte weitergeben können. Denn letztlich ist das Eintragen eines Rechnernamens in der .rhosts immer noch wesentlich besser als die Weitergabe des Passwortes. rlogin hat sogar gegenüber telnet den Vorteil, dass das Passwort bei der Kommunikation nicht über das Netz geht. Es kann also nicht abgehört werden. Das kleinere Problem besteht darin, dass wenn ein Zugang des Benutzers geknackt ist, die anderen Zugänge auch offen sind. Das hört sich schlimmer an als es ist. Normalerweise verwendet der Benutzer auf verschiedenen Rechnern des LAN vermutlich sowieso die gleichen Passwörter und wenn der Eindringling einen Zugang kennt, kennt er alle. Problematischer ist der Angriff mit einer gefälschten IP-Nummer. Ist in der .rhosts ein Notebook oder ein Rechner eingetragen, der nicht ständig im Netz steht, kann ein Angreifer seinerseits mit einem Notebook mit eben dieser IP-Nummer ins Netz gehen und sich direkt einloggen ohne das Passwort zu kennen.

Remote Copy (rcp)

Das Programm rcp soll das Kopieren über Rechnergrenzen hinweg mit der Einfachheit eines normalen Kopierbefehls realisieren. Der Syntax ist sehr eng an den cp angelegt.

rcp Optionen  Quelle   Ziel

Lediglich die Argumentbeschreibung ist etwas verändert. Ist Quelle oder Ziel auf einem anderen Rechner, wird vor den Pfadnamen der Rechnername gefolgt von einem Doppelpunkt gesetzt. Dies kann sowohl bei der Quelle als auch beim Ziel erfolgen. Werden bei Quelle und Ziel fremde Rechner angegeben, ist rcp so clever zu erkennen, dass es effizienter ist, die Kopie direkt zwischen den beiden Rechnern auszutauschen, ohne den Umweg über den Auftraggeber zu gehen.

rcp idefix:/etc/hosts* ./test

Mit diesem Befehl werden vom Rechner idefix alle Dateien, die auf die Maske /etc/hosts* passen, an das im aktuellen Verzeichnis liegende test kopiert. test muss natürlich ein Verzeichnis sein, da zu erwarten steht, dass der Befehl mehrere Dateien kopieren wird. Werden die Dateien auf dem fremden Rechner nicht mit vollständigem Verzeichnis angegeben, wird vom Heimatverzeichnis auf der anderen Seite ausgegangen.

Server ist rshd

rcp verwendet als Serverdienst den rshd, also eine Remote Shell. Über diese wird auf der Gegenstation der rcp-Client aufgerufen, mit dem die eigentliche Übertragung stattfindet. Es gibt also keinen rcpd.

rlogin

Terminalsitzung

Per rlogin eröffnet man eine Terminalsitzung auf dem fremden Rechner unter der eigenen Benutzerkennung. Voraussetzung ist hier, dass der einloggende Benutzer auf der fremden Maschine ebenfalls eine Benutzerkennung besitzt und die Datei .rhosts auf dem fremden Rechner den aktuellen Computer eingetragen hat. In diesem Fall wird kein Kennwort und kein Passwort ausgetauscht und damit kann es auch nicht abgehorcht werden. Versucht man einen rlogin auf einen nicht entsprechend vorbereiteten Rechner, wird rlogin davon ausgehen, dass die Kennung die gleiche ist wie auf dem aktuellen Rechner und das Passwort für die Zielmaschine anfordern.

Rechnernamen als rlogin

Man kann das Einloggen auf eine fremde Maschine noch weiter vereinfachen, indem man einen Link von rlogin erstellt und dem Link den Namen eines Rechners gibt. rlogin prüft beim Aufruf, ob es unter einem anderen Namen aufgerufen wurde und verwendet dann diesen Namen als Zielmaschine.

silver> ln -s `which rlogin` gaston
silver> gaston
Last login: Thu Mar 21 09:52:09 from gaston.willemer.edu
Have a lot of fun...
gaston>

In der ersten Zeile wird ein symbolischer Link von dem Dateinamen gebildet, den der Befehl which liefert, mit dem Ziel gaston. Dieser zeigt dann auf den vollständigen Pfad von rlogin. Nun kann man gaston aufrufen. Über den symbolischen Link wird rlogin gestartet. Das Programm rlogin stellt fest, dass der Name unter dem es gerufen wurde, gaston lautet und verbindet zu gaston.

Befehlsausführung (rsh, rcmd und rexec)

Das Programm rsh dient dazu, ein Kommando auf einem fremden Rechner ausführen zu können. Auf einigen Systemen hat rsh den Namen rexec. SCO nennt den Befehl rcmd (remote command). Der Name rsh ist hier für die restricted shell, einer lokalen Shell mit eingeschränkten Rechten vergeben.

rsh host Befehl

rsh versus rlogin

Gegenüber rlogin hat rsh seine Vorteile, wenn Skripten oder einzelne Programme auf anderen Maschinen Prozesse gestartet werden sollen. Das kann beispielsweise im Zusammenhang mit einer Fernsteuerung der Fall sein. Auch wenn ein Login aufgrund begrenzter Lizenzen ein weiteres Mal nicht möglich ist, kann man noch ein paar Abläufe starten.

Mit der Option -l kann der Benutzer angegeben werden, unter dessen Kennung der Befehl ausgeführt werden soll.

Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru
und dem Nachfolgebuch
Arnold Willemer: UNIX - Das umfassende Handbuch