inetd - inetd

inetd ( i nter net service d aemon) ist ein Super-Server- Daemon auf vielen Unix- Systemen, der Internetdienste bereitstellt. Für jeden konfigurierten Dienst werden Anforderungen von Verbindungsclients abgehört. Anforderungen werden durch Starten eines Prozesses bedient, der die entsprechende ausführbare Datei ausführt. Einfache Dienste wie Echo werden jedoch von inetd selbst bedient. Externe ausführbare Dateien, die auf Anfrage ausgeführt werden, können Single- oder Multithread-Dateien sein. Es erscheint zum ersten Mal in 4.3BSD und befindet sich in der Regel unter /usr/sbin/inetd .

Funktion

Inetd wird oft als Super-Server bezeichnet und überwacht bestimmte Ports, die von Internetdiensten wie FTP , POP3 und Telnet verwendet werden . Wenn ein TCP- Paket oder UDP- Paket mit einer bestimmten Zielportnummer ankommt, startet inetd das entsprechende Serverprogramm, um die Verbindung zu verarbeiten. Für Dienste, von denen nicht erwartet wird, dass sie mit hoher Last ausgeführt werden, verwendet diese Methode den Speicher effizienter, da die spezifischen Server nur bei Bedarf ausgeführt werden. Darüber hinaus ist im "nowait" -Modus der Dienstverwaltung von inetd kein Netzwerkcode in den dienstspezifischen Programmen erforderlich, da inetd den Netzwerkstrom direkt mit stdin und stdout des erzeugten Prozesses verknüpft . Bei Protokollen mit häufigem Datenverkehr wie HTTP und POP3 ist entweder der Betriebsmodus "Warten" von inetd oder ein dedizierter Server, der den Datenverkehr direkt abfängt, vorzuziehen.

Einrichten

Die Liste der Dienste, die gewartet werden sollen, wird normalerweise in einer Konfigurationsdatei angegeben /etc/inetd.conf . Eine grafische Benutzeroberfläche zum Verwalten der Konfigurationsdatei ist ein optionales Zubehör. Der Dämon benötigt möglicherweise ein Signal, um seine Konfiguration erneut zu lesen. Zum Beispiel kann Telnet wie folgt konfiguriert werden (Zeile von einem Computer mit AIX Version 5.1):

telnet  stream  tcp6    nowait  root    /usr/sbin/telnetd      telnetd -a

Das erste Wort telnet ist der offizielle Name des Dienstes. Es wird mithilfe der Systemdatenbank gelöst, um Portnummern und Protokolle Dienstnamen zuzuordnen. In diesem Fall /etc/services sollte enthalten:

telnet          23/tcp

Das zweite und dritte Wort beschreiben den Socket-Typ bzw. das zugrunde liegende Protokoll. Die /etc/protocols Datenbank wird konsultiert.

Das vierte Wort ist der Wait / Nowait-Schalter. Ein Single-Threaded-Server erwartet, dass inetd wartet, bis alle Daten gelesen sind. Andernfalls lässt inetd den Server laufen und erzeugt neue, gleichzeitige Prozesse für neue Anforderungen.

Das fünfte Wort ist der Benutzername aus der /etc/passwd Datenbank, unter dem das Dienstprogramm ausgeführt werden soll.

Schließlich werden der Pfad und die Argumente eines externen Programms angegeben. Das erste Argument ist wie üblich der Programmname. In diesem Beispiel wird inetd angewiesen, das Programm /usr/sbin/telnetd mit den Befehlszeilenargumenten zu starten telnetd -a . inetd bindet den Socket automatisch an stdin, stdout und stderr des Serverprogramms.

Im Allgemeinen werden TCP-Sockets behandelt, indem ein separater Server erzeugt wird, um jede Verbindung gleichzeitig zu behandeln. UDP-Sockets werden im Allgemeinen von einer einzelnen Serverinstanz verarbeitet, die alle Pakete an diesem Port verarbeitet.

Einige einfache Dienste, wie z. B. Echo , werden direkt von inetd verarbeitet, ohne dass ein externer Server erzeugt wird.

Erstellen eines inetd-Dienstes

Dies ist ein einfacher inetd-Dienst, der in C geschrieben ist . Es erwartet ein Befehlszeilenargument, das einen Dateinamen für eine Protokolldatei enthält, und protokolliert dann alle über den Socket gesendeten Zeichenfolgen in der Protokolldatei. Beachten Sie, dass dies ein sehr unsicheres Beispielprogramm ist.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  const char *fn = argv[1];
  FILE *fp = fopen(fn, "a+");

  if (fp == NULL) 
    exit(EXIT_FAILURE);

  char str[4096];
  /* inetd passes its information to us in stdin. */
  while (fgets(str, sizeof str, stdin)) {
    fputs(str, fp);
    fflush(fp);
  }
  fclose(fp);
  return 0;
}

Das Beispiel verwendet stdio- Funktionen und reagiert auf Netzwerkverkehr, der auf stdin eingeht. In diesem Fall möchten wir, dass alle Nachrichten in einer einzigen Datei protokolliert werden. Daher möchten wir, dass nur eine Instanz des ausgeführten Dienstes alle Anforderungen bearbeitet. Dies bedeutet, dass UDP das richtige Protokoll ist. Zunächst muss eine nicht verwendete Portnummer ausgewählt werden. In diesem Beispiel wird 9999 verwendet. Der /etc/services Eintrag sieht folgendermaßen aus:

errorLogger 9999/udp

Und der Eintrag in /etc/inetd.conf sieht folgendermaßen aus:

errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt

Dies sagt inetd das ausführen /usr/local/bin/errlogd Programm, mit der Kommandozeile: errlogd /tmp/logfile.txt (siehe die inetd.conf Manpage für Informationen über die anderen Argumente). Das erste Argument enthält den Dateinamen, der für die Protokolldatei verwendet werden soll : /tmp/logfile.txt . Inetd führt den Dienst bei Bedarf aus und hängt Port 9999 an die Eingabe- und Ausgabestreams an. Alle an diesen Port gesendeten Zeichenfolgen werden in der Datei protokolliert. Durch Angabe von wait wird inetd angewiesen, nur eine Instanz des Servers zu verwenden, um alle Anforderungen zu verarbeiten.

Hinweis: Die Funktionalität des obigen Beispiels wird normalerweise mithilfe von Syslog und einem Prozess wie syslogd implementiert. syslogd wird normalerweise parallel zu inetd gestartet, nicht als inetd-Dienst.

inetd Ersatz

In den letzten Jahren wurde es aufgrund der Sicherheitsbeschränkungen im ursprünglichen Design von inetd in vielen Systemen durch xinetd , rlinetd, ucspi-tcp und andere ersetzt. Insbesondere Linux- Distributionen bieten viele Optionen, und Mac OS X (beginnend mit Mac OS X 10.2 ) verwendet xinetd . Ab Version Mac OS X 10.4 hat Apple die Funktionalität von inetd in launchd zusammengeführt .

Die von inetd angebotenen Dienste können gänzlich weggelassen werden. Dies wird immer häufiger, wenn Maschinen einer einzigen Funktion zugeordnet sind. Beispielsweise könnte ein HTTP-Server so konfiguriert werden, dass nur httpd ausgeführt wird und keine anderen Ports geöffnet sind. Bei einer dedizierten Firewall konnten keine Dienste gestartet werden.

systemd unterstützt inetd-Dienste und erweitert die Socket-Aktivierung über IP-Messaging ( AF INET +6) hinaus um AF UNIX , AF NETLINK und mehr.

Sicherheitsbedenken

Während das inetd-Konzept als Service-Dispatcher nicht von Natur aus unsicher ist, gab die lange Liste von Diensten, die inetd traditionell bereitstellte, Computersicherheitsexperten eine Pause. Die Möglichkeit, dass ein Dienst einen ausnutzbaren Fehler aufweist oder der Dienst nur missbraucht wird, musste in Betracht gezogen werden. Unnötige Dienste, die deaktiviert und "standardmäßig deaktiviert" wurden, wurden zum Mantra. Es ist nicht ungewöhnlich , eine zu finden , /etc/inetd.conf mit fast allen Dienstleistungen auf Kommentar in einer modernen Unix - Distribution.

Siehe auch

Verweise

Externe Links