23.2. Der inetd “Super-Server”

Beigetragen von Chern Lee.

23.2.1. Überblick

inetd(8) wird 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). Durch die Nutzung einer einzigen Instanz des inetd-Daemons an Stelle viele einzelner Daemonen lässt sich die Systemlast verringern.

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.

23.2.2. Einstellungen

inetd wird durch /etc/rc.conf initialisiert. Die Option inetd_enable ist in der Voreinstellung auf NO gesetzt, wird aber oft von sysinstall aktiviert, wenn man das mittlere Sicherheitsprofil auswählt. Die Verwendung von

inetd_enable="YES"
oder
inetd_enable="NO"
in /etc/rc.conf deaktiviert oder startet inetd beim Systemstart.

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

23.2.3. Kommandozeilenoptionen

inetd verwendet folgende Syntax:

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

-d

Debugging aktivieren.

-l

Die Protokollierung von erfolgreich aufgebauten Verbindungen aktivieren.

-w

TCP-Wrapping für externe Dienste aktivieren (Voreinstellung).

-W

TCP-Wrapping für interne, in inetd eingebaute Dienste aktivieren (Voreinstellung).

-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.

-a

Legt die IP-Adresse fest, an die ein Dienst gebunden wird. Alternativ kann auch ein Rechnername angegeben werden. In diesem Fall wird die IPv4- oder IPv6-Adresse des Rechners verwendet. Ein Rechnername wird meist dann festgelegt, wenn inetd innerhalb eines jail(8)s läuft. In diesem Fall entspricht der Rechnername der jail(8)-Umgebung.

Wenn ein Rechnername angegeben wird, und sowohl IPv4 als auch IPv6 benötigt werden, muss jedes Protokoll durch einen Eintrag in /etc/inetd.conf an jeden einzelnen benötigten Dienst gebunden werden. Ein TCP-basierter Dienst benötigt also zwei Einträge, einen für tcp4, den anderen für tcp6.

-p

Legt eine alternative Datei fest, in der Prozess-IDs gespeichert werden sollen.

Diese Argumente können durch das Setzen der Option inetd_flags in der Datei /etc/rc.conf an inetd übergeben werden. In der Voreinstellung hat inetd_flags den Wert -wW. TCP-Wrapping ist also für interne und externe Dienste von inetd aktiviert. Im Normalfall müssen diese Parameter weder geändert noch in /etc/rc.conf eingetragen werden.

Anmerkung: Ein externer Dienst ist ein Daemon ausserhalb von inetd, der nur aktiviert wird, wenn eine Verbindung für ihn ankommt. Ein interner Dienst wird hingegen von inetd selbst bereitgestellt.

23.2.4. inetd.conf

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

Wenn /etc/inetd.conf geändert wird, kann inetd durch Senden eines HangUP-Signals an den inetd-Prozess veranlasst werden, seine Konfigurationsdatei neu einzulesen.

Beispiel 23-1. Ein HangUP-Signal an inetd senden

# kill -HUP `cat /var/run/inetd.pid`

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

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

Ein Eintrag für den IPv4 verwendenden ftpd-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]]

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 Childdaemonen, 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.

Zusätzlich zu max-child kann die maximale Anzahl von Verbindungen eines Rechners mit einem bestimmten Daemon durch die Option max-connections-per-ip-per-minute beschränkt werden. 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. Dadurch lassen sich ein absichtlicher oder unabsichtlicher Ressourcenverbrauch sowie die Auswirkungen eines Denial of Service (DoS)-Angriffs auf einen Rechner begrenzen.

wait oder nowait sind in diesem Fall obligatorisch. max-child und max-connections-per-ip-per-minute sind hingegen optional.

Ein multithread-Daemon vom Streamtyp ohne die Optionen max-child oder max-connections-per-ip-per-minute 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-Daemon bereits in der Voreinstellung verwendet:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
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.

23.2.5. Sicherheit

Abhängig von dem bei der Installation ausgewählten Sicherheitsprofil werden viele der von inetd verwalteten Daemonen automatisch aktiviert! Wenn Sie einen bestimmten Daemon nicht benötigen, deaktivieren Sie ihn! Dazu kommentieren Sie den jeweiligen Daemon in /etc/inetd.conf mit einem “#” aus, und senden ein Hangup-Signal (HUP) an inetd. Einige Daemonen, zum Beispiel fingerd, sollten generell deaktiviert werden, da sie einen potentiellen Angreifer mit zu viel Informationen versorgen.

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 ip-per-minute und max-child zu beschränken.

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.

23.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 (ident, identd) über das Netzwerk an und ist bis zu einem bestimmten Grad konfigurierbar.

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

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 17:56:55