Der Feind lauert überall: Nicht nur das Einrichten einer Firewall oder der Einsatz eines Viren-Scanners, sondern auch das Abschalten von Diensten trägt dazu bei, den eigenen Rechner zu schützen. Wir zeigen, wie Sie Ihren Linux-PC ein bisschen besser abschotten.
Sicherheit hat viele Aspekte. Die eines Computer-Systems verbessert sich nicht nur durch den Einsatz einer Firewall oder eines Viren-Programms, auch das Entfernen von Risikofaktoren trägt dazu bei. Im Englischen nennt man das “Operating System Hardening”, etwa “das Betriebssystem (ab)härten”. Dabei schaltet man erst einmal Dienste ab, die man nicht braucht und die über Sicherheitslöcher Angriffsmöglichkeiten bieten können.
Zu Ihren Diensten
Die meisten Linux-Distributionen installieren standardmäßig jede Menge Programme und Dienste; oft starten diese sogar automatisch. Welche Netzwerkdienste im Hintergrund arbeiten, erfahren Sie mit dem Befehl netstat (Listing 1).
Listing 1
<I>netstat<I> zeigt Netzwerkverbindungen
antony@mars:~$ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:login *? LISTEN tcp 0 0 *:shell *? LISTEN tcp 0 0 *:time *? LISTEN tcp 0 0 *:netbios-ssn *? LISTEN tcp 0 0 *:finger *? LISTEN […]
Die netstat-Ausgabe zeigt eine Liste aller aktiver Netzwerkverbindungen Ihres Systems. Jeder Eintrag steht für einen Dienst, der vom jeweils angebundenen Netz (Intra- oder Internet) aus erreichbar ist. Die meisten dieser Services (selbst wenn ihre Implementation keine Sicherheitslöcher enthält) verraten über Ihren Computer oder sogar über Sie Details, die nicht unbedingt für den Rest der Welt bestimmt sind. Es empfiehlt sich daher, nicht benötigte Services auszuschalten oder sogar ganz zu deinstallieren.
In der netstat-Ausgabe aus Listing 1 sehen Sie den Eintrag finger. Dieser Dienst verrät einiges über den Rechner oder dessen Benutzer – und das nicht nur lokal, sondern auch auf entfernten Maschinen (Listing 2).
Listing 2
Der <I>finger<I>-Dienst
antony@mars:~$ finger pooh@saturn
[saturn.rockstone.co.uk]
Login: pooh Name: Pooh Bear
Directory: /home/pooh Shell: /bin/bash
Last login Sun Apr 27 14:55 (BST) on ttyp0 from jupiter
New mail received Sat May 10 12:59 2003 (BST)
Unread since Fri May 9 15:18 2003 (BST)
No Plan.
Wie Sie sehen, gibt er einige recht vertrauliche Dinge preis: der Vor- und Nachnamen des Benutzers, Datum und Uhrzeit des letzten Login, den Name des Rechners, von dem aus die letzte Anmeldung erfolgte, oder mit Datum und Uhrzeit, wann User pooh die letzte Mail empfangen und gelesen hat. Der finger-Dienst ist ein Überbleibsel aus den Anfängen des Internets, als die Zahl der Nutzer noch überschaubar und die Übermittlung von Information wichtiger war als deren Schutz. Heutzutage gibt es fast keinen Grund mehr, den finger-Service auf einem Computer anzubieten – erst recht nicht über’s Internet.
Doch nicht nur die unerwünschte Informationsweitergabe birgt Risiken. Netzwerkdienste können Sicherheitslöcher haben, durch die fremde Benutzer Ihren Rechner betreten und eventuell root-Rechte erlangen können.
Bevor Sie damit anfangen, Dienste abzuschalten, lohnt es sich klarzumachen, wie Linux Daten vor lokalen und fremden Benutzern schützt. Abbildung 1 zeigt, über welche Ebenen Daten für Benutzer erreichbar sind: Nur wenn Sie Anwendungen und Daemons kontrollieren, können Sie den Zugriff auf sensible Daten beeinflussen.
Gehen wir davon aus, dass auf dem System keine Software mit nennenswerten Sicherheitslücken installiert ist. In dem Fall liegt der Hauptaugenmerk auf den Daemons. Nicht richtig konfiguriert, ermöglichen sie unter Umständen Zugriff auf sensible Daten. Noch viel schlimmer: Sie bilden häufig die Eingangstür für unerwünschte Besucher.
Daemons austreiben
Ein wichtiger Schritt zu mehr Sicherheit besteht daher darin, überflüssige Netzwerkdienste zu finden und abzuschalten. Viele davon kontrolliert der Super-Daemon inetd: Er startet sie nur dann, wenn sie benötigt werden – eine effizientere Lösung als die, dass ständig ein eigener Daemon für jeden Service läuft. In der Datei /etc/inetd.conf (Listing 3) findet inetd die Informationen darüber, welche Dienste wie gestartet werden.
Listing 3
Auszüge aus <I>/etc/inetd.conf<I>
ftp stream tcp nowait root /usr/sbin/tcpd proftpd # telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L login stream tcp nowait root /usr/sbin/tcpd in.rlogind # exec stream tcp nowait root /usr/sbin/tcpd in.rexecd # talk dgram udp wait root /usr/sbin/tcpd in.talkd ntalk dgram udp wait root /usr/sbin/tcpd in.talkd finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u # systat stream tcp nowait nobody /usr/sbin/tcpd /bin/ps -auwwx # netstat stream tcp nowait root /usr/sbin/tcpd /bin/netstat -a auth stream tcp wait nobody /usr/sbin/in.identd in.identd -P/dev/null
Zeilen, welche mit einer Raute # beginnen, ignoriert der inetd. Ein erster Schritt zum sicheren System ist also das Abschalten diverser Services durch Auskommentieren der Einträge in /etc/inetd.conf.
Grundsätzlich gilt: Wird ein Dienst nicht benötigt, schalten Sie ihn ab. Sie sollten auf der Maschine nur die Services starten, die Sie wirklich brauchen. Einige Dienste sind sogar so unsicher, dass wir völlig davon abraten (siehe Kasten 1).
Kasten 1: Unsichere Dienste
Einige Netzwerkdienste und -Protokolle sind so unsicher, dass Sie nach Möglichkeit völlig auf sie verzichten sollten:
*telnet erlaubt das Einloggen auf anderen Rechnern. Anders als bei ssh gehen dabei aber der Benutzername und das Passwort (und alle weiteren Kommandos) im Klartext über das Netz. Mit sogenannten “Paket-Sniffer”, die telnet-Verbindungen zwischen Client und Server abhören, kommen bösartige Mitbenutzer des Netzes an diese sensiblen Daten.
- rsh ist sogar noch unsicherer, weil dieser Dienst so konfiguriert werden kann, dass Verbindungen ohne Passwort-Abfrage aufgebaut werden dürfen. Ein unbefugter Eindringling muss also nicht mal mehr das Passwort raten.
Eiserne Sicherheitsregel: Verzichten Sie am besten auf alle Dienste, die kein Passwort erfordern oder die dieses unverschlüsselt über’s Netz schicken. Dazu gehören außer den besprochenen beispielsweise ftp, rlogin, pop3 und nfs. All diese Protokolle können sicherer gemacht werden, indem sie mit ssh “getunnelt” werden (siehe dazu auch die weiteren Artikel im Schwerpunkt).
Nachdem Sie alle überflüssigen Einträge in /etc/inetd.conf auskommentiert haben, kann es gut sein, dass Sie nur noch ein oder zwei Einträge übrig haben – nicht ungewöhnlich für ein halbwegs sicheres System. Anschließend muss der inetd neu gestartet werden:
kill -HUP `cat /var/run/inetd.pid`
Zur Sicherheit schauen Sie mit netstat -a nach, was noch läuft – das Programm darf die abgeschalteten Dienste nicht mehr anzeigen.
Offene Türen
Nicht alle Dienste, die von netstat angezeigt werden, tauchen in /etc/inetd.conf auf; sie werden also offenbar anders gestartet. Das gilt beispielsweise für den ssh-Daemon:
antony@mars:~$ ps ax | less […] 499 ? S 0:00 /usr/sbin/sshd
Mit dem Kommando ps lassen Sie sich alle laufenden Prozesse anzeigen [1], darunter auch die Daemonen, die nicht von inetd abhängen. Das Pipe-Zeichen leitet dessen Ausgabe an den Befehl less weiter, welcher sie seitenweise anzeigt. Zu den Netzwerkdiensten, die Sie abschalten sollten (sofern Sie sie nicht unbedingt benötigen), zählen nmbd und smbd, named und httpd. nmbd und smbd gehören beide zu Samba; sie sorgen für Datei- und Druckdienste für Windows-Netzwerke. Der “Domain Name Server” named löst Namen, wie z. B. “www.linux-user.de”, zur IP-Adresse 62.245.157.217 auf. In seiner eigenschaft als Webserver nimmt httpd Anfragen von Browsern entgegen und bearbeitet sie.
Beachten Sie, dass nicht jeder Service, der auf “d” endet und dessen Bedeutung Ihnen nicht sofort klar ist, ausgeschaltet werden muss. Einige Daemons brauchen Sie sogar unbedingt für den Betrieb Ihres Rechners, z. B. syslogd, klogd, kswapd oder apmd. syslogd und klogd zeichnen beide für die Log-Dateien zuständig. Fehler- oder Protokollausgaben von Programmen fängt der syslogd auf und leitet sie in die Logfiles weiter. Der klogd nimmt seine Arbeit beim Systemstart vor allen anderen Daemons auf und protokolliert anschließend die Meldungen des Kernels. Der “Kernel Swap Daemon” kswapd überwacht die Swap-Bereiche (Partitionen oder Dateien) und behandelt Speicheranforderungen von Programmen, die nicht vom physikalisch vorhandenen Arbeitsspeicher abgedeckt werden können. Auf Laptops schaltet der “Advanced Power Management Daemon” apmd beispielsweise nicht benutzte Festplatten ab, um Strom zu sparen, und gibt Auskunft über die Batterieleistung.
Ports unter der Lupe
Noch mehr über angebotene Netzwerkdienste lässt sich mit sogenannten Port-Scans herausfinden. Programme wie das von Trinity in “Matrix reloaded” benutzte nmap überprüfen dabei, welche Services ein Rechner über’s Netz anbietet. Sie testen jeden möglichen TCP– und UDP-Port und sprechen so außer ein paar exotischen Services (wie z. B. Novell IPX oder IPsec Virtual Private Network Support) alle Netzwerkdienste an, um zu sehen, hinter welchen Ports Server antworten.
Am besten starten Sie einen solchen Port-Scan von einem anderen Computer aus – ohne Firewall oder andere Filter-Systeme im Weg. Beachten Sie dabei bitte, dass Sie nur eigene Rechner scannen, da Sie sich sonst eventuell strafbar machen. Admins fremder Rechner werden sich über einen Einbruchsversuch, auch wenn es “nur” ein Test war, nicht gerade freuen und entsprechend reagieren. Alternativ lässt sich über die Website http://www.port-scan.de/ der eigene Rechner auf offene Türen hin überprüfen (Abbildung 2).
Das Kommandozeilen-Tool nmap darf nur der Super-User root starten. Es zeigt an, welche Ports offen oder geschlossen sind. In Listing 4 warten acht TCP-Ports auf dem Rechner saturn auf Anfragen; nmap bezeichnet sie in der Zusammenfassung als open. Zu den typischen Abschaltkandidaten zählen in diesem Beispiel telnet und ftp.
Listing 4
Port-Scan mit <I>nmap<I>
root@mars:~# nmap saturn Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-05-20 17:09 BST Interesting ports on 192.168.1.13: (The 1615 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 37/tcp open time 111/tcp open sunrpc 113/tcp open auth 139/tcp open netbios-ssn 515/tcp open printer Nmap run completed – 1 IP address (1 host up) scanned in 4.175 seconds
Kehraus
Die meisten einzeln und nicht über indetd zu startenden Daemons nehmen beim Booten ihren Dienst auf – und das sollen sie beim nächsten Systemstart nicht wieder. Um sie aus der dabei abgearbeiteten “Liste” zu entfernen, verwenden die verschiedenen Linux-Distributionen unterschiedliche Tools: Bei Debian erledigt das Perl-Skript update-rc.d oder noch einfacher das Tool rcconf diese Aufgabe. Starten Sie dieses als root, und deaktivieren Sie die unnötigen Dienste. Nach Bestätigen durch Ok löscht update-rc.d die Symlinks der entsprechenden Daemon-Start-Skripte in /etc/rc*.d.
Bei SuSE finden Sie den Runlevel-Editor im Arbeitsmenü unter Administration / YaST2 Module / System / Runlevel-Editor. Red-Hat-Anwender benutzen das Shell-Tool chkconfig, das eine sehr hilfreiche Manpage mitbringt. Alternativ lassen sich die symbolischen Links für die nicht länger erwünschten Dienste in den Verzeichnissen /etc/rc.d/rc0.d, /etc/rc.d/rc1.d usw. auch von Hand löschen.
Slackware besitzt kein spezielles Tool zur Runlevel-Konfiguration. Hier müssen Sie die entsprechenden Dateien im Verzeichnis /etc/rc.d (z. B. /etc/rc.d/rc.inet2) von Hand editieren. Setzen Sie in dieser Datei einfach das Raute-Zeichen # vor die unerwünschten Einträge.
All diese Änderungen treten erst beim nächsten Neustart des Rechners in Kraft. Wollen Sie nicht solange warten und laufende Netzwerkdienste sofort loswerden, rufen Sie das entsprechende Init-Skript als root mit dem Argument stop auf. So beendet
root@venus # /etc/init.d/postfix stop Shutting down mail service (Postfix)
den Mailserver postfix. Alternativ finden Sie mit dem ps-Kommando die Prozess-ID des jeweiligen Daemons heraus. Diese steht in der ersten Spalte der Ausgabe unter PID. Anschließend werden Sie ihn mit dem Befehl kill los:
kill prozessnummer
Platte geputzt
Nachdem alle unsicheren Dienste abgeschaltet sind, sollten hoffentlich keine sensiblen Daten mehr über’s Netz geschickt oder Türen für Angreifer geöffnet werden. Natürlich kann es auch immer Sicherheitslücken in anderen Programmen, die Sie wirklich benötigen, geben. Websites wie [3–5] geben Informationen über bekannte Sicherheitsprobleme und liefern Anleitungen, wie entsprechende Security-Fixes eingespielt werden.
Am besten schalten Sie unerwünschte Dienste nicht einfach nur ab, sondern deinstallieren Sie sie wirklich. Überschreibt ein Distributions-Upgrade beispielsweise die veränderte Datei /etc/inetd.conf, antworten plötzlich die einstmals sorgfältig auskommentierten Netzwerkdienste wieder auf Anfragen. Ein deinstallierter fingerd startet jedoch auch dann nicht. Sollten Sie einen abgeschalteten Dienst zu einem späteren Zeitpunkt doch benötigen, lässt er sich jederzeit neu installieren.
Sobald Sie mit der Abschalterei ferig sind, vergessen Sie nicht, das System nochmal mit einem Port-Scan zu testen.
Schotten dicht?
Operating System Hardening kann und sollte aber noch weiter gehen: * Entfernen Sie überflüssige Benutzerzugänge (Accounts). * Überprüfen Sie Datei- und Gruppenrechte. * Wählen Sie sichere Passwörter, die schwierig zu knacken sind. * Verwenden Sie einen Kernel, der lediglich die Dienste und Protokolle unterstützt, die Sie brauchen.
Wie eingangs erwähnt: Sicherheit hat viele Aspekte und lässt sich auf unterschiedlichen Wegen verbessern. Die in diesem Artikel vorgeschlagenen Maßnahmen können dazu beitragen, potentiellen Angreifern das Leben ein bisschen schwerer zu machen.
Glossar
- Auskommentieren
- Einträge in einer Konfigurationsdatei werden ignoriert, wenn sie mit einem speziellen Zeichen markiert sind. Sehr oft wird hierfür die Raute verwendet.
- Port
- Über Netzwerk-Ports von 0 bis 65535 können auf einem System Netzwerkdienste angesprochen werden. Viele Port-Nummern sind standardisiert einem bestimmten Dienst zugewiesen (z. B. läuft der DNS auf Port 53), andere lassen sich frei vergeben. So lauschen Webserver nicht nur auf Port 80, sondern oft auch auf Port 8000 oder 8080.
- TCP
- Das “Transport Control Protocol” dient zur Datenübertragung. Vor dem Verschicken werden die Daten dabei in kleine Pakete unterteilt, über die Sender und Empfänger vor dem eigentlichen Transfer Informationen austauschen. TCP sorgt für eine Empfangsbestätigung für jedes Paket und sorgt für die richtige Einsortierung. So lassen sich Übertragungsfehler korrigieren. Der Nachteil dieses zuverlässigen Protokolls: Es ist ineffizient für kleine Datenmengen. Die meisten Internet-Protokolle basieren auf TCP.
- UDP
- Das “User Datagram Protocol” ist effizienter, aber unzuverlässiger als TCP. Ob Pakete beim Empfänger ankommen, überprüft es nicht. Als Alternative zu TCP kommt beispielsweise beim Audio-Streaming zum Einsatz. Wenn Pakete unterwegs verloren gehen, wird die Übertragung einfach fortgesetzt.
- /etc/rc*.d
- Für jedes mögliche Runlevel eines Linux-Systems gibt es ein extra Verzeichnis, in dem Verweise (Links) auf die “Init(ialisierungs)-Skripte stehen, die Dienste starten oder anhalten [2]. Für Runlevel 5 ist das beispielsweise das Verzeichnis /etc/rc5.d; auch /etc/rc.d/rc5.d oder /etc/init.d/rc5.d sind gebräuchlich.
- Runlevel
- Betriebsmodus eines Linux-Systems. Durch gezielte Auswahl der Links im jeweiligen Runlevel-Verzeichnis lassen sich beispielsweise Konfigurationen zusammenstellen, bei denen der Rechner als Internet-Server bootet, oder solche, bei denen ein grafisches Login möglich ist.
Infos
[1] Heike Jurzik: “Kurzer Prozess für Zombies – ps, kill und Konsorten”, LinuxUser 12/2000, S. 92 f., http://www.linux-user.de/ausgabe/2000/12/092-zubefehl/befehl11.html
[2] Marc André Selig: “Wie Linux sich die Stiefel anzieht”, LinuxUser 12/2002, S. 26 ff., http://www.linux-user.de/ausgabe/2002/12/026-init/







