inetd – Wikipedia

before-content-x4

inetd (ichnterNetz Bedienung daemon) ist ein Super-Server-Daemon auf vielen Unix-Systemen, der Internetdienste bereitstellt. Für jeden konfigurierten Dienst werden Anforderungen von Verbindungsclients abgehört. Anfragen werden durch das Laichen eines Prozesses bedient, der die entsprechende ausführbare Datei ausführt, aber einfache Dienste wie Echo werden von inetd selbst bedient. Externe ausführbare Dateien, die auf Anfrage ausgeführt werden, können Single- oder Multithreading sein. Erstmals in 4.3BSD erscheinen,[1] es befindet sich in der Regel bei /usr/sbin/inetd.

Funktion[edit]

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. Bei Diensten, von denen nicht erwartet wird, dass sie mit hoher Last ausgeführt werden, wird bei dieser Methode der Speicher effizienter verwendet, da die spezifischen Server nur bei Bedarf ausgeführt werden. Darüber hinaus ist in den dienstspezifischen Programmen kein Netzwerkcode erforderlich, da inetd die Sockets direkt mit stdin, stdout und stderr des erzeugten Prozesses verknüpft. Für Protokolle mit häufigem Datenverkehr wie HTTP und POP3 ist möglicherweise ein dedizierter Server vorzuziehen, der den Datenverkehr direkt abfängt.

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, telnetist der offizielle Name des Dienstes. Es wird mithilfe der Systemdatenbank gelöst, um Portnummern und Protokolle Dienstnamen zuzuordnen. In diesem Fall, /etc/services sollte beinhalten:

telnet          23/tcp

Das zweite und dritte Wort beschreiben den Socket-Typ bzw. das zugrunde liegende Protokoll. Das /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 dem /etc/passwd Datenbank, als die das Serviceprogramm ausgeführt werden soll.

after-content-x4

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 zu starten /usr/sbin/telnetd mit den Befehlszeilenargumenten 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[edit]

Dies ist ein einfacher inetd-Dienst, der in C geschrieben wurde. Er 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 
#include 

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, sodass 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. Das /etc/services Der Eintrag sieht folgendermaßen aus:

errorLogger 9999/udp

Und der Eintrag in /etc/inetd.conf wird so aussehen:

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

Dies weist inetd an, das auszuführen /usr/local/bin/errlogd Programm, mit der Kommandozeile: errlogd /tmp/logfile.txt (Informationen zu den anderen Argumenten finden Sie in der Manpage inetd.conf.) 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 wartenInetd wird 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[edit]

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.[2][3]

Sicherheitsbedenken[edit]

Während das inetd-Konzept als Service-Dispatcher nicht von Natur aus unsicher ist, gab die lange Liste von Services, 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 Diensten in einer modernen Unix-Distribution auskommentiert.

Siehe auch[edit]

Verweise[edit]

Externe Links[edit]


after-content-x4