8 TCP/IP-Dienste konfigurieren

Transcrição

8 TCP/IP-Dienste konfigurieren
8
TCP/IP-Dienste konfigurieren
In diesem Kapitel lernen Sie:
• Die Begriffe Ports, Sockets und Connections kennen. (LPI Lernziel 1.112.1)
• Den Zusammenhang der Ports von TCP/IP-Diensten mit der Datei /etc/services
kennen. (LPI Lernziele 1.112.1, 1.113.1)
• Den Internet-Superserver xinetd kennen. (LPI Lernziel 1.113.1)
• Die Funktionsweise des TCP-Wrappers kennen. (LPI Lernziele 1.113.1, 1.114.1)
8.1 Ports, Sockets und die Datei /etc/services
Ports,Sockets, Connections
Ports: −well−known−ports: /etc/services
−privilegierte Ports: 0−1023
−nur root kann sie binden
Sockets: −bind, listen, connect, accept
−bestehen aus IP−Adresse, Port und Prozeß
Connections:
−bestehen aus Quell/Ziel IP−Adressen,
deren Ports und zugehörigen Prozessen
Connection
20000
C
Port
192.168.0.1
80
S
192.168.0.2
Wie wir schon aus den vorangegangenen Abschnitten wissen, k önnen also sehr viele
Dienste gleichzeitig auf einem Server laufen. Wenn nun ein Client sich mit dem Server
verbindet, wie findet dann die Unterscheidung anhand des Dienstes statt, wenn man
bedenkt, daß der Server im Normalfall nur eine einzige IP-Adresse besitzt?
Aus diesem Grunde haben die Protokolle TCP und UDP ein Feld im Protokoll-Header
eingebaut, das die sogenannte Portnummer enthält. Durch diese kann man die Dienste,
die auf einem Rechner laufen, unterscheiden. Es gibt insgesamt 65535 Ports (=16 Bit),
187
TCP/IP-Dienste konfigurieren
von denen die Ports 1–1023 nur von Prozessen gebunden (=belegt) werden k önnen,
deren Eigentümer der Benutzer root ist ( privileged ports“ ).
”
Ein Socket ist durch IP-Adresse und Port definiert. Ein Socket geh ört zu einem Prozeß,
wobei ein Prozeß durchaus mehrere Sockets öffnen kann.
Die Verbindung von Client-IP-Adresse und Client-Port sowie Server-IP-Adresse und
Server-Port nennt man eine Connection . Sobald zwischen zwei Rechnern eine Connection besteht, können Server und Client sehr einfach kommunizieren. Eine Connection
wird in drei Schritten aufgebaut:
1. Ein Dienst auf den Server bindet (siehe man 2 bind) sich an den entsprechenden Port und lauscht (siehe man 2 listen), ob Verbindungsanfragen
eingehen (=offenes Socket). Dies geschieht gewöhnlich nur einmal, wenn der
betreffende Dienst gestartet wird.
2. Ein Client belegt eine zufällig bestimmte, freie Portnummer, (die zusammen mit
seiner IP-Adresse das Absender-Socket darstellt), stellt eine Verbindungsanfrage
an den Port des Dienstes auf dem Server. (siehe man 2 connect)
3. Der Dienst nimmt die Verbindung an oder lehnt sie ab (siehe man 2 accept)
Für bekannte Internet-Dienste sind standardmäßig bestimmte Ports definiert, wie zum
Beispiel Port 80 für HTTP oder Port 25 für SMTP oder Port 23 für telnet. Diese
Standardports nennt man auch well known ports . Diese werden von der Internet Assigned Numbers Authority, der IANA , festgelegt und sind in der Datei /etc/services
nachzuschlagen:
Ausschnitt aus /etc/services
tcpmux
echo
echo
1/tcp
7/tcp
7/udp
# TCP port service multiplexer
...
ftp-data
ftp
fsp
ssh
ssh
telnet
# 24 - private
188
20/tcp
21/tcp
21/udp
22/tcp
22/udp
23/tcp
fspd
# SSH Remote Login Protocol
# SSH Remote Login Protocol
8.2 Server mit eigenem Startskript
smtp
25/tcp
# 26 - unassigned
www
80/tcp
www
80/udp
pop-3
110/tcp
pop-3
110/udp
mail
http # WorldWideWeb HTTP
# HyperText Transfer Protocol
# POP version 3
...
Einige gebräuchliche TCP- und UDP-Ports
20 (TCP): FTP-Data, Datenkanal für FTP-Verbindungen
21 (TCP): FTP, Kommunikationssteuerung bei FTP-Verbindungen
22 (TCP/UDP): SSH, Secure Shell
23 (TCP): Telnet
25 (TCP): SMTP, Simple Mail Transfer Protocol
53 (TCP/UDP): DNS, Domain Name Service
80 (TCP/UDP): WWW/HTTP
110 (TCP/UDP): POP3, Post Office Protocol
119 (TCP): NNTP, Net News Transfer Protocol
139 (TCP/UDP): NetBIOS-SSN, Sitzungsdienst für Windows Netzwerke
143 (TCP/UDP): IMAP, Interim Mail Access Protocol
161 (UDP): SNMP, Simple Network Management Protocol
8.2 Server mit eigenem Startskript
189
TCP/IP-Dienste konfigurieren
Z
Hinweis: Im folgenden Text wird für einen Server-Prozeß, der im Hintergrund arbeitet, der Begriff Dämon verwendet.
Häufig benötigte Server werden bereits beim Booten des Systems gestartet und laufen
damit unabhängig von allen anderen Programmen (standalone ). Damit sind sie sehr
schnell abrufbereit, belegen aber andererseits permanent etwas Platz im Hauptspeicher.
Gestartet werden diese Server über Startskripte im Verzeichnis /etc/init.d/, genaugenommen über die entsprechenden Links in den Unterverzeichnissen der verschiedenen Runlevel in /etc/rcX.d, wobei X für die Nummer des Runlevels steht. Da bei
einigen Startskripten die Reihenfolge wichtig ist, (z.B. baut der NFS-Server auf dem
Portmapper auf) wird dem Namen des Links ein Buchstabe (S für Start und K für Kill)
sowie eine zweistellige Priorität vorangestellt.
Beispiel für das Startskript und die entsprechenden Links des Mailservers sendmail:
nagold:˜ #
lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
-rwxr--r--
ls -l
1 ...
1 ...
1 ...
1 ...
1 ...
/etc/init.d/sendmail /etc/rc*.d/*sendmail
11 Feb 23 19:49 /etc/rc3.d/K12sendmail ->
11 Feb 23 19:49 /etc/rc3.d/S10sendmail ->
11 Feb 23 19:49 /etc/rc5.d/K12sendmail ->
11 Feb 23 19:49 /etc/rc5.d/S10sendmail ->
01 Jan 19 11:15 /etc/init.d/sendmail
../sendmail
../sendmail
../sendmail
../sendmail
sendmail wird in diesem Beispiel im Runlevel 3 und 5 gestartet und beim Verlassen
derselben wieder gestoppt. Mit der Priorität 10 liegt er ziemlich im Mittelfeld und
startet, wie alle Server, nach der Initialisierung der Netzwerkkarte und des Routings.
Um einen Server zusätzlich oder nicht mehr zu starten, wird normalerweise der entsprechende Link gesetzt bzw. gelöscht. Wer beispielsweise den WWW-Server Apache
nicht benötigt, entfernt die entsprechenden Links wie folgt:
# cd /etc/
# rm rc*.d/*apache
Soll hingegen der Nameserver im Runlevel 5 gestartet werden, dann werden die Links
neu gesetzt.
# cd /etc/rc4.d
# ln -s ../init.d/named S10named
# ln -s ../init.d/named K12named
Natürlich kann man die entsprechenden symbolischen Links von Hand anlegen, einfacher ist es aber wie folgt (hier für unser Beispiel Apache, der in den Runleveln 2,3 und
5 automatisch starten soll):
Bei SuSE mit dem folgendem Befehl:
190
8.2 Server mit eigenem Startskript
# chkconfig apache 235
Man kann aber auch den Runlevel-Editor von SuSE verwenden. Der findet sich bei
YaST unter System→Runlevel-Editor.
Bei Fedora/RedHat lautet der Befehl:
# chkconfig --level 235 httpd on
Als grafisches Administrations-Tool für diese Aufgabe gibt es bei Fedora/RedHat das
Program system-config-services.
Wir werden später, bei dem Thema Sicherheit, auf die Startskripte und Variablen
zurückkommen, weil nicht benötigte Server ein unnötiges Sicherheitsrisiko darstellen.
191
TCP/IP-Dienste konfigurieren
8.3 Der Internet-Dämon (x)inetd und der TCP-Wrapper
xinetd − Der Internet Super−Server
−lauscht stellvertretend für andere Dienste
−startet Dienste nur auf Anfrage
−wahlweise TCP−Wrapper für Zugriffskontrolle
−Konfiguration: /etc/xinetd.conf
TCP−Wrapper: flexible Zugriffskontrolle
−Konfiguration: /etc/hosts.allow
/etc/hosts.deny
hosts.allow
hosts.deny
C
xinetd
C
8.3.1
xinetd.conf
S
xinetd — der Internet-Super-Server
Einen Prozeß, der im Hintergrund läuft, um nützliche Systemdienste zu verrichten,
nennt man Daemon, oder, auf Deutsch: Dämon. In der Regel existiert für jeden Netzwerkdienst ein Dämon, der auf dem entsprechenden Port lauscht, und den Dienst zur
Verfügung stellt.
Vorteile:
• Ein Server belegt nur dann Platz im Hauptspeicher, wenn er auch tatsächlich
benötigt wird.
• Der xinetd kann schon vor dem Start des Servers eine Zugriffskontrolle durchf ühren.
• Die Root-Rechte für das Öffnen eines privilegierten Ports können bereits vor
dem Start des Servers abgegeben werden.
Nachteil: Der Server startet mit Verzögerung, da der bei Bedarf gestartete Dämon erst
geladen und gestartet werden muß.
Der xinetd ist ein Nachfolger des älteren inetd mit erweitertem Funktionsumfang. Distributionen wie SuSE und Fedora/RedHat verwenden xinetd inzwischen
192
8.3 Der Internet-Dämon (x)inetd und der TCP-Wrapper
als Standard. Dieser bietet gegenüber inetd vor allem eigene Zugriffskontrollen und
verbessertes Logging.
Geändert hat sich auch das Format der Konfigurationsdatei(-en).
Bei Fedora/RedHat und SuSE existiert nun eine Konfigurationsdatei /etc/xinetd.conf,
in welcher die Default-Einstellungen definiert sind. Diese gelten immer dann, wenn in
der Konfigurationsdatei für den einzelnen Dienst keine expliziten Einstellungen definiert sind. Für jeden Dienst gibt es im Verzeichnis /etc/xinetd.d/ eine Datei, welche denselben Namen wie der Dienst trägt.
Die Datei /etc/xinetd.conf:
defaults {
log_type
log_on_success
log_on_failure
only_from
instances
interface
disabled
disabled
}
=
=
=
=
=
=
=
=
FILE /var/log/xinetd.log
HOST EXIT DURATION
HOST ATTEMPT RECORD
localhost .example.com
2
192.168.1.24
ftp rstatd telnet
shell
Im Abschnitt defaults werden hier vor allem Einstellungen zum Logging vorgenommen, das für alle Services gleich sein soll. Es ist jedoch auch möglich, für einzelne
Dienste andere Logfiles und Logging-Optionen einzustellen. Weiterhin wird der Zugriff auf die Dienste generell beschränkt auf die Rechner der Domäne example.com
und den Server selbst (localhost).
Die Variable instances erlaubt es, die Anzahl der Serverprozesse f ür einen einzelnen
Dienst zu beschränken. Im Beispiel ist diese Grenze mit 2 sehr niedrig angesetzt. In
einem Server mit mehreren Interfaces kann man den Zugriff sinnvollerweise auch auf
bestimmte Interfaces beschränken. Das Schlüsselwort disable erlaubt es schließlich,
bestimmte konfigurierte Dienste zu deaktivieren.
Eine typische Datei /etc/xinetd.d/telnet für den Dienst telnet könnte etwa folgendermaßen aussehen:
service telnet {
disable = no
socket_type
protocol
wait
user
=
=
=
=
stream
tcp
no
root
193
TCP/IP-Dienste konfigurieren
instances = 60
server
= /usr/sbin/in.telnetd
server_args
= -n
no_access
= badguy.example.com
log_on_failure += USERID
}
Für den einzelnen Dienst werden Socket-Typ und Protokoll (meist stream und tcp,
manchmal dgram und udp) eingestellt. Die Variable wait legt fest, ob der Dienst multithreaded ist, oder nicht. Normalerweise steht hier wait = no, denn die meisten Dienste sind multithreaded und können mehrere Verbindungen gleichzeitig aufrechterhalten. Der Parameter user legt fest, mit wessen Berechtigungen der Prozess ausgef ührt
werden soll. Normalerweise steht hier root oder nobody.
Die Variablen server und server args beinhalten den Pfadnamen des zu startenden
Servers, sowie die zu übergebenden Argumente. Zusätzliche Zugriffsbeschränkungen
erlauben es, den Dienst für bestimmte Rechner freizuschalten oder zu sperren. Im Beipiel wird ein einzelner Rechner aus der freigeschalteten Domäne example.com gesperrt.
inetd − Der Internet Super−Server
−lauscht stellvertretend für andere Dienste
−Startet Dienste nur auf Anfrage
−benutzt tcpd für Zugriffskontrolle
−Konfiguration: /etc/inetd.conf
tcpd: Zugriffskontrolle diensteweise auf Host−Basis
−Konfiguration: /etc/hosts.allow
/etc/hosts.deny
tcpd
C
inetd
C
8.3.2
194
inetd
S
hosts.allow
hosts.deny
inetd.conf
S
8.3 Der Internet-Dämon (x)inetd und der TCP-Wrapper
Achtung: inetd und xinetd haben die gleiche Aufgabe. Entscheiden Sie sich f ür
den einen oder anderen, aber installieren Sie auf keinen Fall beide gleichzeitig!
!
In der Konfigurationsdatei /etc/inetd.conf, die das Verhalten des inetd bestimmt,
kann man jeden einzelnen Dienst durch einen entsprechenden Eintrag freischalten,
oder sperren, indem man die zugehörige Zeile mit einem Kommentarzeichen(#) versieht.
!
Achtung: Die Änderungen werden erst wirksam, falls der inetd neu gestartet wird.
Dies läßt sich mit kill -HUP ‘cat /var/run/inetd.pid‘ oder dem entsprechenden Startskript erledigen.
Auszug aus /etc/inetd.conf
...
ftp
stream
telnet stream
#
# Shell, login,
#
shell
stream
login
stream
#exec
stream
#comsat dgram
talk
dgram
ntalk
dgram
#dtalk stream
#pop-3 stream
...
!
tcp
tcp
nowait
nowait
root
root
/usr/sbin/tcpd
/usr/sbin/tcpd
in.ftpd -l -a
in.telnetd
exec, comsat and talk are BSD protocols.
tcp
tcp
tcp
udp
udp
udp
tcp
tcp
nowait
nowait
nowait
wait
wait
wait
wait
nowait
root
/usr/sbin/tcpd in.rshd
root
/usr/sbin/tcpd in.rlogind
root
/usr/sbin/tcpd in.rexecd
root
/usr/sbin/tcpd in.comsat
nobody.tty /usr/sbin/tcpd in.talkd
nobody.tty /usr/sbin/tcpd in.ntalkd
nobody.tty /usr/sbin/tcpd in.dtalkd
root
/usr/sbin/tcpd ipop3d
Achtung: Aus Sicherheitsgründen gilt die Regel, daß man grundsätzlich jeden Dienst,
von dem man nicht genau weiß, daß man ihn braucht, abstellt, denn keine Software ist
vollkommen. Manche Dienste, wie die Berkeley r-Dienste in.rshd, in.rlogind,
in.rexecd sind so unsicher, daß man sie am besten nicht verwenden sollte!
8.3.3
Der TCP-Wrapper
inetd verfügt im Gegensatz zu xinetd nicht über einen eigenen Mechanismus zur
Zugriffsbeschränkung. Ist eine Zugriffskontrolle jedoch erforderlich, so übergibt man
195
TCP/IP-Dienste konfigurieren
das Server-Programm (mit Kommandozeilenoptionen) dem tcpd als Argument. Dieser prüft dann zuerst mittels der Datei /etc/hosts.allow, ob der anfragende Rechner
generell Zugriff auf diesen Dienst hat. Ist das Ergebnis positiv, so wird der Zugriff gestattet.
Erst danach wird geprüft, ob der anfragende Rechner generell abgelehnt werden soll.
Dies ist aber nur möglich, falls diesem nicht schon in der /etc/hosts.allow das OK
gegeben wurde.
Steht weder in /etc/hosts.allow noch in /etc/hosts.deny eine Regel, die auf den
entsprechenden Dienst oder Rechner zutrifft, wird der Zugriff generell gestattet.
Die Standardkonfiguration gestattet allen den Zugriff auf alle Dienste (beide Dateien
leer).
Syntax von /etc/hosts.∗:
Dienst : Host-Spezifikation [ : twist Kommandozeile˜]
Dienst:
• Hier muß der Name des Dämons stehen, also z.B. in.telnetd.
• ALL, wenn alle Dienste gemeint sind
• ALL EXCEPT Dienst, falls alle Dienste außer einigen wenigen betroffen sind.
Beispiel:
ALL EXCEPT in.ftpd in.telnetd
Host-Spezifikation:
• Eine einzelne IP-Adresse oder ein Host-Name, also z.B.
192.168.0.254 oder hacker.foo.com
• Ein Sub-Netz, wie z.B. 192.168.0.
• Ein Sub-Netz in der Notation Netzwerk/Netzmaske, z.B.:
192.168.0.0/255.255.255.0
• Eine ganze Domäne, wie z.B. .foo.com
196
8.3 Der Internet-Dämon (x)inetd und der TCP-Wrapper
• LOCAL, also alle Hosts, die über den DNS in einen einzelnen Namen aufgelöst
werden, wie z.B. hacker
• ALL, für alle Hosts
• Host-Spezifikation EXCEPT Host-Spezifikation, falls man von
den links angegebenen Hosts die rechts angegebenen ausschließen m öchte:
192.168. EXCEPT .foo.com 192.168.3.
twist... ersetzt den Dämon durch ein anderes Programm. Die Ein/Ausgabekanäle
dieses Programms werden von twist mit dem Socket des Dienstes verbunden. Um
dem Rechner hacker.foo.com statt einem telnet-login eine Fehlermeldung zu präsentieren, genügt eine Zeile in /etc/hosts.deny:
in.telnetd: hacker.foo.com : twist echo "No Hackers!"
Will man seine Konfiguration auf Syntaxfehler prüfen, so verwendet man das Programm tcpdchk. Will man die Funktion lokal testen (man hat ja selten Zugriff auf
die Rechner, die man aussperren will...), so verwendet man tcpdmatch Dienst
Host. Daraufhin erfährt man, ob, und mit welcher Regel der Zugriff erlaubt, bzw.
verweigert wurde.
Dokumentation: Siehe man 5 hosts access und man 5 hosts options
Z
Hinweis: xinetd kann mit der Option --with-libwrap kompiliert werden und
unterstützt dann ebenfalls die Zugriffskontrollen des TCP-Wrappers. Diese werden
dann ausgeführt bevor xinetd seine eigenen Zugriffskontrollen ausf ührt.
197
TCP/IP-Dienste konfigurieren
8.4 Wissensfragen
1. In welchen TCP/IP-Protokollen sind Ports implementiert? Mit welchem Protokoll ist es möglich, Verbindungen (Connections) aufzubauen?
2. Auf welcher TCP/IP-Schicht sind Ports und Connections definiert?
3. In welcher Datei ist zugeordnet, welcher Dienst-Name f ür welchen Port steht?
4. Was ist die Aufgabe des xinetd, und wie heißt seine Konfigurationsdatei?
5. Welche Vor- und Nachteile hat es, einen Dienst nicht eigenständig (standalone),
sondern über xinetd zu betreiben?
6. Mit welchen zwei Konfigurationsdateien kann man festlegen, welche IP-Adreßbereiche
Zugriff auf bestimmte Dienste haben bzw. keinen Zugriff auf diese Dienste haben?
7. Wenn in keiner dieser Konfigurationsdateien eine Regel f ür ein ankommendes
Paket steht, dann ist der Zugriff auf einen Dienst:
q verboten
q erlaubt
8. Wenn für ein spezielles Paket eine Erlaubnisregel und eine Sperregel existiert,
welche hat Vorrang?
q Die Erlaubnisregel
q Die Sperregel
198
8.4 Wissensfragen
9. Welche Man-Pages gehören zu den Konfigurationsdateien des tcpd?
10. Mit welchem Kommando kann man die Syntax dieser Konfigurationsdateien
überprüfen lassen?
11. Mit welchem Kommando kann man die Funktionsweise des Regelwerks dieser
Dateien testen, wenn man nicht extra Zugriff auf andere Rechner im Netz hat,
und sehen will, ob der Rechner gnarf.cracker.org Zugriff auf den telnetDienst hat?
199
TCP/IP-Dienste konfigurieren
200
8.5 Übungen
8.5
Übungen
1. Auf welchen Ports lauschen die Dienste pop-3, ssh und telnet?
2. Konfigurieren Sie den inetd so, daß der Dienst pop-3 zur Verf ügung steht.
3. Konfigurieren Sie den xinetd so, daß der Dienst pop-3 zur Verf ügung steht.
4. Sorgen Sie dafür, daß die Änderungen wirksam werden.
5. Lesen Sie die Handbuchseite von telnet, um herauszufinden, wie sie sich mit
telnet an den Port des Dienstes pop-3 (Red Hat) bzw. pop3 (SuSE) anschließen können.
6. Testen Sie mit telnet, ob der Dienst funktioniert.
7. Benutzen Sie den tcpd, um für alle Dienste alle Hosts, außer die im eigenen
Subnetz, auszusperren. Nur der Dienst ftp soll für die ganze Welt zugänglich
sein.
8. Konfigurieren Sie ihren Rechner so, daß nur noch die Dienste FTP und TELNET
auf Ihrem Rechner angeboten werden.
201
TCP/IP-Dienste konfigurieren
8.6 Lösungen
1. # grep pop-3 /etc/services
# grep ssh /etc/services
# grep telnet /etc/services
2. Bei Verwendung von inetd entfernen Sie die Kommentarzeichen in folgener
Zeile aus /etc/inetd.conf:
pop-3
stream
tcp
nowait
root
/usr/sbin/tcpd
ipop3d
3. Bei Verwendung von xinetd fügen Sie in der Datei /etc/xinetd.conf gegebenenfalls folgende Zeilen ein:
service pop3 {
socket_type
protocol
wait
user
server
server_args
}
=
=
=
=
=
=
stream
tcp
no
root
/usr/sbin/ipop3d
-s
und stellen Sie sicher, daß der Dienst im Abschnitt defaults nicht als disabled
markiert ist. Verwenden Sie z.B. SuSE oder Fedora/RedHat, schreiben Sie obigen Abschnitt in eine eigene Datei im Verzeichnis /etc/xinetd.d. Normalerweise wird eine solche Datei sogar bei Installation des mitgelieferten RPMPaketes für das POP3-Paket mitinstalliert. Sie müssen dort nur noch die Zeile
disabled = yes entfernen.
4. Danach zum Reload der Konfigurationsdatei ein HUP-Signal an inetd schicken:
# kill -HUP ‘cat /var/run/inetd.pid‘
5. Danach ein Reload der Konfigurationsdatei ausführen, bei SuSE zum Beispiel
mit
# /etc/init.d/xinetd reload
6. # telnet Host 110
oder
202
8.6 Lösungen
# telnet Host pop-3
7. # telnet zielhost 110
Trying 192.168.0.254...
Connected to zielhost.
Escape character is ’ˆ]’.
+OK POP3 zielhost v7.64 server ready
QUIT
+OK Sayonara
Connection closed by foreign host.
8. Konfiguriere:
/etc/hosts.allow
in.ftpd:
ALL
/etc/hosts.deny
#Hier eigenes Subnetz eintragen
ALL: ALL EXCEPT 192.168.1.0/255.255.255.0
9. Alles außer den Zeilen, die mit telnet und ftp beginnen, auskommentieren.
203
TCP/IP-Dienste konfigurieren
204

Documentos relacionados