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