System abschotten mit AppArmor

Aus LinuxUser 03/2006

System abschotten mit AppArmor

© photocase.com

Goldene Käfige

Hat ein Cracker einen fremden Rechner geknackt, mag er sich wie im Paradies fühlen. AppArmor trübt die Freude und sperrt den Bösewicht in einen virtuellen Käfig.

Niemand ist ohne Fehler – das gilt besonders für Software. In jeder halbwegs komplexen Anwendungen stecken Programmierfehler. Einbrecher nutzen dies: Sie übernehmen die Kontrolle und bringen die Software dazu, etwas anderes zu tun als vom Entwickler gewollt. Kritisch wird das, wenn die Applikation über mehr oder andere Rechte (Privilegien) verfügt als der Einbrecher.

Zum Beispiel benötigt der Befehl ping Root-Rechte. Nur damit darf er das Sonderpaketformat verschicken, das Ping braucht. Mit den Root-Privilegien könnte der Prozess auch beliebigen Unfug anstellen, der Root vorbehalten bleibt. Zwar hält sich ping an die Regeln, zwingt aber ein Angreifer den Prozess unter seine Fuchtel, hält ihn nichts mehr vom restlichen System fern.

AppArmor [1] ändert dies. Statt jedem Root-Programm vollen Zugriff auf das System zu gestatten, beschränkt es die Möglichkeiten. Dabei geht es einen Kompromiss zwischen Wirksamkeit und Komplexität ein: Mit einfachen und durchschaubaren Mechanismen erreicht AppArmor einen hohen Schutz und ähnelt damit Systrace [2]. Mit komplexen Systemen wie SELinux [4] oder RSBAC [5] will es sich nicht messen – deren Konfiguration bleibt höhere Admin-Schule.

Härte zeigen

Trotz aller zusätzlichen Hürden lautet das erste Gebot: Eine nicht vorhandene Sicherheitslücke schützt am besten. Auch auf einem AppArmor-geschützten Rechner sollten Sie – wie auf jeder anderen Installation – nur wirklich benötigte Dienste betreiben, Patches zeitnah einspielen und eine behutsame gestrickte Konfiguration verwenden. Erst bei unbekannten oder noch nicht behobenen Sicherheitslücken und den dazugehörenden Zero-Day-Exploits sollte AppArmor tätig werden.

AppArmor überwacht, auf welche Dateien eine Anwendung auf welche Weise zugreift, und es kontrolliert den Einsatz der Root-Privilegien. Linux unterscheidet je nach Kernel-Version bis zu 29 Privilegien, genannt Capabilities (Fähigkeiten, siehe man 7 capabilities). So ist CAP_KILL die Fähigkeit von Root, beliebige Prozesse zu beenden und CAP_NET_RAW die Capability, beliebige Netzwerkpakete zu erzeugen.

Im Falle des Ping-Befehls im Eingangsbeispiel würde es im Wesentlichen genügen, wenn AppArmor den Einsatz von CAP_NET_RAW erlaubt und beispielsweise CAP_KILL untersagt. Dann dürfte ein Einbrecher keine fremden Prozesse mehr abschließen.

Immunix

Mitte 1995 hat Novell die Firma Immunix gekauft. Sie ist seit Jahren auf die Entwicklung von Sicherheitslösungen spezialisiert. Ihr modifizierter GCC namens StackGuard übersetzt Anwendung so, dass viele Formen von Buffer-Overflow-Exploits scheitern. Dazu benutzt StackGuard einen so genannten Canary. Dieses Frühwarnsystem ermittelt beim Programmstart zufällige Zahlen. Vor jedem Aufruf eines Unterprogramms legt es den Canary-Wert auf den Stack. Hat sich der Wert bis zum Rücksprung verändert, bricht das Programm ab, da es einen Buffer Overflow vermutet. Der Begriff Canary kommt aus dem Bergbau, wo Kanarienvögel als Früherkennung für Kohlenmonoxid dienen.

Immunix war auch maßgeblich an der Entwicklung LSM-Schnittstelle (Linux Security Modules [3]) in Kernel 2.6 beteiligt. Diese Schnittstelle erlaubt es Kernel-Modulen, an den verschiedensten Stellen sicherheitsrelevante Vorgänge zu überwachen. Einige Sicherheitssysteme nutzen LSM, etwa LIDS (Linux Intrusion Detection System [6]) und SELinux (Security Enhanced Linux [4]). Letzteres wurde von der NSA (National Security Agency, USA) entwickelt, es implementiert ein MAC-System (Mandatory Access Control). Der Admin gibt dabei detaillierte Regeln für erlaubte Zugriffe vor. Dieses restriktive Richtlinienwerk kann sogar den allmächtigen Superuser Root und dessen Handlungen überwachen und einschränken.

Während die aktuellen Novell/Suse-Distributionen bereits im Kernel und den benötigten Programmen SELinux unterstützen, fehlen die für die Funktion erforderlichen Richtlinien (Policies).

Ebenfalls von Immunix stammt das AppArmor-System. Novell positioniert nun AppArmor als einfache und wirksame Alternative zu SELinux. Während SELinux eine umfassende und sehr komplexe Konfiguration erfordert, beschränkt sich AppArmor auf einzelne Applikationen und die wichtigsten Aktionen. Ende Januar 2006 gab Novell den Quellcode von AppArmor unter der GPL frei und veröffentlichte umgehend den Code [7] auf der hauseigenen Webseite.

Einsatz unter Linux

In den kommerziellen Distributionen SLES 9 und Suse Linux 10.0 hat Novell das AppArmor-System bereits integriert, damals war AppArmor noch keine freie Software (siehe Kasten “Immunix”). Mit der Freigabe unter der GPL hat Novell angekündigt, AppArmor auch in OpenSUSE 10.1 einzubinden. Wer nicht so lange warten will, kommt auch mit OpenSUSE 10.0 zum Ziel. Allerdings ist die Installation aufwändig: Unter anderem verlangt sie, den Kernel zu modifizieren und neu zu übersetzen. Ungeübten Benutzern ist davon eher abzuraten.

AppArmor-RPMs für OpenSUSE 10.0 stehen auf Novell Forge [7] bereit und zusätzlich auf der Heft-CD dieser Ausgabe. Obwohl Suse/Novell die RPMs für OpenSUSE 10.1 Alpha gebaut hat, funktionieren sie auch unter OpenSUSE 10.0. Die Installation klappt wie üblich per rpm -ivh Paketname.rpm. Zusätzlich braucht der Kernel AppArmor-Unterstützung. Novell stellt Patches bereit [8], die auf einen Originalkernel in Version 2.6.15 passen [9]. Um daraus einen AppArmor-fähigen Kernel zu generieren, laden Sie den Originalkernel sowie die Patches aa_2.0-2.6.15.patch und aa_namespace_sem-2.6.15.patch. Danach folgen die Schritte in Listing 1.

Die Installation auf Nicht-Suse-Systemen wie Debian oder Fedora ist ebenfalls möglich. Allerdings müssen Sie die Quelltextarchive dann selbst übersetzen und auf die grafische Oberfläche verzichten, da diese Yast 2 voraussetzt.

Listing 1

tar xjf linux-2.6.15.tar.bz2
cd linux-2.6.15
patch -p1 <../aa_2.0-2.6.15.patch
patch -p1 <../aa_namespace_sem-2.6.15.patch
make oldconfig
make bzImage
make modules
make modules_install
make install
rmdir /subdomain
ln -s /sys/kernel/security/subdomain /subdomain

Abbildung 1: Mit Yast2 ist es sehr einfach, AppArmor zu aktivieren.

Abbildung 1: Mit Yast2 ist es sehr einfach, AppArmor zu aktivieren.

Start und Stopp

Um AppArmor zu aktivieren, hat Suse eine grafische Oberfläche vorgesehen: Rufen Sie Yast auf und wählen in der linken Spalte AppArmor. Anschließend starten Sie im rechten Bildschirm die AppArmor-Kontrollleiste. Dort kontrollieren Sie den AppArmor-Status und aktivieren AppArmor (Abbildung 1). Es genügt aber auch die Kommandozeile: rcsubdomain start und rcsubdomain stop (als Root aufrufen).

Damit AppArmor wirksam wird, muss es aktiv sein bevor die geschützten Anwendungen loslegt. Es startet daher bereits während des Bootvorgangs. Außerdem braucht AppArmor für jede zu schützende Anwendung im Verzeichnis /etc/subdomain.d eine Profil-Datei.

Profile

Das AppArmor-Paket enthält Profile für folgende Server:

  • Postfix
  • Apache (im Prefork-Modus)
  • Squid
  • OpenSSH-Server
  • NTP-Server
  • Name-Service-Caching-Daemon (ncsd)
  • Identd
  • Protokolldienste Klogd und Syslogd

Auch etliche Client-Programme sind durch die mitgelieferten Profile geschützt:

  • Acrobat Reader
  • Ethereal
  • Opera
  • Firefox
  • Evolution
  • Gaim
  • Realplayer
  • Man
  • Netstat
  • Ping
  • Traceroute
Abbildung 2: Kpdf zeigt PDF-Dokumente an. Stammen die Dokumente von Bösewichten, nutzen sie eventuell Sicherheitslücken im PDF-Betrachter um Code in den Rechner einzuschleusen.

Abbildung 2: Kpdf zeigt PDF-Dokumente an. Stammen die Dokumente von Bösewichten, nutzen sie eventuell Sicherheitslücken im PDF-Betrachter um Code in den Rechner einzuschleusen.

Eigener Schutz

Novell liefert bereits Profile für etliche kritische Befehle mit (siehe Kasten “Profile”). Das folgende Beispiel zeigt anhand des Dateibetrachters Kpdf (Abbildung 2), wie einfach solche Profile entstehen – dem Lernmodus von AppArmor sei Dank. In den letzten Jahren sind mehrere Programmierfehler in diversen PDF-Betrachtern wie Xpdf und Kpdf entdeckt worden. Der Erzeuger des PDFs schafft es damit, eigenen Schadcode auszuführen [10] und die Kontrolle über den PDF-Viewer zu erlangen.

Um Kpdf in die Überwachung durch AppArmor aufzunehmen, starten Sie Yast 2 und wählen unter AppArmor den Profilassistenten aus. Dort tragen Sie zunächst den Namen der Applikation mit ihrem vollständigen Pfad ein (Abbildung 3). Wenn Sie den Pfad nicht kennen, ermitteln Sie ihn mit which kpdf. Unter Suse Linux lautet er /opt/kde3/bin/kpdf.

Abbildung 3: Tragen Sie hier die zu überwachende Anwendung ein. Die Anwendung darf zu diesem Zeitpunkt noch nicht laufen.

Abbildung 3: Tragen Sie hier die zu überwachende Anwendung ein. Die Anwendung darf zu diesem Zeitpunkt noch nicht laufen.

Abbildung 4: AppArmor zeichnet alle Ereignisse auf. Diese können Sie nun analysieren.

Abbildung 4: AppArmor zeichnet alle Ereignisse auf. Diese können Sie nun analysieren.

Starten Sie die Applikation und arbeiten Sie mit ihr. Achten Sie darauf, möglichst alle Kpdf-Funktionen zu nutzen. Passen Sie aber auf, dass während der Lernphase kein Angriff möglich ist. Alle Funktionen, die Kpdf nun nutzt, erlaubt AppArmor auch künftig. Wenn Sie alle Funktionen durchgespielt haben, sollten Sie die Anwendung wieder beenden. Nun können Sie im Profilassistenten die aufgezeichneten Ereignisse analysieren. Wählen Sie dazu Scan system log for AppArmor events (Abbildung 4).

Abbildung 5: Kpdf möchte den Befehl KDialog aufrufen. Wie entscheiden Sie?

Abbildung 5: Kpdf möchte den Befehl KDialog aufrufen. Wie entscheiden Sie?

Kindprozesse

Nach der Analyse der Ereignisse, die bis zu einigen Minuten dauern kann, fragt der Assistent, ob Sie jeden dieser Zugriffe erlauben möchten. Dabei schlägt er immer eine Aktion vor. Ruft das zu überwachende Programm zum Beispiel ein weiteres Programm auf (Abbildung 5), so bietet der Profilassistent die folgenden Wahlmöglichkeiten:

  • Inherit: Die neue Anwendung kdialog unterliegt den gleichen Einschränkungen wie Kpdf.
  • Profile: Diese Applikation verfügt über ein eigenes Profil.
  • Unconfined: AppArmor soll dieses Programm nicht überwacht.
  • Deny: Den Aufruf der neuen Applikation verweigern

Da Kpdf das Programm kdialog verwendet, um Dateien zu öffnen und zu schließen, ist Unconfined eine mögliche Wahl. Weil das Hilfsprogramm damit freie Hand hat, warnt der Assistent vor möglichen Sicherheitslücken (Abbildung 6). Besser wäre es, für KDialog ein eigenes Profil zu erzeugen, mit dem das Programm nur noch auf PDF-Dateien zugreifen darf.

Abbildung 6: Bei der Wahl von <code srcset=

Unconfined warnt der Assistent, dass dies Sicherheitslöcher erzeugen kann.” width=”300″ height=”124″ /> Abbildung 6: Bei der Wahl von Unconfined warnt der Assistent, dass dies Sicherheitslöcher erzeugen kann.

Tipp: AppArmor testen

Beim Erstellung des Profils mit dem Assistenten verzichten Sie auf den Druckbefehl. Dann wird der Assistent die entsprechenden Funktionen im Profil auch nicht aufnehmen. Beim späteren Einsatz von Kpdf werden Sie feststellen, dass alles außer dem Drucken funktioniert.

Abbildung 7: Kpdf möchte auf das Wurzelverzeichnis lesend zugreifen.

Abbildung 7: Kpdf möchte auf das Wurzelverzeichnis lesend zugreifen.

Abbildung 8: Jede Abstraktion erlaubt einen Satz von Zugriffen. Damit bleibt die Konfiguration übersichtlich.

Abbildung 8: Jede Abstraktion erlaubt einen Satz von Zugriffen. Damit bleibt die Konfiguration übersichtlich.

Dateizugriffe

Sobald Sie für jede der von Kpdf aufgerufenen Anwendungen eine Entscheidung getroffen haben, fragt der Assistent nach den von Kpdf genutzten Dateien (Abbildung 7). Sie können bei den meisten Files den Zugriff mit Allow gestatten. Bei einigen Dateien bietet der Assistent aber auch eine Include-Direktive zur Auswahl (Abbildung 8).

Viele Applikationen brauchen Zugang zu KDE-Konfigurationsdateien. Statt jeden einzelnen Zugriff zu erlauben und so das Profil unnötig aufzublähen, können Sie vorgefertigte Profilvorlagen Ihrem Profil hinzufügen. Wählen Sie hierzu die Zeile #include <abstractions/kde> aus. Die vorgefertigten Profile heißen im AppArmor-Jargon “Abstraktion”.

Es existieren weitere Abstraktionen zum Beispiel für die Bash-Shell und für die Namensauflösung per DNS. Sobald Sie alle Fragen beantwortet haben, kehren Sie wieder zum Ausgangsbildschirm des Profilassistenten zurück. Das fertige Profil befindet sich in /etc/subdomain.d/opt.kde3.bin.kpdf (Ausschnitt in Listing 2). Sie können nun den Profilassistenten schließen und die Applikation verwenden.

Listing 2

# vim:syntax=subdomain
# Last Modified: Sun Jan 22 10:16:55 2006
/opt/kde3/bin/kpdf flags=(complain) {
  #include <abstractions/authentication>
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/gnome>
  #include <abstractions/kde>
  #include <abstractions/nameservice>
  #include <abstractions/user-write>
  / r,
  /etc r,
  /etc/X11/.kstylerc.lock rw,
  /etc/X11/.qt_plugins_3.3rc.lock rw,
  /etc/X11/.qtrc.lock rw,
  /etc/exports r,
  /etc/rpc r,
…
}

Feintuning

Falls die Anwendung nicht wie gewünscht funktioniert, starten Sie den Profilassistenten erneut für die Anwendung und wiederholen den Vorgang. Dabei liest der Assistent das vorhandene Profil und aktualisiert es lediglich. Manuell per Text-Editor eingefügte Einträge bleiben erhalten. Nach jeder händischen Änderung müssen Sie AppArmor neu starten, damit es das Profil lädt. Alternativ verwenden Sie Yast 2 und wählen dort entweder Profile aktualisieren (Abbildung 9) oder das Icon mit dem Stift, um ein Profil zu editieren (Abbildung 10).

Abbildung 9: Falls eine Applikation nicht so funktioniert, wie Sie es wünschen können Sie mit <code srcset=

Profile aktualisieren aktuelle AppArmor-Ereignisse, wie hier zum Drucken einem Profil hinzufügen.” width=”300″ height=”179″ /> Abbildung 9: Falls eine Applikation nicht so funktioniert, wie Sie es wünschen können Sie mit Profile aktualisieren aktuelle AppArmor-Ereignisse, wie hier zum Drucken einem Profil hinzufügen.

Abbildung 10: Mit Yast 2 können Sie auch ein AppArmor-Profil editieren.

Abbildung 10: Mit Yast 2 können Sie auch ein AppArmor-Profil editieren.

Listing 3

# unconfined
7988 /usr/lib/postfix/master confined by '/usr/lib/postfix/master (enforce)'
7988 /usr/lib/postfix/master confined by '/usr/lib/postfix/master (enforce)'
8025 /usr/sbin/cupsd not confined
8025 /usr/sbin/cupsd not confined
8081 /sbin/portmap not confined
8081 /sbin/portmap not confined
8109 /usr/sbin/sshd confined by '/usr/sbin/sshd (enforce)'

Weil Netzwerkdienste einer besonders hohen Gefahr ausgesetzt sind, stellt Novell das Programm unconfined zur Verfügung. Dieses ermittelt die laufenden Netzwerkdienste und zeigt deren AppArmor-Status an. Die Ausgabe in Listing 3 zeigt, dass dieser Rechner CUPS und den RPC-Portmapper nicht überwacht. Für diese Dienste hat auch Novell noch keine Profile erzeugt.

In den nächsten Wochen und Monaten wird Novell sicherlich weitere Profile zur Verfügung stellen. Wenn Sie die Entwicklung verfolgen möchten, empfehlen sich ein Abonnement der Mailingliste [11] und ein gelegentlicher Besuch auf der AppArmor-Homepage [1].

Gut geschützt

AppArmor überwacht kritische Applikationen. Ein Programm darf dann nur noch auf bestimmte Dateien zugreifen und ausgewählte Befehle starten. Enthält die Anwendung eine Sicherheitslücke, über die ein Angreifer zum Beispiel eine Shell oder andere Befehle mit den Rechten des Opfers starten möchte, so verhindert AppArmor dies wirksam. Die Applikation läuft in einer Art Sandkasten oder Gefängnis, aus der sie nicht ausbrechen kann.

Die Sicherheitslücke verschwindet durch AppArmor zwar nicht, jedoch kann der Angreifer diese kaum mehr ausnutzen. So sind Sie auch vor den Auswirkungen neuer, noch unbekannter Sicherheitslücken geschützt. AppArmor empfiehlt sich daher besonders für Programme, die über das Netzwerk erreichbar sind oder mit denen Sie Daten zweifelhafter Herkunft verarbeiten, etwa E-Mails, Bilder, Filme oder Office-Dokumente.

Infos

[1] AppArmor: http://www.opensuse.org/AppArmor

[2] Systrace: Marius Aamodt Eriksen und Niels Provos, “Enges Korsett: Systrace setzt Regeln für erlaubte Systemaufrufe durch”, Linux-Magazin 01/2003, S. 32

[3] LSM: http://lsm.immunix.org

[4] SELinux: Konstantin Agouros, Carsten Grohmann und Achim Leitner, “Security Enhanced Linux im Einsatz”, Linux-Magazin 01/2003, S. 38 und 02/2003, S. 62

[5] RSBAC: Amon Ott, “Die Architektur des Linux-Sicherheitssystems Rule Set Based Access Control”, Linux-Magazin 01/2003, S. 48 und 04/2003, S. 61

[6] LIDS: David Spreen, “Sicherheit mit dem Linux Intrusion Detection System”, Linux-Magazin 06/2001, S. 68

[7] AppArmor-Pakete: http://forge.novell.com/modules/xfcontent/downloads.php/apparmor/Stable/

[8] Kernel-Patches für AppArmor: http://forge.novell.com/modules/xfcontent/downloads.php/apparmor/Development/

[9] Kernel-Repository: http://www.kernel.org

[10] Kpdf-Sicherheitslücke: http://www.heise.de/newsticker/meldung/67056

[11] AppArmor-Mailingliste: http://forge.novell.com/mailman/listinfo/apparmor-general

Der Autor

Ralf Spenneberg arbeitet als freier Unix/Linux-Trainer, Berater und Autor. Mit seinem Unternehmen OpenSource Training Ralf Spenneberg führt er Schulungen und Beratungen durch. Er veröffentlichte bereits mehrere Bücher zu den Themen Intrusion Detection und Virtuelle Private Netzwerke. In wenigen Wochen wird sein neues Buch “Linux-Firewalls mit IPtables & Co” erscheinen.

LinuxUser 03/2006 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben