Aufbau eines FTP-Servers

> Linux Netzwerke

> > # Aufbau eines FTP-Servers

> > Das File Transfer Protocol (FTP) ist wie die anderen Internet-Protokolle ein Client/Server Protokoll. Der Aufbau eines FTP-Servers geschieht in der Regel über den Aufruf mit dem inetd. In der Datei /etc/inetd.conf steht also eine Zeile wie:

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

> > oder um einen andren FTP-Server zu benutzen statt in.ftpd dann zum Beispiel den wu.ftpd:

> >       ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  wu.ftpd -a

> > Grundsätzlich wird zwischen realem und anonymen FTP unterschieden. Reales FTP erfordert einen gültigen Usernamen und das dazu passende Passwort. Anonymes FTP ist mit verschiedenen Usernamen (Meist ftp, guest oder anonymous) möglich, ohne dass ein passwort gebraucht wird. Meist verlangt der FTP-Server bei anonymen FTP die E-Mail Adresse des Users als Passwort, er hat aber keine Möglichkeit, die Gültigkeit dieser Adresse zu überprüfen.

> > Wenn dem FTP-Daemon beim Start der Parameter -a mitgegeben wurde (siehe Beispiel oben), so benutzt er die Datei /etc/ftpaccess um den Zugriff auf FTP zu überprüfen. In dieser Datei werden verschiedene Einträge gemacht, die den Zugriff via FTP regeln.

> > Die Datei `/etc/ftpusers` enthält eine Liste der User, die sich nicht über ftp einloggen dürfen. Hier steht meistens root und die ganzen Verwaltungsuser wie bin, daemon, nobody, uucp.

> > ### Reales FTP

> > Wenn ein FTP-Server als Usernamen einen realen Namen bekommt, so frägt er anschließend nach dem Passwort, überprüft, ob das Passwort richtig ist (über /etc/shadow) und ob der User nicht in der Datei /etc/ftpusers steht. Falls alles in Ordnung ist, bekommt der User Zugriff auf sein reales Home-Verzeichnis (meist /home/username) und kann mit seinen normalen Zugriffsrechten arbeiten.

> > ### Anonymes FTP

> > Wesentlich komplexer stellen sich die Tatsachen bei anonymen FTP dar. Erhält der FTP-Server den Usernamen ftp, guest oder anonymous, so überprüft er, ob der User ftp in der Datei /etc/passwd existiert und welches Heimatverzeichnis dort für ihn angegeben ist. Falls dieser User existiert (auch mit einem * im Passwortfeld der /etc/shadow) dann wechselt der FTP-Server ins angegebene Heimatverzeichnis (Meist /usr/local/ftp). Er ruft aber dann ein chroot auf und macht damit dieses Heimatverzeichnis zur Wurzel des gesamten Accounts. Das heißt, der FTP-User sieht nur dieses Verzeichnis, wenn er ein "cd /" ausführt kommt er nicht auf die reale Wurzel des Systems sondern nur in das angegebene Heimatverzeichnis von ftp.

> > In diesem Verzeichnis muß aber dann auch mindestens ein Verzeichnis bin, etc, usr, usr/bin, lib, dev existieren. Diese Verzeichnisse enthalten den minimalen Bestand dessen, was der User zum arbeiten braucht. In der Regel enthalten die Distributionen bereits einen solchen vorbereiteten Verzeichnisbaum. Dort gibt es dann wiederum auch das Verzeichnis pub, das die zu übertragenden Dateien und meist weitere Unterverzeichnisse enthält.

> > Wenn in einem dieser Verzeichnisse eine Datei mit Namen `.message` existiert, so wird diese Datei beim Wechsel in dieses Verzeichnis angezeigt.

> > ### Die Datei /etc/ftpaccess

> > Diese Datei enthält bei modernen FTP-Servern die Definitionen von Zugriffsrechten bei FTP-Zugriff. Das Hauptkonzept liegt hier in der Bildung von Klassen, die bestimmte Rechte haben. Diese Klassen bestehen aus verschiedenen Rechnern bzw. Domains oder bestimmten Netzen. Um eine Klasse zu definieren wird der Befehl class benutzt. Er hat folgende Syntax:

> >       class  Klassenname  Typliste Adressmuster

> > Dabei steht Typliste für eine mit Kommas getrennte Liste der Begriffe anonymous, guest und real. Wenn eine Klasse den Begriff real in der Typliste hat, so können User der entsprechenden Rechner sich mit ihrem echten (realen) Usernamen einloggen und haben Zugriff auf ihr Homeverzeichnis. Ist der Begriff anonymous dort zu finden, so können User der entsprechenden Rechner sich anonym anmelden und haben damit Zugriff auf den anonymen FTP Bereich. Ist das Wort guest vorhanden, so kommen die Regeln der guestgroup (siehe unten) zur Anwendung.

> > Das Adressmuster besteht aus einem mit den Platzhaltern *, ? und [] bestückten Ausdruck, der entweder eine IP-Adresse oder einen Domainnamen bildet. Es dürfen auch mehrere Muster hintereinander stehen.

> > Beispiele:

> >       # Alle User der Rechner aus den Netzen, die mit 10.230. anfangen können
> >       # sich mit realem Namen einloggen. Sie bilden die Klasse "lokal"
> >       class lokal	real			10.230.*

> >       # Alle User aller Rechner haben Zugriff auf anonymes FTP. Wenn sie sich
> >       # mit realem Namen einloggen, so unterliegen sie den Einschränkungen
> >       # der guestgroup. Die Klasse heißt "alles"
> >       class alles   anonymous,guest		*

> > Weitere Befehle in der Datei ftpaccess, die sich auf die Klassen beziehen sind:
> > autogroup Gruppenname Klasse
> >   Wenn ein ANONYMOUS User Mitglied der genannten Klasse ist, dann bekommt er eine Mitgliedschaft in der genannten Gruppe (eine gültige Gruppe aus /etc/group). Damit ist es möglich verschiedene Berechtigungen auf Dateien mit User/Gruppen Leseberechtigung zu geben, jenachdem von welchem Rechner sich der User eingeloggt hat.
> > limit Klasse Anzahl Zeit Message-Datei
> >   Schränkt die gleichzeitige Anzahl der FTP-User der Klasse auf das genannte Maß ein. Ein Anzahl-Wert von -1 bedeutet unbeschränkt. Das Zeitfeld kann die Werte ANY (immer) oder eine Konstruktion wie Mo-Fr0800-1700 enthalten. Dabei gelten die englischen Wochentagsabkürzungen Mo, Tu, We, Th, Fr, Sa und Su.
> > Füd den Zugriff einer Klasse, die den guest im Typfeld hat kommt der Befehl guestgroup zum tragen:
> > guestgroup Gruppenname
> >   Wenn ein Realer User ein Mitglied der genannten Gruppe ist, dann wird die Sitzung als anonymes FTP gestartet. D.h. der User hat keinen Zugriff auf die Wurzel des Systems. Stattdessen bekommt er sein Homeverzeichnis als Wurzel. Dabei kann der Eintrag des Homeverzeichnisses in /etc/passwd zwei Einträge enthalten, die durch ein /./ getrennt werden. Der erste Eintrag ist sein HomeVerzeichnis und damit die zukünftige Wurzel, das zweite Verzeichnis ist ein Verzeichnis innerhalb seines Homeverzeichnisses, in dem er startet. Sieht der passwd-Eintrag beispielsweise so aus:

> >       gast1:x:1012:100:Gast Account:/ftp/./incoming:/bin/false

> >   dann startet der FTP-Daemon die Sitzung mit dem Verzeichnis /ftp als Wurzel und dem Verzeichnis /ftp/incoming als Startverzeichnis.

> > Mit dem Befehl noretrieve können bestimmte Dateien grundsätzlich geschützt werden:

> > noretrieve Datei1 Datei2 Datei3
> >   Die Übertragung der genannten Dateien wird grundsätzlich verboten. Beginnt der Dateiname mit einem Slash, so wird genau diese Datei verboten, beginnt er nicht mit einem Slash, so werden alle Dateien diess Namens, egal wo, verboten.
> > Um Informationen an den FTP-User weiterzugeben gibt es folgende Befehle:
> > email E-Mail Adresse
> >   Die E-Mailadresse des FTP-Verwalters. Sie wird später mit der %E Substitution benutzt.
> > message Datei Wann Klasse
> >   Die genannte Datei wird dem User als Botschaft übermittelt wenn der Begriff Wann wahr ist. Dabei kommen für Wann entweder LOGIN oder CWD=Verzeichnis in Frage. Login bedeutet nach dem Login, CWD=Verzeichnis meint beim Wechsel in das angegebene Verzeichnis.

> >   Die Datei darf folgende Substitutionen enthalten:

> >   Substitution | Bedeutung
> >   --- | ---
> >   %T | Lokale Zeit in der Form Thu Nov 15 17:12:42 1990
> >   %F | Freier Platz der Partition in Kilobyte
> >   %C | Aktuelles Verzeichnis
> >   %E | Die E-Mail Adresse des FTP-Administrators
> >   %R | Remote Hostname
> >   %L | Lokaler Hostname (des FTP-Servers)
> >   %U | Username
> >   %M | Maximale Anzahl der erlaubten Verbindungen der Klasse
> >   %N | Aktuelle Zahl der Verbindungen der Klasse

> > banner Datei
> >   Wie message, nur wird die Datei vor dem Einloggen dargestellt. Der Pfad zur Datei muß absolut sein.

> > Auch bei FTP-Servern können virtuelle Hosts benutzt werden, die aber - im Gegensatz zu Apache-Webservern - tatsächlich eigene IP-Adressen benötigen. Das ist weiter kein Problem, weil Linux in der Lage ist, einer Ethernetschnittstelle mehrere Adressen zuzuweisen. Der Befehl dazu lautet virtual und hat drei Aufrufformen:

> > virtual Adresse root Pfad
> >   Legt den Pfad für den virtuellen Server mit der genannten Adresse fest. Das entspricht dann dem Pfad, der alle notwendigen Verzeichnisse enthält.
> > virtual Adresse banner Bannerdatei
> >   Die Bannerdatei, die beim Einloggen gezeigt werden soll.
> > virtual Adresse logfile Logdatei
> >   Falls der virtuelle Server eine andere Logdatei nutzen soll als der normale Server. Falls dieser Befehl fehlt, wird die normale Logdatei verwendet.

> > [ Kurs Hauptseite ] [ Linux-Kurse ] [ Startseite Linux-Praxis ]

> > © 1999, 2000, 2001 by F. Kalhammer