6.1.3. Konfigurierung von Portnummern und Serverdiensten

Im Kapitel 2 haben Sie schon erfahren, daß Server für "Standard-Anwendungen" üblicherweise feste Portnummern (well-known port numbers) haben. Aus Gründen der Flexibilität ist diese Portnummer aber meist nicht fest im Programmkode enthalten. Das Serverprogramm kennt nur den Namen "seines" Dienstes (z.B. telnet) und das zu verwendende Transportprotokoll (z.B. tcp). Mit diesen Informationen schaut das Serverprogramm in einer Datenbasis nach, die z.B. folgenden Inhalt haben kann:

# Network services, Internet style
# name       port/protocol   aliases
#
echo        7/tcp
echo        7/udp
discard     9/tcp       sink null
discard     9/udp       sink null
systat      11/tcp      users
daytime     13/tcp
daytime     13/udp
netstat     15/tcp
qotd        17/tcp      quote
chargen     19/tcp      ttytst source
chargen     19/udp      ttytst source
ftp         21/tcp
telnet      23/tcp
smtp        25/tcp      mail
time        37/tcp      timserver
time        37/udp      timserver
rlp         39/udp      resource   # resource location
nameserver  42/tcp      name       # IEN 116
whois       43/tcp      nicname
domain      53/tcp      nameserver # name-domain server
domain      53/udp      nameserver
mtp         57/tcp                 # deprecated
tftp        69/udp
rje         77/tcp      netrjs
finger      79/tcp
link        87/tcp      ttylink
supdup      95/tcp
hostnames   101/tcp       hostname   # usually from sri-nic
ns          105/tcp                  # ph name server
pop2        109/tcp       postoffice2
pop3        110/tcp       postoffice
sunrpc      111/tcp       portmapper
sunrpc      111/udp       portmapper
auth        113/tcp       authentication
sftp        115/tcp
uucp-path   117/tcp
nntp        119/tcp       readnews untp  
archie      191/udp                  # privileged archie port
#
# UNIX specific services
#
exec        512/tcp
biff        512/udp       comsat
login       513/tcp
who         513/udp       whod
shell       514/tcp       cmd        # no passwords used
syslog      514/udp
printer     515/tcp       spooler    # line printer spooler
talk        517/udp
ntalk       518/udp
efs         520/tcp                  # for LucasFilm
route       520/udp         router routed
timed       525/udp         timeserver
tempo       526/tcp         newdate
courier     530/tcp         rpc
conference  531/tcp         chat
netnews     532/tcp         readnews
netwall     533/udp                    # emergency broadcasts
uucp        540/tcp         uucpd      # uucp daemon
remotefs    556/tcp         rfs_server rfs  # Brunhoff rfs

ingreslock  1524/tcp
#archie     1525/udp       # non-privileged archie port

Bei Unix-ähnlichen Systemen finden sich diese Informationen üblicherweise in der Datei /etc/services. Der Eintrag einer Anwendung in dieser Datei bedeutet nicht, daß das betreffende Serverprogramm auch wirklich auf diesem Rechner läuft, er sichert nur, daß das Serverprogramm "seine" Portnummer findet, falls es gestartet wird.

Der Start von Serverprogrammen wird üblicherweise beim Systemanlauf automatisch veranlaßt. Wenn man nun sämtliche eventuell irgendwann einmal gebrauchten Server beim Systemanlauf startet, verbrauchen sie alle Speicher (und langweilen sich ;-). Um diese Situation zu verbessern, hat man bei Unix-ähnlichen Systemen einen "Superserver" inetd (Internet-Dämon) eingeführt. Dieser beobachtet nun ständig eine Liste von Server-Portnummern und startet den betreffenden Server (z.B. für TELNET) erst dann, wenn wirklich ein Klient eine Verbindung aufbauen will. Die Liste der so "betreuten" Server ist in der Datei /etc/inetd.conf enthalten. Hier ein einfaches Beispiel:

# service_name sock_type proto flags user server_path args
#
ftp    stream tcp nowait root /usr/etc/in.ftpd    in.ftpd
telnet stream tcp nowait root /usr/etc/in.telnetd in.telnetd
shell  stream tcp nowait root /usr/etc/in.rshd    in.rshd
login  stream tcp nowait root /usr/etc/in.rlogind in.rlogind
exec   stream tcp nowait root /usr/etc/in.rexecd  in.rexecd
talk   dgram  udp wait   root /usr/etc/in.talkd   in.talkd

Das Zeichen # markiert den Beginn eines Kommentars. In der ersten Zeile ist die Syntax der Einträge in Kurzform angegeben. Die einzelnen Elemente haben folgende Bedeutung:

service_name Name des Dienstes
sock_type Typ des Sockets: stream (für TCP) oder dgram (Datagramm; für UDP)
proto Transportprotokoll: tcp oder udp
flags wait: Server wartet auf das Ende der Behandlung eines Klienten
nowait: Server kann mehrere Klienten gleichzeitig behandeln
user Kennzeichen des Nutzers, mit dessen Rechten der Server auszuführen ist
server_path Pfadname des Serverprogramms
args Parameter beim Aufruf des Serverprogramms

Eine heute typische /etc/inetd.conf-Datei ist etwas umfangreicher:

# See "man 8 inetd" for more information.
#
# Echo, discard, daytime, and chargen are used primarily for testing.
echo	stream	tcp	nowait	root	internal
echo	dgram	udp	wait	root	internal
discard	stream	tcp	nowait	root	internal
discard	dgram	udp	wait	root	internal
daytime	stream	tcp	nowait	root	internal
daytime	dgram	udp	wait	root	internal
chargen	stream	tcp	nowait	root	internal
chargen	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	/usr/sbin/wu.ftpd
telnet	stream  tcp     nowait  root    /usr/sbin/tcpd	/usr/sbin/in.telnetd
# Secure Shell
ssh     stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/local/sbin/sshd -i
#
# The line below is set up for running Smail:
#smtp	stream  tcp     nowait  root    /usr/sbin/tcpd	/usr/bin/rsmtp	-bs
nntp	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.nntpd
#
# Shell, login, exec and talk are BSD protocols.
shell	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.rshd
login	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.rlogind
#exec	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.rexecd
talk	dgram	udp	wait	root	/usr/sbin/tcpd	/usr/sbin/in.ntalkd
ntalk	dgram	udp	wait	root	/usr/sbin/tcpd	/usr/sbin/in.ntalkd
#
# Pop mail servers
#pop2	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.pop2d
pop3	stream	tcp	nowait	root	/usr/sbin/tcpd	/usr/sbin/in.pop3d
#
# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers."  Many sites choose to disable 
# some or all of these services to improve security.
finger	stream	tcp	nowait	daemon	/usr/sbin/tcpd	/usr/sbin/in.fingerd
systat	stream	tcp	nowait	guest	/usr/sbin/tcpd	/usr/bin/ps	-auwwx
netstat	stream	tcp	nowait	guest	/usr/sbin/tcpd	/bin/netstat	-f inet

Gegenüber dem einfachen Beispiel vorher erkennen wir einige neue Dinge:

Bei vielen Unix-Systemen werden inetd-Konfigurationen installiert, die eine sehr große Anzahl von Diensten enthalten. Besonders in sicherheitskritischen Umgebungen sollte man darauf achten, nur solche Server zu aktivieren, die auch wirklich benötigt werden. Die anderen sollte man "ausschalten", d.h. aus der /etc/inetd.conf entfernen (oder auskommentieren).


© Uwe Hübner, 29.6.1998