14.2 Sonstige Server
In diesem Abschnitt wird noch kurz auf zwei andere Netzwerkserverdienste eingegangen: FTP und xinetd.
14.2.1 vsftpd, ein FTP-Server
Die theoretischen Grundlagen des File Transfer Protocols wurden bereits in Kapitel 4, »Netzwerkgrundlagen«, beschrieben. Da es sich um einen der ältesten Internetdienste handelt, gibt es unzählige Implementierungen von FTP-Servern. Leider sind die meisten von ihnen verhältnismäßig unsicher. Schließlich stammt ihr Grundkonzept aus einer Zeit, in der die Universitätsnetze beinahe unter sich waren und in der Regel nicht beabsichtigten, einander Schaden zuzufügen.
Ein moderner FTP-Server ist vsftpd (Very Secure File Transfer Protocol Daemon). Er ist Bestandteil zahlreicher Linux- und Unix-Distributionen. Falls Ihre nicht dazugehört oder wenn Sie eine neuere Version haben möchten, können Sie ihn unter http://vsftpd. beasts.org herunterladen. Wenn Sie ihn starten, ohne die Konfigurationsdatei zu editieren, wird er als Anonymous-FTP-Server ausgeführt, von dem Daten nur heruntergeladen werden können.
Falls Sie ein spezielleres Verhalten benötigen, müssen Sie die Konfigurationsdatei /etc/vsftpd.conf bearbeiten. Es gibt zahlreiche mögliche Konfigurationsdirektiven. In der Datei selbst stehen recht ausführliche Kommentare dazu; noch mehr Informationen erhalten Sie auf der Manpage vsftpd.conf(5).[Anm.: Die Zahl in Klammern steht für die Manual-Sektion. Geben Sie man 5 vsftpd ein, um Informationen zur Konfigurationsdatei zu erhalten. Ein einfaches man vsftpd ruft dagegen vsftpd(1) auf, die Manpage des Servers selbst.] An dieser Stelle sollen nur ein paar Konfigurationsoptionen vorgestellt werden. Die Reihenfolge entspricht derjenigen in der Datei, in der sie zunächst auskommentiert stehen.
- write_enable=YES|NO
Legt fest, ob Schreibzugriffe generell gestattet sind oder nicht. Falls nichts anderes eingestellt wird, gilt dies zunächst einmal nur für lokale Benutzer. - ftpd_banner=Text
Die Begrüßungsnachricht des Servers. Sie wird in den meisten FTP-Clients angezeigt, sobald ein Benutzer sich anmeldet. Oft enthält sie Informationen zu den Einstellungen und zur »Geschäftspolitik« des FTP-Servers. Beispiel:ftpd_banner=Welcome to the lingoworld.de FTP Server.
- local_enable=YES|NO
Diese Direktive legt fest, ob sich neben den standardmäßig aktivierten anonymen Log-ins auch benannte User anmelden dürfen. Die Benutzerdaten stammen dabei aus der Datei /etc/passwd beziehungsweise den diversen PAM-Modulen. - chroot_local_user=YES|NO
Aktivieren Sie diese Option, um den jeweils angemeldeten Benutzer mithilfe von chroot(1) in einen »Dateisystemkäfig« zu sperren. Das Home-Verzeichnis des entsprechenden Users wird damit zur absoluten Wurzel des Dateisystems. Vom Sicherheitsstandpunkt her ist dies sehr zu empfehlen, allerdings funktioniert diese Option nicht, wenn mehrere User einen gemeinsamen Zugriff auf FTP-Verzeichnisse benötigen. - anonymous_enable=YES|NO
Legt fest, ob der Server anonyme Log-ins erlaubt. Die Voreinstellung ist YES.
Wenn Sie Änderungen an der Konfigurationsdatei vornehmen, müssen Sie den FTP-Server anschließend neu starten. Halten Sie sich dazu – sowie für den automatischen Start des Servers – an die allgemeinen Anleitungen zur Administration von Unix-Programmen auf Unix-Systemen.
14.2.2 inetd und xinetd
Manche Internetserver werden nicht permanent benötigt, und es wäre deshalb eine gewisse Ressourcenvergeudung, sie permanent als Daemons laufen zu lassen. Die Alternative bietet ein Dienst, der bereits seit der »Internet-Steinzeit« für Unix-Systeme zur Verfügung steht: der »Superdaemon« inetd. Er stellt die lauschenden Sockets für verschiedene TCP-Ports oder UDP-Dienste bereit und startet den jeweiligen Server, sobald eine Anfrage für diesen eintrifft. Einige ziemlich primitive Standarddienste kann er sogar selbst zur Verfügung stellen.
Früher war die Verwendung von inetd weit verbreitet. Selbst alte Apache-Versionen besaßen eine Konfigurationsdirektive namens ServerType. Sie konnte die Werte stand-alone oder inetd annehmen, um den Webserver als Daemon zu betreiben beziehungsweise nur bei Bedarf zu starten.
Wegen diverser Designschwächen wurde der inetd inzwischen durch eine Neuimplementierung namens xinetd ersetzt. Da die Anleitungen vieler Server aber immer noch die Verhältnisse für inetd beschreiben, sollten Sie sich trotzdem beide Dienste anschauen.
inetd
Die Einstellungen für den inetd stehen in seiner Konfigurationsdatei /etc/inetd.conf. Jeder Eintrag steht in einer einzelnen Zeile und besteht aus diversen durch Whitespace getrennten Feldern. Hier einige Beispiele:
echo stream tcp nowait root internal
echo dgram udp wait root internal
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
Die Felder haben folgende Bedeutung:
- Dienstname – dies ist der Alias des Ports oder Dienstes gemäß /etc/services.
- Socket-Typ – wie Sie bereits aus Kapitel 10, »Konzepte der Programmierung«, wissen, sind Sockets die Endpunkte einer Netzwerkverbindung. Es gibt zwei wichtige Arten: stream stellt eine zuverlässige Punkt-zu-Punkt-Verbindung durch die sogenannten Streaming-Sockets zur Verfügung, während dgram die Datagramm-Sockets zum verbindungslosen Senden einfacher Nachrichten bereitstellt. stream-Sockets gehören in aller Regel zu TCP, dgram-Sockets dagegen zu UDP.
- Protokoll – das Transportprotokoll; Möglich sind die beiden Werte tcp und udp. Einige Dienste, zum Beispiel echo, können sowohl über TCP als auch über UDP verwendet werden
- Nebenläufigkeit – das nächste Feld enthält den Wert nowait, wenn der entsprechende Server mehrere Anfragen gleichzeitig verarbeiten kann, oder wait, wenn jeder Verbindungsversuch das Ende der vorherigen Verbindung abwarten muss. Da UDP einzelne Nachrichten sendet, genügt für dieses Protokoll stets wait, während die meisten TCP-Dienste nowait verwenden. Einzelheiten zum Thema TCP-Nebenläufigkeit erfahren Sie in den Abschnitten zur System- und Netzwerkprogrammierung in Kapitel 10, »Konzepte der Programmierung«, sowie im Rahmen der Diskussion über die Apache-MPMs im vorigen Kapitel.
- UID – die User-ID, unter der der Dienst ausgeführt wird. Die privilegierten Ports 0 bis 1023 dürfen nur vom User root geöffnet werden, weshalb dieser Name auch in den Beispielzeilen zu sehen ist.
- Kommando – hier ist zu lesen, was passiert, wenn der inetd eine TCP-Verbindungsanfrage oder ein UDP-Datagramm für den jeweiligen Port oder Dienst empfängt. Der Wert internal bedeutet, dass inetd die Anfrage selbst verarbeitet. tcpd ist der TCP-Wrapper, ein weiterer Vermittler, der dann seinerseits den eigentlichen Server startet. Die dritte Möglichkeit ist der Pfad eines Serverprogramms.
xinetd
Der xinetd wurde als Ersatz für den klassischen inetd geschrieben. Seine Konfigurationsdateien besitzen ein aufwendigeres Format, da er auch mehr Möglichkeiten bietet. Er verwendet zunächst eine Datei namens /etc/xinetd.conf für allgemeine Voreinstellungen. Hier ein Beispiel für die Hauptkonfigurationsdatei:
defaults
{
log_type = FILE /var/log/xinetd.log
log_on_success = HOST EXIT DURATION
log_on_failure = HOST ATTEMPT
# only_from = localhost
instances = 30
cps = 50 10
# interface = 127.0.0.1
}
includedir /etc/xinetd.d
Zeilen, die mit einem #-Zeichen beginnen, sind Kommentare. Zwei Einstellungen werden auf diese Weise standardmäßig auskommentiert: only_from zur Beschränkung von Zugriffen auf die angegebenen Client-Hosts beziehungsweise -Teilnetze sowie interface zur Verwendung bestimmter Netzwerkschnittstellen. Per Voreinstellung darf also jeder beliebige Host über alle Netzwerkschnittstellen zugreifen.
log_type legt fest, ob Protokolldaten – wie hier gezeigt – in eine Datei oder ins Syslog geschrieben werden. log_on_success bestimmt, welche Daten bei erfolgreichen Zugriffen geloggt werden sollen; im vorliegenden Beispiel Hostname, Verbindungsende und Verbindungsdauer. log_on_failure legt fest, welche Daten bei fehlgeschlagenen Zugriffen protokolliert werden – hier der Hostname und der Zugriffsversuch selbst.
Die Einstellung instances beschränkt die Anzahl gleichzeitig aktiver Serverinstanzen. cps (Clients per Second) besitzt zwei Werte – die Höchstzahl der Zugriffe pro Sekunde sowie die Wartezeit in Sekunden, falls diese überschritten wird.
Die includedir-Zeile bindet alle Dateien unterhalb des Verzeichnisses /etc/xinetd.d ein; diese enthalten die Einstellungen für die einzelnen Serverdienste. Das folgende Beispiel zeigt die Datei /etc/xinetd.d/daytime. Es handelt sich um einen in RFC 867 definierten Internet-Standarddienst, der jede TCP- oder UDP-Anfrage auf Port 13 mit Datum und Uhrzeit beantwortet. Die UDP-Version besitzt eine eigene Konfigurationsdatei namens /etc/xinetd.d/daytime-udp. Hier der Inhalt der Datei:
service daytime
{
type = INTERNAL
id = daytime-stream
socket_type = stream
protocol = tcp
user = root
wait = no
disable = yes
FLAGS = IPv6 IPv4
}
Die Zeilen haben folgende Bedeutung:
- service – Name des Dienstes gemäß /etc/services
- type – Typ des Serverdienstes. INTERNAL bedeutet, dass der Dienst von xinetd selbst ausgeführt wird. Weitere wichtige Typen sind RPC für NFS und NIS, TCPMUX für TCP-Multiplexing nach RFC 1078 sowie UNLISTED für benutzerdefinierte Serverdienste, deren Portnummern nicht in /etc/services stehen.
- id – ID des Dienstes, ein eindeutiger Wert. Bei Diensten wie daytime, die sowohl TCP als auch UDP unterstützen, wird deshalb wie hier stream beziehungsweise dgram zur Unterscheidung angehängt; bei allen anderen Servern genügt der einfache Dienstname.
- socket_type – Socket-Typ, stream oder dgram
- protocol – Transportprotokoll, tcp oder udp
- user – User-ID, unter der der Server ausgeführt wird
- wait – Nebenläufigkeitskonfiguration. Der Wert no entspricht dem inetd-Parameter nowait, während yes der Einstellung wait entspricht.
- disable – Falls yes eingestellt wird, ist der Dienst standardmäßig deaktiviert. Kommentieren Sie die Zeile mithilfe von # aus, um diesen Server zu testen.
- FLAGS – Legt fest, mit welchen IP-Versionen der Server zusammenarbeitet; im vorliegenden Beispiel werden beide unterstützt. Der IPv6-Support ist eine der wichtigsten Neuerungen gegenüber inetd.
Außer daytime kann xinetd folgende Dienste selbst ausführen:
- echo (Port 7) liefert jede an den Server gesendete Nachricht wörtlich wieder zurück. Es handelt sich also um eine Art erweitertes ping über höhere Transportprotokolle.
- time (Port 37) ist ein weiterer Zeitserver. Im Gegensatz zu daytime sendet er die Zeitinformation nicht als String, sondern numerisch, sodass Sie dieses Protokoll nicht mit telnet testen können – die Zeichenumsetzung des gelieferten 32-Bit-Integers ist nicht im Klartext lesbar.
- chargen (Port 19) erzeugt einen Endlos-Zeichenstrom. In der Regel wird der von Menschen lesbare Bereich des ASCII-Zeichensatzes in einer Endlosschleife wiederholt. So lässt sich etwa die Zuverlässigkeit einer Netzwerkverbindung überprüfen.
- discard (Port 9) ist die Netzwerkentsprechung von /dev/null: Was auch immer Sie an diesen Dienst senden, wird verworfen.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.