Kapitel 1:
Grundlagen der Linux-Sicherheit
Dieses Kapitel gibt einen ersten Überblick über Linux-Sicherheit. Es werden die Probleme der physikalischen Sicherheit besprochen, wie Standortwahl und Absicherung gegen physischen Zugriff.
Weiters werde ich auf die Sicherheitsaspekte bei der Installation eingehen, einen Überblick über die Linux-Systemadministration geben und kurz die Schwachstellen von vernetzten Linux-Systemen erläutern.
Zugegeben, Netzwerksicherheit ist ein brandaktuelles Thema. Allerdings wird oft1 übersehen, das viele Rechner physikalisch viel verwundbarer sind als durch Angriffe, die durchs Kabel kommen. Gegen Vandalen, Diebe oder böswillige lokale Benutzer nützt die beste Firewall nicht viel.
Also gehen wir die Grundlagen der physikalischen Computersicherheit Schritt für Schritt durch:
Standort des Computers
Bei einem Personal Computer, der nur Zuhause steht, erübrigt sich die Frage der Standortwahl und des physikalischen Zugriffs natürlich. Bei größeren Firmen, deren finanzielles Überleben vom reibungslosen Funktionieren ihrer Server abhängt, ist es aber enorm wichtig, dass nur autorisierte Personen Zugriff haben, und allen anderen der Zugang verwehrt wird.
Denn ein böswilliger Benutzer braucht nur ein paar Sekunden, um einen Computer außer Gefecht zu setzen, indem er den Stecker zieht oder neu bootet. Dadurch können wichtige Daten verloren gehen und ein großer finanzieller Schaden entstehen.
In größeren Firmen wäre daher ein Network Operations Center (NOC)*) ideal. Das ist ein abgegrenzter Bereich innerhalb einer Firma, in dem sich die Server und die Netzwerkhardware befindet und zu dem nur wenige Personen Zugriff haben. Perfekt ist ein NOC, wenn er die folgenden Anforderungen erfüllt:
Kartenschlüssel, die den Zutritt auf bestimmte Zeiten begrenzen und deren Benutzung aufgezeichnet wird (idealerweise auf einem entfernten Rechner)
Der NOC sollte abseits vom Publikumsverkehr liegen und seine Wände vollkommen undurchsichtig sein.
Eine Überwachungsanlage, die ihr Signal auf einen entfernten Recorder übermittelt.
Wenn die finanzielle Situation der Firma es zulässt, können wichtige Rechner zusätzlich mit biometrischen Zugriffskontrollen gesichert sein. Diese Geräte identifizieren Anwender anhand von biologischen Merkmalen, wie:
Fingerabdrücke
Netzhautmuster
Stimme
Gesichtsform
Diese Zugriffskontrollen sind allerdings ziemlich teuer und haben außerdem eine relativ hohe Fehlerquote. Zum Beispiel wird eine Stimme nicht erkannt, wenn der Benutzer heiser ist. Wurde eine Person allerdings erkannt, kann man sich sicher sein, dass es sich um diese Person handelt und die Aufzeichnungen können daher als fast unwiderlegbar gelten.
1.2 Sicherheit bei der Installation
Die Sicherheit bei Linux fängt schon ganz am Anfang an: bei der Installation. Wenn man2 einige einfache Regeln befolgt, hat man die Grundlage für ein sicheres System geschaffen.
Erste Probleme ergeben sich schon bei den unterschiedlichen Linux-Distributionen:
Die unterschiedlichen Distributionen haben meistens verschiedene Installationstools. Einige legen fest, welche Pakete und Server installiert werden und beim Booten gestartet werden, andere fragen den Benutzer danach. Dadurch werden unerfahrene Anwender oft überfordert und installieren viele Dienste, die überhaupt nicht benötigt werden und eventuell Sicherheitsrisiken bergen.
Daher kann es sich lohnen, die eine oder andere Distribution probeweise zu installieren und sich in der Paketauswahl die Beschreibungen zu den einzelnen Paketen durchzulesen. Es sollten nur die Dienste installiert werden, die wirklich benötigt werden, und es ist auch zu überlegen, welche Dienste schon beim booten gestartet werden und welche erst manuell gestartet werden sollen.
Besonderes Augenmerk sollte hierbei auf Netzwerkdienste aller Art gelegt werden. Ihr Zweck ist es, Benutzer oder Clients mit Daten und Informationen zu versorgen, demnach geht von ihnen naturgemäß ein gewisses Sicherheitsrisiko aus. Deshalb sollte man die Netzwerkdienste, die nicht gebraucht werden, auf jeden Fall deaktivieren. Hier sind einige dieser nicht unbedingt notwendigen Dienste, die Anwendern Daten oder Funktionen zur Verfügung stellen:
fingerd - der finger-Server, der Informationen über Benutzer sammelt und auf Anfrage zur Verfügung stellt. Das ist nun wirklich nicht nötig.
ftpd - das File Transfer Protocol ist der Standart für Dateitransfers im Internet und in Netzwerken.
httpd - der HTTP-Server ist ein Webserver, mit dem Internetdienste angeboten werden können.
telnetd - der Telnet-Server, damit kann ein Rechner über eine Netzwerkverbindung von aussen gewartet werden. Nicht unbedingt sicher, aber manchmal unverzichtbar.
sshd - der SSH-Server. Wie Telnet, nur viel sicherer.
Nützlich ist auch die Linux Software Map (http://www.boutell.com/lsm/), um sich über die einzelnen Anwendungen zu informieren.
Linux unterscheidet sich von anderen Betriebssystemen dadurch, dass es keine einzelne Firma gibt, die die Entwicklung und Kontrolle durchführt. Vielmehr besteht Linux aus unzähligen Modulen, Tools und Bibliotheken:
Der Kernel ist das Herz des Systems. Er ist die Schnittstelle zwischen System und Hardware und wurde strengen Tests unterzogen, um Sicherheitslöcher zu vermeiden. Er kann daher als sehr sicher angesehen werden.
Basis-Programme, die dauernd benutzt werden und in jeder Distribution enthalten sind, wurden ebenfalls ausführlich getestet und sind daher relativ sicher.
Halbkommerzielle Produkte sind Anwendungen, die auf jedem anderen System Geld kosten würden. Sie sind wahrscheinlich gut getestet, es kann aber auch vorkommen, dass der Anbieter bei der Portierung auf Linux fehlerhaft gearbeitet hat oder zu wenig Zeit in das Produkt investiert hat, um es ausführlich zu testen.
Freie und in der Betaphase befindliche Tools machen einen wesentlichen Teil von Linux aus. Sie können von erfahrenen Programmierern stammen, die viel Wert auf Sicherheit legen, oder auch von Anfängern programmiert worden sein.
Partitionen und Sicherheit
Während der Installation wird das Linux-Installationstool nach der gewünschten Partitionierung der Festplatte fragen. Auch diese Partitionierung kann kann Einfluss auf die Sicherheit haben.
Wenn man mehrere Betriebssysteme auf einer Festplatte installieren will, sollte man für jedes System zumindest eine eigene Partition einrichten, so dass die Beriebssysteme problemlos koexistieren können.
Es kann durchaus riskant sein, Linux in eine einzige Partition zu legen. Da kann es nämlich schon vorkommen, dass sich eine beschränkte Beschädigung von Dateien auf das ganze System auswirkt.
Um solche Probleme von Anfang an auszuschließen, sollte eine Konfiguration wie die folgende gewählt werden, die für jedes Hauptdateisystem eine eigene Partition vorsieht.
Linux-Swap-Partition - zur Auslagerung von temporären Daten.
Root Dateisystem /root - für den Systemadministrator (root).
Gemeinsam benutzte Programme /usr
Benutzerpartition /home
Verwaltung /var - hier werden Logfiles, Nachrichten und Fehlermeldungen gespeichert.
Für jeden dieser Punkte sollte eine eigene Partition vorhanden sein, die entsprechend der in der Textdatei /etc/fstab festgelegten Optionen gemountet (ins Dateisystem eingebunden) wird. So kann man z. B. nur Lesezugriff erlauben oder das Ausführen von Programmen mit automatischen Superuser-Zugriff (SUID) verhindern.
Vorteile mehrerer Partitionen:
Einfaches Upgraden
Oft schnelleres booten
Kontrolle darüber, wie die einzelnen Partitionen gemountet werden.
Verhinderung der Ausführung von SUID-Programmen.
Verhinderung eines Überlaufs des Hauptdateisystems durch große Dateien in den Benutzerverzeichnissen.
Partitioniert wird am besten mit dem Linux-Tool fdisk. Es ist einfach zu bedienen und sollte auch Anfängern keine Probleme bereiten.
1.3 Linux-Systemadministration
Das Grundprinzip
Bei Linux liegt die gesamte administrative Macht bei einem Superuser, genannt root. Er3 hat Einsicht und Kontrolle über alle Dateien im System und ihm fallen im Wesentlichen folgende Aufgaben zu:
Einrichten und Verwalten von Benutzer-Accounts
Zuweisen von Zugriffsrechten
Einrichten von Diensten
Troubleshooting
Sicherstellen, dass die Benutzer das System problemlos und sicher benutzen können
Sicheres Herunterfahren des Systems
Einrichten und Verwalten von Benutzer-Accounts
Es gibt zwei Möglichkeiten, sich in ein Linux-System einzuloggen: wenn man persönlich vor dem Rechner sitzt oder per shell-Zugriff über telnet oder ähnliche Dienste.
Persönlichen Zugriff zu einem Rechner gibt man natürlich nur Personen, denen man vertraut, denn sobald man physischen Zugriff zu einem Rechner hat, ungestört ist und böse Absichten verfolgt, kann man mit dem Rechner machen, was man will.
Aber zurück zu den Shell-Zugriffen: Oft sind Shell Benutzer völlig anonym (z.B. bei Webspace-Anbietern mit telnet-Zugriff) und können doch boshafte Absichten haben. Im Gegensatz zu anderen Angreifern haben sie den halben Weg schon hinter sich: Sie haben bereits Zugriff auf den Rechner.
Wenn man schon Shell-Zugriff gewähren muss, sollte man das Risiko für das Linux-Netzwerk zumindest mit folgenden Maßnahmen reduzieren:
Einen eigenen Rechner für den Shell-Zugriff einrichten.
Auf diesem alle nicht benötigten Netzwerkdienste deaktivieren.
Die Verbindung von dem Shell-Rechner und allen anderen auf das Allernötigste beschränken.
Wenn möglich, die Verzeichnisse /tmp, /home und /var in eine eigene Partition legen und mit nosuid mounten (ohne automatischen Superuser-Zugriff)
Die Protokolle auf einen eigenen Server oder - noch besser - auf einmalbeschreibbare Medien umleiten, um unwiederlegbare Beweise für einen eventuellen Einbruch zu haben.
Ein gültiger Account besteht aus einem Benutzernamen mit Passwort, einem Heimatverzeichnis und einem Shell-Zugriff.
Die Daten aller Benutzer sind in der Textdatei /etc/passwd gespeichert, außer natürlich dem Passwort, das wird gesondert in der Datei /etc/shadow abgelegt, die nur für den root lesbar ist.
Aber ein Eintrag in /etc/passwd allein macht noch keinen User. Es muss noch sein Heimatverzeichnis angelegt werden, mit dem Befehl chown an ihn übergeben werden und die Startdateien in sein Verzeichnis kopiert werden (von /etc/skel).
Benutzer kann man auf mehrere Arten hinzufügen: per manuellen Eintrag in /etc/passwd (etwas umständlich), mit Text-Tools wie useradd oder mit grafischen Tools, die bei jeder Distribution enthalten sind.
Normalerweise sollte man sich als Administrator nicht immer als root durch das System bewegen. Zu leicht könnte man eine falsche Eingabe machen (der Befehl rm -rf * zum Beispiel, ausgeführt als root und am oberen Ende des Dateibaumes, löscht das gesamte System und alle Dateien). Daher ist es besser, als normaler Benutzer zu agieren und bei Situationen, die root-Zugriff erfordern, den Befehl su anzuwenden. Dann wird man nach einem Passwort gefragt und ist anschließend root. Wenn man fertig ist, sollte man die Sitzung mit der Tastaturkombination Strg-D wieder beenden, um zu verhindern, dass jemand die noch geöffnete Sitzung missbraucht.
Zugriffsrechte
Bei Linux gibt es drei grundlegende Arten von Zugriffsrechten:
Lesezugriff (r)
Schreibzugriff (w)
Ausführen (x)
Die Rechte können auch mit Oktalwerten angegeben werden. 0 steht dann für keine Rechte, 1 für Ausführen, 2 für Schreibrecht und 4 für Lesezugriff. Die Zahlen können zusammenaddiert werden, 7 steht dann z.B. für lesen, schreiben und ausführen.
Nun hat eine Datei aber niemals nur eine Art von Rechten. Die Rechte können für Besitzer der Datei, Gruppe und alle anderen jeweils unterschiedlich sein. Deshalb werden 4 Ziffern hintereinander benötigt: die zweite steht für den Besitzer, die dritte für die Gruppe und die vierte für alle anderen User. Modus 0751 gibt z.B. an, dass der Besitzer lesen, schreiben und ausführen darf, die Gruppe darf lesen und ausführen, alle anderen dürfen nur ausführen.
Die erste Ziffer wird benützt, um spezielle Optionen zu setzen. Modus 4000 setzt z.B. das Set User ID - Bit (SUID):
Das ist ein bedeutendes Sicherheitsrisiko bei Linux. Mit SUID können einer Datei besondere Rechte verliehen werden, sodass ein Programm nicht mit Rechten des Ausführenden, sondern mit denen eines anderen Users ausgeführt wird. Wenn SUID nun auf root gesetzt wird, kann es leicht sein, dass die Superuser-Rechte des Programms missbraucht werden, um Das System auszuspionieren oder zu schädigen.
Unter Red Hat 2.1 gab es ein Sicherheitsloch, das mit einem Exploit namens abuser.sh ausgenutzt werden konnte, um eine SUID-root-shell in /tmp/abuser zu generieren, mit der man alle Aktionen mit root-Rechten ausführen konnte.
Man sollte daher mit dem Befehl find / -perm +4000 alle Dateien aufspüren, die solche Rechte besitzen, und den Modus von SUID-Programmen, bei denen das nicht unbedingt notwendig ist, ändern (chmod -s [Datei]). Außerdem sollte unbedingt darauf geachtet werden, dass SUID-Programme nicht schreibbar sind.
Gruppen
Bei Linux können User zu Gruppen zusammengefasst werden. Das vereinfacht die Systemadministration erheblich, da diesen Gruppen eigene Zugriffsrechte zugewiesen werden können, wie oben besprochen.
Gespeichert werden Gruppen in /etc/group, die sehr an /etc/passwd erinnert. Gruppen werden entweder mit grafischen Tools, mit dem Befehlszeilentool groupadd oder mit einem manuellen Eintrag in /etc/group erzeugt.
Die Pfadvariable4
ein bekanntes Problem bei Linux besteht bei Pfadvariablen. Oft wundert man sich als Linux-Neuling, warum z.B. das Programm doit nicht ganz einfach ausgeführt werden kann, in dem man von dem Ordner aus, in dem sich das Programm befindet, einfach doit eingibt:
user@linux> ls -l doit
-rwxr-xr-x 1 user users 177 Sep 23 10:52 doit
user@linux> doit
bash: doid: command not found
Das liegt daran, weil die Pfadvariable den aktuellen Pfad beim Suchen nach dem Programm nicht berücksichtigt. Das hat durchaus seinen Grund, es ist also nicht sehr sinnvoll, den aktuellen Pfad (./) zur Pfadvariablen hinzuzufügen (export PATH=.:$PATH). Denn es kann z.B. vorkommen, dass man einen seiner Ordner im Verzeichnis /tmp (dem Ordner, in dem alle User ihre temporären Dateien ablegen) mit dem Befehl rm löschen will. Nun kann aber ein anderer User ein Programm namens rm in /tmp abgelegt habe, dass in böswilliger Absicht zum Anfang des Dateibaumes wechselt und dort alle Dateien löscht, bei denen man Schreibrechte hat, da es ja mit den Rechten desjenigen ausgestattet ist, der es ausführt.
Genausogut kann aber auch ein falsches su-Programm versteckt sein, dass unbemerkt das root-Passwort in einer Datei speichert.
Die Alternative wäre, das aktuelle Verzeichnis als letzten zu betrachtenden Pfad anzugeben (export PATH=$PATH:. ), doch auch hier besteht ein Risiko: Wenn man auf mehreren Rechnern arbeitet, könnte ein Programm, dass auf dem einen System vorhanden ist, auf einem anderen nicht installiert sein und sich als trojanisches Pferd erweisen.
1.4 Schwachstellen in vernetzten Linux-Systemen
Linux kann eine ausgezeichnete Sicherheit bieten, wenn gewisse Vorraussetzungen5 gegeben werden und alle Schwachstellen ausgemerzt werden. Die ersten Risiken treten schon bei der Wahl der Netzwerk-Topologien auf:
Abhörgefahr
Single Point of Failure - ein Verbindungspunkt, bei dessen Ausfall das ganze Netzwerk ausser Gefecht gesetzt wird.
Fehlertoleranz - ein fehlertolerantes Netzwerk arbeitet trotz Ausfall eines Rechners weiter, die anderen Rechner bleiben voll funktionsfähig.
Grundsätzlich gibt es drei Arten von Netzwerktopologien:
Die Bus-Topologie
Hier sind alle Rechner mit einer Hauptleitung verbunden und mit einem (eventuellen) Server verbunden:
Die Vorteile dieser Lösung liegen darin, dass, wenn jeder Rechner unabhängig arbeiten kann, bei einer Unterbrechung der Verbindung zum Server das Netzwerk zwischen den einzelnen Rechnern erhalten bleibt. Der Single-Point-of-Failure liegt hier bei der Verbindung zum Server. Allerdings ist in diesem Netzwerk die Abhörgefahr relativ groß. Jeder Rechner könnte (ohne weitere Sicherheitsvorkehrungen) den gesamten Verkehr abhören.
Die Ring-Topologie
Wenn 2 Rechner dieses Netzwerks ausfallen, haben alle anderen höchstens noch zu ihren Nachbarn Kontakt. Es ist daher nicht sehr fehlertolerant. Es ist auch sehr anfällig für elektronisches Abhören, da Nachrichten immer in einer Richtung weitergeleitet werden.
Die Stern-Topologie
Dieses Netzwerk ist sehr sicher was Abhören betrifft, da die Kommunikation immer nur zwischen dem Hub oder Server und den einzelnen Computern abläuft. Es ist auch sehr fehlertolerant, wenn ein Rechner ausfällt, läuft alles andere problemlos weiter. Wenn allerdings der Knotenpunkt ausfällt, kann überhaupt keine Kommunikation mehr zwischen den Computern stattfinden.
Daten während der Übertragung sichern
Daten sollten innerhalb eines Netzes immer verschlüsselt übertragen werden. Weitere Informationen dazu in Kapitel 2, 2.6 Sicherheit bei Datenübertragungen.
Jede Netzwerkaktivität sollte außerdem überwacht und zur späteren Überprüfung in Log- Dateien aufgezeichnet werden, um den Hergang und den Urheber eines eventuellen Einbruchs rekonstruieren zu können.
Die größten Risiken bei Linux gehen von Netzwerkdiensten wie telnet, ssh oder ftp aus. Doch auch andere Ports können Schlupflöcher für Einbrecher bieten. Im nächsten Kapitel werde ich genau auf einzelne Sicherheitslücken eingehen und beschreiben, wie Angreifer in Linux-Systeme einbrechen und wie man das verhindert.
*)Begriff übernommen aus dem Buch linux hacker's guide
1linux hacker's guide von anonymous, erschienen bei Markt und Technik, Kapitel 2 - Physikalische Sicherheit
2linux hacker's guide von anonymous, Kapitel 3 - Installation
3linux hacker's guide von anonymous, Kapitel 4 - Grundlagen der Linux-Systemadministration
4Sicherheit unter Linux, URL: http://www.linuxfibel.de/securesystem.htm
5linux hacker's guide von anonymous, Kapitel 2 - Physikalische Sicherheit