Bewertung 2


Die Kandidaten sollten in der Lage sein, einen FTP-Server mit anonymen Zugriff zu konfigurieren. Dieses Lernziel beinhaltet die Konfiguration eines FTP-Servers für das Zulassen von anonymen Uploads, das Angeben zusätzlicher Vorsichtsmaßnahmen bei Zulassen anonymer Uploads, die Konfiguration von Gastbenutzern und -gruppen mit chroot-Umgebungen und die Konfiguration von ftpaccess, um benannten Benutzern oder Gruppen den Zugriff zu verweigern.

Schlüsseldateien, Begriffe und Hilfsmittel beinhalten:

  • ftpaccess, ftpusers, ftpgroups
  • /etc/passwd
  • chroot

Einrichten von FTP-Servern für persönliches FTP

Sobald der FTP-Server wu.ftpd installiert ist und die Zeile

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

in der Datei /etc/inetd.conf eingetragen und aktiviert (inetd neu starten oder HUP-Signal schicken) ist, können sich User mit ihrer normalen Unix-Kennung per FTP einloggen. Dazu müssen prinzipiell folgende Voraussetzungen erfüllt sein: Der User muß dem System bekannt sein In der Datei /etc/passwd muß der User einen gültigen Eintrag haben und er muß ein dazu passendes Passwort besitzen. Das Passwort darf nicht leer sein. Der Username darf NICHT in der Datei /etc/ftpusers stehen Die Datei /etc/ftpusers dient dazu, bestimmte User vom FTP-Verkehr auszuschließen. In der Regel sind die verschiedenen Verwaltungsuser (bin, daemon, …) hier genannt. Einzelne User können so ausgeschlossen werden. Der User muß eine eingetragene Standardshell haben Die Shell kann allerdings auch z.B. /bin/false sein, mit der dann zwar FTP, aber kein normales Einloggen möglich ist.

Weitere Einschränkungen können später in der Datei /etc/ftpaccess eingerichtet werden.

Grundsätzlich gilt, daß ein über FTP eingeloggter User die selben Rechte auf Verzeichnisse und Dateien hat, als wäre er normal eingeloggt. Er kann also in Verzeichnissen, in denen er Schreibrechte besitzt, Dateien anlegen und löschen, er kann sich durch das System bewegen usw.

Einrichten von FTP-Servern für anonymes FTP

Die zweite Methode für FTP ist das sogenannte anonyme FTP. Hier liegt die Sache etwas anders, als beim perönlichen FTP, weil ein anonymer User keine Rechte auf irgendwelche Verzeichnisse bekommen sollte.

Um sich anonym einzuloggen wird beim Login der Username „ftp“ oder „anonymous“ eingegeben. Der Server frägt jetzt nach einem Passwort, aber hier kann alles eingegeben werden. Traditionell verlangen die Server die E-Mail_Adresse als Passwort, können aber natürlich deren Echtheit nicht überprüfen. Web-Browser wie Netscape oder MSIE loggen sich grundsätzlich anonym bei FTP-Servern ein, es sei denn, in der URL wäre ein Username und Passwort angegeben worden.

Ein anonymer Eingang wird dadurch realisiert, daß dem Unix-System der User ftp angefügt wird. Sein Heimatverzeichnis ist ein Verzeichnis, irgendwo im Verzeichnisbaum, in dem er eine sogenannte chroot-Umgebung vorfindet.

Eine chroot-Umgebung bedeutet, daß der FTP-User dieses Verzeichnis als Wurzel des Systems zu sehen bekommt. Er kommt nicht weiter, als zu eben dieser Wurzel, d.h., daß er nur einen Bruchteil der realen Festplatten zu sehen bekommt.

Lautet der Eintrag in /etc/passwd z.B.

  ftp:x:40:2:ftp account:/usr/local/ftp:/bin/bash

so wechselt dieser User nach dem erfolgreichen Login mit Username ftp oder anonymous in das Verzeichnis /usr/local/ftp und dieses Verzeichnis wird zur Wurzel des Systems. Damit das aber funktioniert müssen auf diesem Verzeichnis einige Unterverzeichnisse stehen, die es auf der echten Wurzel auch gibt, damit das Unix-System überhaupt funktioniert. Das Verzeichnis bin Dieses Verzeichnis muß root gehören und darf von niemandem beschreibbar sein. Es muß mindestens das Programm ls darin liegen, damit der FTP-User den Inhalt von Verzeichnissen ansehen kann. Das ls-Programm sollte das Zugriffsrecht 111 besitzen. Vorsicht. Das ls-Kommando hier muß statisch gelinkt sein, sonst sucht es nach der Standard-Library, die es nicht finden kann. Sollte kein statisch gelinktes Programm vorhanden sein, kann auch ein Verzeichnis lib angelegt werden, das die nötigen Libraries enthält. Das Verzeichnis etc Auch dieses Verzeichnis sollte root gehören und von niemandem beschreibbar sein. Es muß die Dateien passwd und group enthalten, jedoch ohne Passwörter. Die beiden Dateien dienen nur dazu, daß das ls -l Kommando statt Nummern Usernamen und Gruppennamen anzeigen kann. Das Verzeichnis pub Hier sollten die Dateien liegen, die der anonyme User downloaden kann. Neben diesen Verzeichnissen können noch andere liegen, z.B. ein Verzeichnis msgs (messages), das bestimmte Nachrichten enthält, die beim Login dargestellt werden. Oder wie oben schon erwähnt, das Verzeichnis lib für benötigte Libraries. Weil all das viel Arbeit zum Einrichten bedeutet, haben viele Linux-Distributionen bereits ein fertiges Paket im Lieferumfang, das eine komplette anonyme FTP-Umgebung einrichtet.

In vielen Fällen ist es erwünscht, daß der anonyme FTP-User gleich ins Verzeichnis pub wechselt, wenn er sich einloggt. Trotzdem ist es aber nötig, die chroot-Umgebung als sein Homeverzeichnis zu definieren. Für diesen Fall bietet der wu.ftpd eine zusätzliche Möglichkeit an, das Problem zu lösen.

Der Eintrag für das Home-Verzeichnis des FTP-Users in /etc/passwd darf eine Erweiterung beinhalten, nämlich eben das Verzeichnis, in das der User wechseln soll, nachdem er eingeloggt ist. Diese Erweiterung wird durch ein /./ (Slash Punkt Slash) vom eigentlichen Homeverzeichniseintrag getrennt. In unserem Beispiel müssten wir also statt

  /usr/local/ftp

jetzt

  /usr/local/ftp/./pub

schreiben. Die zweite Angabe versteht sich also relativ zur ersten. Die komplette Zeile in /etc/passwd würde also lauten:

  ftp:x:40:2:ftp account:/usr/local/ftp/./pub:/bin/bash

Das hat dann zwar zur Folge, daß sich niemand mehr als ftp auf der Konsole einloggen kann, aber das soll ja sowieso nicht sein.

Upload-Möglichkeiten für anonyme User

Die normale Anwendung für anonymes FTP ist in der Regel auf Downloads beschränkt. Es kann aber auch gewünscht sein, dass ein anonymer User in ein bestimmtes Verzeichnis auch Daten uploaden kann. Oft heisst ein solches Verzeichnis Incoming oder Upload.

Der Trick dabei ist einfach der, dass dieses Verzeichnis dem User ftp gehört und dieser User im Verzeichnis Schreibrechte hat.

Zugriffssteuerung und Konfiguration

Der wu.ftpd ermöglicht eine komplexe Form der Steuerung der Zugriffskontrolle und anderer Einstellungen in der Datei /etc/ftpaccess. Diese Einstellungmöglichkeiten sollen hier noch dargestellt werden. Damit der FTP-Daemon diese Datei überhaupt interpretiert, muß er mit der Kommandozeilenoption -a gestartet werden.

Neben den beiden Zugriffsarten perönlich (real) und anonym (anonymous) kennt der wu.ftpd noch den Gastmodus (guest). In diesem Modus muß sich ein User mit echtem Usernamen und Passwort einloggen, er bekommt dann aber auch eine chroot-Umgebung in einem bestimmten Verzeichnis, als wäre er der anonyme User. Auch er kann sich also nicht im System frei bewegen. Das wird z.B. gerne benutzt, um den Usern eines Webspace-Servers FTP-Zugang auf ihre Verzeichnisse zu geben. Der Eintrag in der /etc/passwd sieht dann genauso aus wie beim anonymen User (Homeverzeichnis/./aktuelles Verzeichnis).

In der Datei /etc/ftpchroot kann zusätzlich noch eine Liste von Usern angegeben werden, die auch mit einer chroot-Umgebung versorgt werden, bevor sie Zugriff erhalten.

Klassenbildung

Der wu.ftpd erlaubt es, verschiedene Klassen von Clients zu bilden. Als Klassen werden Zusammenfassungen verschiedener IP-Adressen oder DNS-Domainnamen gewertet. Die Adressen dürfen mit Shell-Jokerzeichen (*?[]{}) in Mustern angegeben werden. Durch einen Eintrag in der Datei /etc/ftpaccess werden solche Klassen gebildet. Die grundsätzliche Form ist:

  class Klassenname Typenliste Adressenmuster 

Der Klassenname ist dabei frei wählbar. In der Typenliste stehen eine beliebige – durch Kommas getrennte – Liste, die aus den Begriffen real, anonymous und guest bestehen. Wenn ein Host in keine Klasse eingeteilt werden kann, dann wird ihm der Zugriff verweigert. Sollten auf einen Rechner mehrere Klassen anwendbar sein, so wird die erste passende gewählt. Das heißt, bei der Formulierung der Klassen sollte Wert auf die richtige Reihenfolge gelegt werden.

Durch spätere Befehle, die sich auf diese Klassen beziehen, können dann bestimmte Dinge erlaubt oder verboten werden. Ein einfaches Beispiel:

  class admin    real              10.230.1.{100,107,129}
  class eigene   real,anonymous    *.mydomain.de
  class kunden   real,guest        *
  class alle     anonymous         *

definiert vier Klassen. Die Klasse admin besteht aus den Rechnern 10.230.1.100, 10.230.1.107 und 10.230.1.129. Mitglieder dieser Klasse können sich mit realem Usernamen einloggen. Die Klasse eigene besteht aus allen Mitgliedern der Domain mydomain.de, auch die Mitglieder dieser Klasse dürfen sich mit realem Namen einloggen. Ihnen steht aber auch der anonyme Modus zur Verfügung. Ist ein Rechner sowohl Mitglied der Domain mydomain.de, als auch Träger einer der drei genannten IP-Adressen und der User will sich real anmelden, so wird der der Klasse admin zugeteilt, weil die zuerst definiert wurde.

Der Klasse kunden können alle Rechner der Welt angehören, sie dürfen sich real und als Gast anmelden. Alle die, die sich weltweit anonym einloggen gehören der Klasse alle an.

Eigenschaften der Klassen

Jeder definierten Klasse können im weiteren Verlauf der Datei /etc/ftpaccess bestimmte Eigenschaften und Einschränkungen zugewiesen werden. Gehen wir die wichtigsten der Reihe nach durch: autogroup Gruppenname Klasse [Klasse …] Wenn ein anonymer User Mitglied einer der genannten Klassen ist, dann bekommt er automatisch die Mitgliedschaft in der genannten Gruppe. Die Gruppe ist eine normale Unix-Gruppe. Somit ist es möglich, bestimmten Klassen Zugriffsrechte auf Dateien zu geben, die andere anonyme User nicht haben. limit Klasse Zahl Zeit Datei Beschränkt den Zugriff von Usern der genannten Klasse während der genannten Zeit auf die genannte Zahl. Wird einem User der Zugriff aufgrund dieser Regel verweigert, so wird ihm der Inhalt der genannten Datei übermittelt.

Wird für die Zahl eine -1 eingegeben, so gilt dies als Synonym für unendlich, es werden also keine Einschränkungen gemacht.

Die Zeitangabe hält sich an das UUCP-Time Format, das hier kurz beschrieben werden soll:

Eine Zeitangabe beginnt grundsätzlich entweder mit Su, Mo, Tu, We, Th, Fr oder Sa und meint damit einen bestimmten Tag. Wk steht für einen beliebigen Arbeitstag (Mo-Fr) und Any meint jeden Tag. Der Angabe des Tages kann eine Zeitangabe in der Form hhmm-hhmm folgen, die dann den Bereich definiert. Mehrere Zeitangaben können durch Kommas voneinander getrennt werden. Die Angabe never bedeutet nie.

Existieren mehrere anwendbare limit-Anweisungen, so wird die erste passende angewandt. compress yes|no Klasse [Klasse …] Erlaubt (yes) oder verbietet (no) den Gebrauch von Kompressionsprogrammen für bestimmte Klassen tar yes|no Klasse [Klasse …] Erlaubt (yes) oder verbietet (no) den Gebrauch von tar für bestimmte Klassen

Wir könnten jetzt also z.B. für unsere oberen Beispielklassen folgende Regeln setzen. Ich habe die einzelnen Regeln kommentiert, so daß eigentlich klar sein sollte, was sie bewirken.

  # Mitglieder der Klasse eigene bekommen beim anonymen Login
  # Gruppenmitgliedschaft in der Gruppe users
  autogroup users eigene 

  # Mitglieder der Klasse alle bekommen die Gruppenmitgliedschaft
  # in der Gruppe ftpuser
  autogroup ftpuser alle
 
  # Mitglieder der Klasse admin dürfen immer soviel sie wollen
  limit admin    -1   Any  /usr/local/ftp/msgs/msg.dead

  # Maximal 20 User des lokalen Netzes 
  limit eigene   20   Any  /usr/local/ftp/msgs/msg.dead

  # Maximal 5 User der Klassen kunden und alle zur Geschäftszeit. Zwischen
  # 17 und 8 Uhr dürfen 20 jeder Klasse. 
  limit kunden    5    Any0800-1700 /usr/local/ftp/msgs/msg.dead
  limit alle      5    Any0800-1700 /usr/local/ftp/msgs/msg.dead
  limit kunden   20    Any1700-0800 /usr/local/ftp/msgs/msg.dead
  limit alle     20    Any1700-0800 /usr/local/ftp/msgs/msg.dead    
  
  # tar und compress für alle
  tar        yes  admin eigene kunden alle
  compress   yes  admin eigene kunden alle  

Mit Klassen sind also verschiedene Einstellungen möglich, die die Auslastung des FTP-Servers zu bestimmten Zeiten regeln oder grundsätzlich Dinge verbieten oder erlauben. So werden viele Server zwar persönliches FTP für z.B. ihre Kunden erlauben, jedoch keine öffentlichen anonymen Zugänge anbieten. Über die Klassen ist das ganz einfach möglich.

Andere Zugriffsregeln

Neben den Klassen können bestimmte andere Regeln auch einfach für Adressenmuster erstellt werden. So existieren etwa die folgenden Regeln:

deny Adressenmuster Dateiname

Rechner mit Adressen, die auf das genannte Muster passen, wird grundsätzlich jeder Zugriff verweigert. Der Inhalt der genannten Datei wird ihnen übermittelt. Statt eines Adressenmusters kann auch ein Domain-Namensmuster (*.mydomain.de) oder der Begriff !nameserved (ohne Nameservereintrag) benutzt werden.

guestgroup Gruppenname [Gruppenname …]

Ist ein User im real-Modus ein Mitglied einer der genannten Gruppen, so wird der guest-Modus auf ihn angewandt.

noretrieve Dateiname [Dateiname …]

Die genannten Dateien werden grundsätzlich nie übertragen. Ist die Angabe absolut (beginnt sie mit einem Slash), so gilt das Verbot für genau die genannte Datei. Ist der Dateiname nur ein Name ohne Pfad, so gilt das Verbot für alle Dateien dieses Namens. Achtung, hier sind keine Namensmuster erlaubt.

chmod yes|no Typliste

delete yes|no Typliste

overwrite yes|no Typliste

rename yes|no Typliste

umask yes|no Typliste

Erlaubt (yes) oder verbietet (no) die jeweilige Aktion für die entsprechenden Typlisten. Typliste ist wie schon oben eine durch Kommas getrennte Liste der Begriffe real, anonymous und guest.

Globale Einstellungen

Neben den Zugriffsrechten werden in /etc/ftpaccess auch globale Einstellungen geregelt. Dazu stehen die folgenden Befehle zur Verfügung:

email E-Mail-Adresse

Die E-Mail Adresse des FTP-Verwalters

passwd-check none|trivial|rfc822 [ enforce|warn ]

Legt fest, welcher Art die Passwörter für anonyme User sein müssen. none heißt es wird keine Passwortüberprüfung gemacht, trivial heißt, es muß ein @ im Passwort auftauchen und rfc822 fordert eine echte RFC822 kompatible e-mail Adresse. Die optionalen Anhängsel enforce oder warn legen fest, ob diese Regelung zwingend (enforce) ist, oder ob nur gewarnt werden soll.

Messages

Der FTP-Server kann zu verschiedenen Gelegenheiten verschiedene Nachrichten an den User zurückgeben. Diese Nachrichten liegen jeweils in Dateien, die dann an den FTP-User geschickt werden. Der FTP-Server bietet verschiedene Variablen-Substitutionen an, die in diese Dateien geschrieben werden und die er dann durch die entsprechenden Variableninhalte ersetzt. Gültig sind folgende Substitutionen:

SubstitutionBedeutung
%TLokale Zeit des Servers in der Form: Thu Nov 15 17:12:42 1990
%FFreier Plattenplatz auf der aktuellen Partition in Kilobyte.
%CAktuelles Verzeichnis
%EDie E-Mail Adresse des Systemverwalters (definiert in /etc/ftpaccess)
%RDer Hostname des Client-Rechners
%LDer Hostname des FTP-Servers
%UDer Username, der beim LogIn ermittelt wurde
%MDie maximale erlaubte Anzahl Clients dieser Klasse
%NDie aktuelle Anzahl Clients dieser Klasse

Meldungen werden zu verschiedenen Anlässen ausgegeben. Wir haben oben schon gesehen, daß eine Meldung ausgegeben wird, wenn

  • ein limit für eine Klasse erreicht wurde
  • ein Zugriff mit deny abgelehnt wird

Daneben gibt es die Möglichkeit, bestimmte Dateien zur Anzeige zu bringen, wenn bestimmte Aktionen ausgeführt werden. Das geschieht mit dem Kommando message Dateiname Gelegenheit [Klasse] Die bezeichnete Datei wird an den User ausgegeben, wenn die genannte Gelegenheit eintritt. Gelegenheit kann sein:

  • login
    Beim Login
  • cwd=Verzeichnis
    Beim Wechsel in das genannte Verzeichnis. Verzeichnis darf auch ein Muster sein, so daß cwd=* jeden Verzeichniswechsel meint. Bei Verzeichniswechsel wird die Datei immer nur beim ersten Mal angezeigt, um den User nicht durch zu viel Daten zu ärgern. Ist der angegebene Dateiname ein relativer Pfad, so beziegt er sich auf das neue Verzeichnis, in das gewechselt wurde.

So ist es also möglich, verschiedenen Klassen verschiedene Meldungen zukommen zu lassen, wenn sie sich einloggen oder Verzeichnisse wechseln. Eine sehr übliche Einstellung ist:

  message  .message  cwd=*

Das bewirkt also, daß bei einem Wechsel in ein beliebiges Verzeichnis die Datei .message an den User geschickt wird, sofern diese Datei im Verzeichnis existiert. Meist enthalten diese Dateien eine Kurzbeschreibung, was in dem Verzeichnis zu finden ist.

Virtuelle FTP-Server

Zu guter Letzt unterstützt der FTP-Server auch noch virtuelle FTP-Server. Ein Rechner, der mehrere IP-Adressen hat, kann für jede Adresse einen eigenen FTP-Server laufen haben. Der Befehl lautet

virtual IP-Adresse root Verzeichnis

Gibt das Wurzelverzeichnis des virtuellen Servers für die angegebene IP-Adresse an.

virtual IP-Adresse banner Dateiname

Gibt den Dateinamen der Datei an, die als Willkommensmeldung gezeigt werden soll

virtual IP-Adresse logfile Dateiname

Gibt den Dateinamen der Logdatei an, in die das Logbuch geschrieben werden soll. Wird diese Angabe weggelassen, so wird die normale Logdatei benutzt.

Gruppenbildung mit ftpgroups

In der Datei /etc/ftpgroups existiert noch eine Möglichkeit, zusätzliche Gruppenrechte zu setzen. Dort kann ein Eintrag in der Form

  Gruppenname:verschlüsseltes_Passwort:echte_Unix_Gruppe

Wenn ein User nach dem Einloggen auf dem FTP-Server das Kommando SITE GROUP und SITE GPASS anwendet und die dort angegebene Gruppe (und das Passwort) mit der Angabe in der Datei ftpgroups übereinstimmt, dann wird er zum Mitglied der dort genannten Unix-Gruppe und enthält somit alle Rechte eines Gruppenmitglieds. Damit können beispielsweise auch bei anonymen Login für bestimmte User Schreibrechte auf bestimmte Verzeichnisse vergeben werden.