Konfiguration und Verwaltung von xinetd und inetd

Wichtung: 4

Beschreibung: Die Kandidaten sollen in der Lage sein, xinetd, inetd und die dazugehörige Dienste zu konfigurieren und zu verwalten.

Wichtigste Wissensgebiete:
Festlegen von Diensten, die über (x)inetd erreichbar sein sollen.
Manuelles Starten, Stoppen und Neustarten von Internet-Diensten.
Konfiguration grundlegender Netzwerkdienste einschließlich ssh und ftp.
Einrichtung von Diensten die unter einem anderen als dem Default-Benutzernamen in der (x)inetd-Konfiguration laufen sollen.
Grundsätzliches Wissen über tcpwrappers, um einzelnen Hosts Zugriff zu erlauben oder zu verbieten.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
/etc/hosts.allow
/etc/hosts.deny
/etc/services
/etc/xinetd.conf
/etc/xinetd.d/
/etc/xinetd.log
/etc/inetd.conf

inetd - Der Superserver

Auf jedem Linux-System laufen zahlreiche Serverdienste, welche auf einem oder mehreren Ports lauschen, ob eine Anfrage aus dem Netzwerk für den jeweiligen Serverdienst bestimmt ist. So hört beispielsweise der Apache-HTTP-Server den Port 80 ab und bearbeitet die Anfragen, die auf diesem Port eintreffen. Dies ist ein beispiel von vielen weiteren zahlreichen Diensten, die unbemerkt im Hintergrund arbeiten. Mit dem Befehl nmap localhost kann man sich die offenen Ports anzeigen lassen und überprüfen, welche Dienste aktiv sind.

Zwar "schlafen" die meisten Serverdienste, da nicht kontinuierlich Anfragen eintreffen, aber der Speicherverbrauch steigt mit jedem gestarteten Serverdienst. Aus diesem Grund wurde der inted-Server entwickelt, der die Ports überprüft und bei Eintreffen einer Anfrage den jeweiligen Servierdienst nachlädt und wieder schließt. Somit überwacht ein einziger Dienst alle eingehenden Anfragen und leitet diese entsprechend weiter. Somit müssen nicht alle Serverdienste beim Booten gestartet werden, sondern werden nach Bedarf nachgeladen.

Inetd ist in der Lage sowohl TCP-, UDP- und RPC-Dienste zu starten. Dazu überwacht er die Ports und entscheidet anhand der Portnummer, an der eine Anforderung eintrifft, welcher Netzwerkdienst zu starten ist. In der Datei /etc/inetd.conf wird festgelegt, welche Ports überprüft und für welche Server der inetd-Server die Überwachung gestartet werden sollen. Natürlich sollten nur Dienste vom inetd übernommen werden, welche nicht von hoher Priorität sind und wo leicht verzögerte Antwortzeiten in Ordnung sind. Der Apache-Webserver sollte beispielsweise als eigenständiger Dämon die Ports belauschen und Anfragen beantworten.

Auszug der /etc/inetd.conf

cat /etc/inetd.conf
# [service_name] [sock_type] [proto] [flags] [user] [server_path] [args]
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal
#
# These are standard services.
#
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
#
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
nntp stream tcp nowait news /usr/sbin/tcpd /usr/sbin/leafnode
smtp stream tcp nowait root /usr/sbin/sendmail sendmail -bs

Erklärung der Spalten

Dienstbezeichnung / Service Name = Name des Serverdienstes, so wie er in der Datei /etc/services eingetragen ist.
Sockettyp / sock type = Schlüsselwörter: stream (ist ein streaming-socket), dgram (Telegrammtyp), raw (Rohdaten), rdm (reliably delivered message) und seqpacket (Sequenz von Paketen)
Protokoll = Ist der Name des Protokolls
[no]wait = wait bewirkt, dass der inetd nach dem Verbindungsaufbau neue Anforderungen erst entgegennimmt, wenn der UDP-Dienst seine Arbeit beendet hat. Mit nowait wird unverzüglich auf neue Anforderungen gewartet.
Benutzerkennung = Name des Benutzers, in dessen Auftrag der Dienst gestartet wird.
Dienstname = Vollständiger Programmname des Dienstes

/etc/services

In der Datei /etc/services stehen die Portnummern und dazu passende symbolische Namen.

# cat /etc/services
Name Port/Protokoll
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
...
...

/etc/hosts.allow, /etc/hosts.deny

Wenn man möchte, dass eingehende Anfragen auf Zugriffsrechte überprüft werden, so kann man den Dienst tcpd nutzen. Beispiel:

# Auszug /etc/inetd.conf
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd

tcpd überprüft nun die Dateien /etc/hosts.allow und /etc/hosts.deny, ob die Anfrage erlaubt ist oder geblockt werden soll. Hier das Beispiel der /etc/hosts.allow:

#/etc/hosts.allow

#Erlaube alle Dienste für das lokale Netz 192.168.
ALL:ALL:192.168.

#Erlaube SSH für das lokale Netz
sshd : 192.168.1.0/255.255.255.0 : ALLOW

xinetd - eXtended inetd

Der Superserver inetd hat eine Sicherheitslücke, die oben beschrieben wird. Es gibt nämlich keine Möglichkeit, den externen Zugriff auf die Ports zu überprüfen. Zwar kann man sich mittels tcpd behelfen, trotzdem können Sicherheitslöcher entstehen, welche durch den Nachfolger xinetd vermieden werden können. Xinetd steht für extended intd bietet eine eingebaute Zugriffskontrolle und eine direkte Unterstützung der Dateien /etc/hosts.allow und /etc/hosts.deny ohne den Umweg über tcpd.

Es gibt aber noch weitere Verbesserungen:

- denial of service Attacken können vermieden werden
- Logs werden geschrieben
- IPv6-Unterstützung
- Zeitgesteuerte Beschränkungen

xinetd wird über die Datei /etc/xinetd.conf konfiguriert. Die Syntax lautet:

// Konfiguration der Default-Sektion
defaults
{
Attribut Operator Wert(e)
...
}

// Konfiguration der einzelnen Dienste

service Dienstname
{
Attribut Operator Wert(e)
...
}

Eine Konfiguration könnte so aussehen:

  defaults
{
instances = 15
log_type = FILE /var/log/xinetd.log
log_on_success = HOST PID USERID DURATION EXIT
log_on_failure = HOST USERID RECORD
only_from = 192.0.0.0/8

disabled = shell login exec comsat
disabled += telnet ftp
disabled += name uucp tftp
disabled += finger systat netstat
}

service telnet
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/in.telnetd
only_from = 192.168.100.0
no_access = 192.158.100.56/192
flags = IDONLY
log_on_failure += RECORD
log_type = SYSLOG auth warn
}

Wichtige Einstellungen:

id = Eindeutige Identifizierung des Dienstes
flags = IDONLY: Eine Anforderung wird dann nur zugelassen, wenn der entfernte Benutzer identifiziert werden kann.
socket_type = Schlüsselwörter: stream (ist ein streaming-socket), dgram (Telegrammtyp), raw (Rohdaten), rdm (reliably delivered message) und seqpacket (Sequenz von Paketen)
protocol = Name des Protokolls
wait = Bei Yes wartet xinetd auf das Ende des Serverdienstes
user = Userkennung des Serverprozess
group = Gruppenkennung des Serverprozess
instances = Maximal Anzahl gleichzeitiger Prozesse
nice = Priorität des Serverprozesses.
server = Programmname des Servers (inklusive Pfad)
server_args = Argumente des Serverprozesses
only_from = Liste von Rechnern, von denen der Zugang erlaubt ist
no_access = Rechner, denen der Zugriff verwehrt wird
access_times = Tageszeit, zu der der Zugriff erlaubt ist
log_type = Typ der Logdateien
env = zusätzliche Umgebungsvariablen festlegen
passenv = Liste der Umgebungsvariablen, die der xinetd dem Server vererbt
port = Portnummer
bind = Bindet einen Dienst an ein spezielles Device

Weitere Informationen

http://www.linuxfibel.de/inetd.htm
http://www.selflinux.org/selflinux/html/grundlagen_sicherheit06.html
http://www.linuxfibel.de/nettest.htm