Sicherheit im Netzwerk

From NJH-Wiki

Jump to: navigation, search
Autor
Volker Grabsch


Contents

Server und Client

Es gibt grundsätzlich zwei Arten, in einen Rechner über das Netzwerk einzubrechen: Über Serverprogramme (Dienste) und über Client-Programme.

Zum Begriff Server: Ich meine hier keinen ganzen Computer, sondern nur einzelne Programme, die man ebenfalls als Server bezeichnet, z.B. Apache oder Exim.

Server hängen am Netzwerk und nehmen Verbindungen von außen entgegen. Ein ganz primitiver ist z.B. "date", der eine Verbindung annimmt, die aktuelle Uhrzeit dem Anfragenden zurückliefert, und das war's. Ein anderer Dienst ist HTTP (z.B. wenn bei dir ein Apache läuft), der Webseiten auf Anfrage ausliefert. Oder auch SSH, ein sehr interaktiver Dienst, der die Fernsteuerung deines Rechners ermöglicht.

Clients hingegen verbinden sich nur nach außen, und stellen selbst Anfragen (an andere Server im Netz). Zum Beispiel dein Mailprogramm, das E-Mails abruft bzw. versendet. Oder dein Webbrowser, der Internetseiten lädt.

Manchmal verschwimmt auch die Grenze. Ein Mailserver (SMTP) z.B. nimmt E-Mails entgegen, sendet selbst aber auch E-Mails weiter. Er ist also z.T. ein Server (Mails entgegen nehmen) und z.T. ein Client (Mails weiter raussenden).

Angriffspunkte

Grundsätzlich sind Clients und Server als Eintrittspunkt in dein System möglich. Sicherheitslücken können auch in Kombination auftreten.

Zum Beispiel, wenn eine dynamische Webseite erstellt wird, und das CGI-Script eine Sicherheitslücke hat. Dann kann der Apache noch so abgesichert sein, er muss nunmal das CGI-Script aufrufen, und dieses baut dann Mist.

Oder wenn der Firefox eine PDF-Datei öffnet, und das PDF-Anzeigeprogramm eine Sicherheitslücke hat. Dann kann der Firefox noch so perfekt sein, aber er muss nunmal das PDF-Programm aufrufen, und das baut dann Mist.

Der Kernel ist letztlich auch nur ein Programm, das von praktisch allen anderen Programmen genutzt wird, daher kann auch eine Panne im Kernel durch andere Programme hindurch das System verletzbar machen. Ein Klassiker ist, dass jemand einbricht und erstmal "nur" die Rechte eines bestimmten Benutzers hat. Die Schwäche im Kernel ermöglicht es ihm dann, an Administrator-Rechte (Root-Rechte) zu kommen. Arbeitet man gleich als Administrator, erspart man dem Angreifer diesen Umweg. :-(

Trotz dieser "indirekten" Schwächen bleibt es dabei, dass es Eintrittspunkte geben muss, also Server oder Clients. Die Überlegungen über "indirekte" Schwächen zeigen jedoch, dass es wichtig ist, sein gesamtes System sicher und aktuell zu halten, nicht nur die Programme, die direkt mit der Außenwelt reden (als Server oder Client).

Ursachen

Woher kommen diese Schwächen? Zum einen gibt es viele klassische Programmier-Fehler, die auch erfahrenen Leuten passieren können. Besonders leicht passiert es einem IMHO in C und PHP. Dort ist es selbst für Gurus sehr hart, sicheren Code zu schreiben. Aber auch in jeder anderen Programmiersprache braucht man Erfahrung, um sicheren Code zu schreiben.

Zum Anderen gibt es Konfigurations-Fehler. Zum Beispiel könntest du deinen Webserver so konfiguriert haben, dass er dein gesamtes Home-Verzeichnis anzeigt, und du mit dem Browser durch deine Ordner gehen kannst. Und dann hast du diesen Webserver aber so konfiguriert, dass er auch von Außen zugänglich ist. Zack - schon kann jeder x-beliebige mit einem einfachen Browser in deinen privaten Dateien herumstöbern.

Angriffsmethoden

Was ist leichter anzugreifen? Natürlich Server. Zu einem Server kann ich mich jederzeit verbinden. Läuft auf deinem Rechner z.B. ein SSH-Server, dann kann ich ganz oft versuchen, mich einzuloggen, oder ungültigen Kram hinzusenden, oder irgendwas anderes. Ich kann mir gezielt einen Rechner aussuchen und ihn beliebig oft angreifen.

Ein Client ist schwerer, denn dazu musst du z.B. mit deinem Browser erstmal meine Seite besuchen, und mein Webserver muss deinem Browser irgendwelchen schädlichen Code auf seine Anfrage zurücksenden. Aber ich habe nur einen Versuch, es sei denn, du surfst weiter auf der Seite. Ich bin also darauf angewiesen, dass das Opfer zu mir kommt, indem es z.B. meine Webseite besucht. Ich brauche überhaupt erstmal eine stark besuchte Webseite. Und ich kann nicht bestimmten, wer darauf zugreift. Wenn ich 10 verschiedene Angriffe ausprobieren will, du aber nur 9 (Unter-)Seiten bei mir abrufst, dann geht das nunmal schwerer. Aber ich kann dir z.B. JavaScript-Code schicken, der dann dafür sorgt, dass sich dein Browser öfters zu mir verbindet.

Dennoch ist es um Größenordnungen schwerer, einen Client anzugreifen.

Absicherung: Server

Für einen Computer zu Hause ist es normalerweise unsinnig, überhaupt irgendwelche Dienste nach außen anzubieten. Also deaktiviert man am besten alle. Oder wenn man einen Dienst braucht, bietet man ihn nicht nach "außen", sondern nur nach "innen" an. (z.B. um bei sich zu Hause einen Webserver aufzuprobieren)

Will man auf Nummer sicher gehen, richtet man sich eine Firewall ein, die nochmal unabhängig von den Diensten irgendwas blockiert. Zum Beispiel kann mein Webserver für jedermann zugänglich sein, aber die Firewall sorgt dafür, dass man nicht von außen, sondern nur lokal auf ihn zugreifen kann. Eine Firewall ist also "eigentlich gar nicht nötig", aber eine zentrale Stelle, von der aus man den Netzwerk-Verkehr kontrollieren kann. Sonst müsste man jeden einzelnen Dienst entsprechend abdichten. Die Firewall beugt somit Konfigurations-Fehlern vor. Außerdem beugt sie Programmierfehlern vor, da die Firewall z.B. lange nicht so komplex ist wie der Apache. Es kann passieren, dass ein Programmierfehler im Apache dafür sorgt, dass er doch von außen zugreifbar ist, aber dass dann dasselbe auch mit der Firewall passiert, ist sehr unwahrscheinlich.

Firewalls zu Hause sind besonders für Anfänger interessant, die keinen tiefen Einblick in ihr System haben. Eine einfache Firewall einzurichten ist mit viel weniger Aufwand verbunden, als alle Dienste abzusichern. Der Anwender kann so an zentraler Stelle sicher gehen, dass keine seiner Dienste von außen angesprochen werden können, wenn er es nicht möchte.

Aber dass alle Dienste erstmal nur lokal erreichbar sind, nicht aus dem Netz, und dass die Firewall (z.B. iptables) entsprechend eingerichtet ist, all das bieten die gängigen Linux-Distributionen bereits von Hause aus.

Absicherung: Client

Gegen Angriffe auf Clients kann man sich weniger gut wehren. Natürlich kann man auch hier eine Firewall aufsetzen, die nur bestimmten Programmen überhaupt Netzwerk-Zugriff gestattet. Solch eine Firewall ist aber nur begrenzt sinnvoll, und sehr aufwändig/nervend einzurichten. Dieses Problem wird in Personal Firewalls wie ZoneAlarm dadurch umgangen, dass es bei jedem Programm, das Daten senden will, den Benutzer erstmal fragt. Seine Antwort merkt es sich für die Zukunft.

Das Problem hier ist aber, dass der Anwender nur genervt wird. Denn er weiß auch nicht genau, welchen Programmen man welche Aktionen erlauben sollte. So wird er letztlich nur aufs "Ja"-Klicken trainiert und es ist nur eine Illusion der Kontrolle. Wer sich damit auskennt, wird schon im Voraus seine Regeln aufstellen und braucht kein ZoneAlarm.

Noch größer wird das Problem dadurch, dass eine falsche Sicherheit vorgegaukelt wird, die zum leichtsinnigen Handeln verleitet.

Da unter Linux kein Programm ungefragt frech "nach Hause telefoniert", ist eine solche Firewall dort ebenfalls weniger sinnvoll. Eher bei Hochsicherheitsanwendungen. Treibt man diesen Gedanken konsequent weiter, landet man irgendwann bei SELinux, wo man genau festlegen kann, welches Programm was machen darf, nicht nur in Bezug auf das Netzwerk.

Allgemein jedoch ist es absurd, wenn das aufgesetzte System (ZoneAlarm, SELinux) komplizierter ist als das, was es schützen soll. Firewalls sind daher zum Absichern von Client-Programmen nicht mehr praktikabel, zumindest nicht für Heim-Anwender.

Bei Clients empfehle ich daher einfach nur, sich zu überlegen, welche Programme man startet und welche nicht. Was z.B. bei der eigenen Distribution dabei ist, ist meist sauber eingerichtet und wird regelmäßig überprüft. Es ist grober Leichtsinn, sich ein unbekanntes Programm von irgendeiner Webseite herunterzuladen und zu starten. Man sollte sich bei Freunden oder UserGroups erstmal erkundigen. Das gilt ganz besonders, wenn es nicht einmal freie Software ist.

Solch ein Leichtsinn wird unter Linux genauso "bestraft" wie unter Windows. Jedoch ist man unter Linux dank der Distributionen nicht darauf angewiesen, extra Software runterzuladen. Eine Distribution hat i.d.R. alles, was man braucht. Außerdem bietet sie einen zentralen Meachnismus, um das gesamte System mit einem Schlag auf den neusten (Sicherheits-)Stand zu bringen.

Virenscanner

Virenscanner sind noch ein Thema für sich:

Zusammenfassung

Die eigentliche Absicherung erfolgt in erster Linie durch

Erst danach kommen Firewalls und Virenscanner.

Personal tools