30.2. Der inetd “Super-Server”

Beigetragen von Chern Lee. Aktualisiert vom FreeBSD Documentation Project.

30.2.1. Überblick

inetd(8) wird manchmal auch als “Internet Super-Server” bezeichnet, weil er Verbindungen für mehrere Dienste verwaltet. Wenn eine Verbindung eintrifft, bestimmt inetd, welches Programm für die eingetroffene Verbindung zuständig ist, aktiviert den entsprechenden Prozess und reicht den Socket an ihn weiter (der Socket dient dabei als Standardein- und -ausgabe sowie zur Fehlerbehandlung). Der Einsatz des inetd-Daemons an Stelle viele einzelner Daemonen kann auf nicht komplett ausgelasteten Servern zu einer Verringerung der Systemlast führen.

inetd wird vor allem dazu verwendet, andere Daemonen zu aktivieren, einige Protokolle werden aber auch direkt verwaltet. Dazu gehören chargen, auth, sowie daytime.

Dieser Abschnitt beschreibt die Konfiguration von inetd durch Kommandozeilenoptionen sowie die Konfigurationsdatei /etc/inetd.conf.

30.2.2. Einstellungen

inetd wird durch das rc(8)-System initialisiert. Die Option inetd_enable ist in der Voreinstellung zwar auf NO gesetzt, sie kann aber in Abhängigkeit von der vom Benutzer bei der Installation gewählten Konfiguration von sysinstall aktiviert werden. Die Verwendung von

inetd_enable="YES"

oder

inetd_enable="NO"

in /etc/rc.conf deaktiviert oder startet inetd beim Systemstart. Über den Befehl

# /etc/rc.d/inetd rcvar

können Sie die aktuelle Konfiguration abfragen.

Weitere Optionen können über die Option inetd_flags an inetd übergeben werden.

30.2.3. Kommandozeilenoptionen

Wie die meisten anderen Server-Daemonen lässt sich auch inetd über verschiedene Optionen steuern. Die vollständige Syntax für inetd lautet:

inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [-s maximum] [configuration file]

Die verschiedenen Optionen können über die Option inetd_flags der Datei /etc/rc.conf an inetd übergeben werden. In der Voreinstellung hat diese Option den Wert -wW -C 60. Durch das Setzen dieser Werte wird das TCP-Wrapping für alle inetd-Dienste aktiviert. Zusätzlich kann eine einzelne IP-Adresse jeden Dienst nur maximal 60 Mal pro Minute anfordern.

Für Einsteiger ist es erfreulich, dass diese Parameter in der Regel nicht angepasst werden müssen. Da diese Parameter aber dennoch von Interesse sein können (beispielsweise, wenn Sie eine enorme Anzahl von Verbindungsanfragen erhalten), werden einige dieser einschränkenden Parameter im Folgenden näher erläutert. Eine vollständige Auflistung aller Optionen finden Sie hingegen in inetd(8).

-c maximum

Legt die maximale Anzahl von parallen Aufrufen eines Dienstes fest; in der Voreinstellung gibt es keine Einschränkung. Diese Einstellung kann für jeden Dienst durch Setzen des max-child -Parameters festgelegt werden.

-C rate

Legt fest, wie oft ein Dienst von einer einzelnen IP-Adresse in einer Minute aufgerufen werden kann; in der Voreinstellung gibt es keine Einschränkung. Dieser Wert kann für jeden Dienst durch Setzen des Parameters max-connections-per-ip-per-minute festgelegt werden.

-R rate

Legt fest, wie oft ein Dienst in der Minute aktiviert werden kann; in der Voreinstellung sind dies 256 Aktivierungen pro Minute. Ein Wert von 0 erlaubt unbegrenzt viele Aktivierungen.

-s maximum

Legt fest, wie oft ein Dienst in der Minute von einer einzelnen IP-Adresse aus aktiviert werden kann; in der Voreinstellung gibt es hier keine Beschränkung. Diese Einstellung kann für jeden Dienst durch die Angabe max-child-per-ip angepasst werden.

30.2.4. inetd.conf

Die Konfiguration von inetd erfolgt über die Datei /etc/inetd.conf.

Wenn /etc/inetd.conf geändert wird, kann inetd veranlasst werden, seine Konfigurationsdatei neu einzulesen.

Beispiel 30-1. Die inetd-Konfiguration neu einlesen

# /etc/rc.d/inetd reload

Jede Zeile der Konfigurationsdatei beschreibt jeweils einen Daemon. Kommentare beginnen mit einem “#”. Ein Eintrag der Datei /etc/inetd.conf hat folgenden Aufbau:

service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
user[:group][/login-class]
server-program
server-program-arguments

Ein Eintrag für den IPv4 verwendenden ftpd(8)-Daemon könnte so aussehen:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
service-name

Der Dienstname eines bestimmten Daemons. Er muss einem in /etc/services aufgelisteten Dienst entsprechen. In dieser Datei wird festgelegt, welchen Port inetd abhören muss. Wenn ein neuer Dienst erzeugt wird, muss er zuerst in die Datei /etc/services eingetragen werden.

socket-type

Entweder stream, dgram, raw, oder seqpacket. stream muss für verbindungsorientierte TCP-Daemonen verwendet werden, während dgram das UDP-Protokoll verwaltet.

protocol

Eines der folgenden:

Protokoll Bedeutung
tcp, tcp4 TCP (IPv4)
udp, udp4 UDP (IPv4)
tcp6 TCP (IPv6)
udp6 UDP (IPv6)
tcp46 TCP sowohl unter IPv4 als auch unter IPv6
udp46 UDP sowohl unter IPv4 als auch unter IPv6
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

wait|nowait gibt an, ob der von inetd aktivierte Daemon seinen eigenen Socket verwalten kann oder nicht. dgram-Sockets müssen die Option wait verwenden, während Daemonen mit Stream-Sockets, die normalerweise auch aus mehreren Threads bestehen, die Option nowait verwenden sollten. Die Option wait gibt in der Regel mehrere Sockets an einen einzelnen Daemon weiter, während nowait für jeden neuen Socket einen Childdaemon erzeugt.

Die maximale Anzahl an Child-Daemonen, die inetd erzeugen kann, wird durch die Option max-child festgelegt. Wenn ein bestimmter Daemon 10 Instanzen benötigt, sollte der Wert /10 hinter die Option nowait gesetzt werden. Geben Sie hingegen den Wert /0 an, gibt es keine Beschränkung.

Zusätzlich zu max-child kann die maximale Anzahl von Verbindungen eines Rechners mit einem bestimmten Daemon durch zwei weitere Optionen beschränkt werden. Die Option max-connections-per-ip-per-minute legt die maximale Anzahl von Verbindungsversuchen fest, die von einer bestimmten IP-Adresse aus unternommen werden können. Ein Wert von zehn würde die maximale Anzahl von Verbindungsversuchen einer IP-Adresse mit einem bestimmten Dienst auf zehn Versuche in der Minute beschränken. Durch die Angabe der Option max-child-per-ip können Sie hingegen festlegen, wie viele Child-Daemonen von einer bestimmten IP-Adresse aus gestartet werden können. Durch diese Optionen lassen sich ein absichtlicher oder unabsichtlicher Ressourcenverbrauch sowie die Auswirkungen eines Denial of Service (DoS)-Angriffs auf einen Rechner begrenzen.

Sie müssen hier entweder wait oder nowait angeben. Die Angabe von max-child, max-connections-per-ip-per-minute und max-child-per-ip ist hingegen optional.

Ein multithread-Daemon vom Streamtyp ohne die Optionen max-child, max-connections-per-ip-per-minute oder max-child-per-ip sieht so aus: nowait

Der gleiche Daemon mit einer maximal möglichen Anzahl von 10 parallelen Daemonen würde so aussehen: nowait/10

Wird zusätzlich die Anzahl der möglichen Verbindungen pro Minute für jede IP-Adresse auf 20 sowie die mögliche Gesamtzahl von Childdaemonen auf 10 begrenzt, so sieht der Eintrag so aus: nowait/10/20

All diese Optionen werden vom fingerd(8)-Daemon bereits in der Voreinstellung verwendet:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

Will man die maximale Anzahl von Child-Daemonen auf 100 beschränken, wobei von jeder IP-Adresse aus maximal 5 Child-Daemonen gestartet werden dürfen, verwendet man den folgenden Eintrag: nowait/100/0/5.

user

Der Benutzername, unter dem der jeweilige Daemon laufen soll. Meistens laufen Daemonen als User root. Aus Sicherheitsgründen laufen einige Server aber auch als User daemon, oder als am wenigsten privilegierter User nobody.

server-program

Der vollständige Pfad des Daemons, der eine Verbindung entgegennimmt. Wird der Daemon von inetd intern bereitgestellt, sollte die Option internal verwendet werden.

server-program-arguments

Dieser Eintrag legt (gemeinsam mit server-program und beginnend mit argv[0]), die Argumente fest, die bei der Aktivierung an den Daemon übergeben werden. Wenn die Anweisung auf der Kommandozeile also mydaemon -d lautet, wäre mydaemon -d auch der Wert der Option server program arguments. Wenn es sich beim Daemon um einen internen Dienst handelt, sollte wiederum die Option internal verwendet werden.

30.2.5. Sicherheit

Abhängig von der bei der Installation festgelegten Konfiguration werden viele der von inetd verwalteten Dienste automatisch aktiviert! Wenn Sie einen bestimmten Daemon nicht benötigen, sollten Sie ihn deaktivieren! Dazu kommentieren Sie den jeweiligen Daemon in /etc/inetd.conf mit einem “#” aus, um danach die inetd-Konfiguration neu einzulesen. Einige Daemonen, zum Beispiel fingerd, sollten generell deaktiviert werden, da sie zu viele Informationen an einen potentiellen Angreifer liefern.

Einige Daemonen haben unsichere Einstellungen, etwa große oder nichtexistierende Timeouts für Verbindungsversuche, die es einem Angreifer erlauben, über lange Zeit langsam Verbindungen zu einem bestimmten Daemon aufzubauen, um dessen verfügbare Ressourcen zu verbrauchen. Es ist daher eine gute Idee, diese Daemonen durch die Optionen max-connections-per-ip-per-minute, max-child sowie max-child-per-ip zu beschränken, wenn Sie sehr viele Verbindungsversuche mit Ihrem System registrieren.

TCP-Wrapping ist in der Voreinstellung aktiviert. Lesen Sie hosts_access(5), wenn Sie weitere Informationen zum Setzen von TCP-Beschränkungen für verschiedene von inetd aktivierte Daemonen benötigen.

30.2.6. Verschiedenes

Bei daytime, time, echo, discard, chargen, und auth handelt es sich um intern von inetd bereitgestellte Dienste.

Der auth-Dienst bietet Identifizierungsdienste über das Netzwerk an und ist bis zu einem bestimmten Grad konfigurierbar, während die meisten anderen Dienste nur aktiviert oder deaktiviert werden können.

Eine ausführliche Beschreibung finden Sie in inetd(8).

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <[email protected]>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <[email protected]>.