29.3 Selbstabsicherung: »AppArmor«
Trotz aller Sicherheitsmaßnahmen bleiben Systeme angreifbar, vor allem bei den Diensten, die sie anbieten. Auch ein ALG[ 46 ] oder eine IPS können nicht alle Bereiche abdecken. Hier müssen Sie den Dienst direkt auf dem System schützen. Durch die Linux Security Module-Schnittstelle kann Software als Kernelmodul laufen und so direkt die Zugriffsrechte einzelner Prozesse auf höchster Systemebene einschränken. Dahinter steht das MAC[ 47 ]-Konzept. In diesem Abschnitt erfahren Sie alles über die Implementierung mit AppArmor.
Das Projekt SubDomain wurde von der Firma Wirex Communications, Inc., später Imunix, gestartet. Im Jahr 2005 wurde es von Novell gekauft, in AppArmor umbenannt und bis 2007 weiterentwickelt. Da es aber den Sprung in den Linux-Kernel immer wieder verfehlte, sollte die Entwicklung eingestellt werden. Die Entwickler um Crispin Cowan wurden entlassen und wollten das Projekt in der neu zu gründenden Firma Mercenary Linux weiterführen.
Seit 2009 bemühte sich Canonical darum, AppArmor in den Linux-Kernel zu bringen, was ab dem Kernel 2.6.36 gelang, und seither ist es auch per Default bei Ubuntu aktiv (daher verwenden wir als System in diesem Abschnitt auch ein Ubuntu 18.04 LTS). Das Tool AppArmor arbeitet als Kernelmodul und lädt spezifische Regeln, die sogenannten Profiles, nach. Neben vordefinierten Regeln können auch eigene hinzugefügt werden. Das Konzept von AppArmor sieht vor, den Betrieb von Software zu analysieren und dazu Regeln zu erstellen, die lediglich die als »normal« spezifizierten Aktionen erlauben. Wird die Software mit Schadcode infiziert, kann dieser die durch AppArmor geschaffene Umgebung nicht verlassen, sich also nicht weiterverbreiten oder unzulässige Aktionen ausführen (zum Beispiel Spam versenden).
Nach der Installation der Pakete apparmor und apparmor-utils steht Ihnen AppArmor zur Verfügung. Im Regelfall sind diese Pakete auf Ubuntu-Systemen bereits installiert. AppArmor läuft, ohne dass Sie es merken, da die Profile Dienste im Hintergrund schützen. Unter /etc/apparmor.d/ finden Sie die Regelsätze. Die Benennung der Regelsätze enthält den vollständigen Pfad. Allerdings wird der Slash durch einen Punkt ersetzt. Somit heißt das Profil für tcpdump entsprechend usr.sbin.tcpdump.
29.3.1 Status und Betriebsarten
Selbstverständlich bietet AppArmor Ihnen auch Möglichkeiten an, den aktuellen Status und die jeweilige Betriebsart anzeigen zu lassen. Sie rufen den Status von AppArmor über folgenden Befehl ab:
root@example:/# apparmor_status
apparmor module is loaded.
12 profiles are loaded.
12 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/bin/ubuntu-core-launcher
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/lib/lxd/lxd-bridge-proxy
/usr/sbin/tcpdump
lxc-container-default
lxc-container-default-cgns
lxc-container-default-with-mounting
lxc-container-default-with-nesting
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
Listing 29.3 »apparmor_status« auf Ubuntu 18.04
Das Paket apparmor-utils stellt Ihnen auch die Möglichkeit zur Verfügung, den Status mit dem Befehl aa-status abzurufen. Wie Sie der Ausgabe in Listing 29.3 entnehmen können, sind auf einem aktuellen Ubuntu-18.04-System zwölf Profile enthalten, und alle davon sind im enforce mode geladen. AppArmor unterscheidet zwei Betriebsarten:
-
enforce mode
Der »erzwungene Modus« setzt die geladenen Profile um. -
complain mode
Der »Beschwerde-Modus« protokolliert lediglich die Verletzungen des Profils.
AppArmor protokolliert seine Meldungen sowohl in syslog als auch in kern.log. Hauptsächlich wird aber das syslog zur Auswertung benutzt.
Über die Befehle aa-enforce <PROFIL> und aa-complain <PROFIL> bringen Sie das Profil eines Dienstes in den einen oder anderen Modus. Zum vollständigen Beenden und Entladen aller Profile von AppArmor muss trotz systemd das init-Skript unter /etc/init.d/apparmor verwendet werden. Führen Sie dafür die nachstehenden Befehle aus:
root@ubuntu:~# systemctl stop apparmor.service
root@ubuntu:~# /etc/init.d/apparmor teardown
* Unloading AppArmor profiles [ OK ]
Listing 29.4 Beenden und Entladen aller Profile von AppArmor
Dies ist leider notwendig, da AppArmor zurzeit noch nicht über ein »echtes« systemd-Skript verfügt, sondern die init-Skripte zur Laufzeit konvertiert werden und auf diese Weise der teardown-Befehl nicht verfügbar ist.
Dadruch die Installation des Pakets apparmor-profiles erhalten Sie viele weitere Profile. Dementsprechend umfangreicher erscheint dann auch die Ausgabe des AppArmor-Status:
root@example:/# aa-status
apparmor module is loaded.
55 profiles are loaded.
18 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/freshclam
[…]
37 profiles are in complain mode.
[…]
/usr/sbin/smbd
/usr/sbin/smbldap-useradd
/usr/sbin/smbldap-useradd///etc/init.d/nscd
/usr/{sbin/traceroute,bin/traceroute.db}
/{usr/,}bin/ping
klogd
syslog-ng
syslogd
3 processes have profiles defined.
2 processes are in enforce mode.
/usr/bin/freshclam (809)
/usr/sbin/named (986)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
Listing 29.5 »aa-status« mit »apparmor-profiles«
Selbstverständlich ist es möglich, eigene Profile zu erstellen oder vorhandene zu erweitern. Eine Liste der noch nicht von AppArmor geschützten Programme/Dienste erhalten Sie mit dem Tool aa-unconfined:
root@example:/# aa-unconfined
986 /usr/sbin/named confined by '/usr/sbin/named (enforce)'
989 /usr/sbin/sshd not confined
2789 /usr/sbin/vsftpd not confined
2899 /usr/sbin/atftpd not confined
Listing 29.6 Ungeschützte Dienste anzeigen
Das Tool ermittelt via netstat alle Dienste mit offenen TCP- und UDP-Ports und prüft, ob für diese Dienste ein Profil existiert. Wie Sie Listing 29.6 entnehmen können, laufen auf dem System ein sshd, ein vsftpd und ein atftpd, die noch nicht von AppArmor geschützt werden, und ein named, der geschützt ist.
[ ! ] Eigene Profile
Es sei eindringlich darauf hingewiesen, dass eigene AppArmor-Profile schnell zu fehlerhaften Verhalten von Programmen führen können. Im schlimmsten Fall können Sie das Programm das Sie eigneltich schützen wollen gar nicht mehr benutzen. Auf der anderen Seite ist es ebenso möglich, dass ein zu »großzügiges« Profil keinen Sicherheitsgewinn mit sich bringt.
29.3.2 Eigene Profile erstellen
Wir erstellen nun ein AppArmor-Profil für den atftpd, der uns einen Trivial File Transfer Protocol-Daemon zur Verfügung stellt. Listing 29.7 zeigt den notwendigen Aufruf mit dem Tool aa-genprof:
daniel@server:~$ sudo aa-genprof atftpd
Writing updated profile for /usr/sbin/atftpd.
Setting /usr/sbin/atftpd to complain mode.
[…]
Profiling: /usr/sbin/atftpd
[(S)can system log for AppArmor events] / (F)inish
Listing 29.7 Eigenes Profil erstellen für den »atftpd«
Starten und stoppen Sie den Dienst nun, verbinden Sie sich von einem TFTP-Client mit dem Server, und führen Sie alle gängigen Aktionen aus – hier also lediglich das Verbinden, Herauf- und Herunterladen von Dateien.
Anschließend lassen Sie aa-genprof durch Eingabe des Buchstabens S einen Scan durchführen. Sie erhalten die Ausgabe aus Listing 29.8:
Reading log entries from /var/log/syslog.
Updating AppArmor profiles in /etc/apparmor.d.
Complain-mode changes:
Profile: /usr/sbin/atftpd
Network Family: inet
Socket Type: dgram
[1 - #include <abstractions/lxc/container-base>]
2 - #include <abstractions/lxc/start-container>
3 - #include <abstractions/nameservice>
4 - network inet dgram,
(A)llow / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inish
Listing 29.8 »aa-genprof«-Scan für den »atftpd«
Nun müssen Sie entscheiden, ob für den atftpd die angezeigten Profile inkludiert werden sollen oder ob nur der Aufruf von network inet dgram gültig ist. Über die vorangestellten Zahlen können Sie die Auswahl wechseln, was durch die umschließenden eckigen Klammern dargestellt wird.
Über das in der letzten Zeile aufgeführte Menü können Sie den Zugriff erlauben, verweigern, beobachten, den Vorgang abbrechen oder beenden. Das Tool führt Sie nun Schritt für Schritt durch alle Bereiche.
Wenn Sie zu den Dateizugriffen gelangen, werden die Auswahlmöglichkeiten umfangreicher (siehe Listing 29.9):
Profile: /usr/sbin/atftpd
Path: /srv/tftp/download.me
Mode: r
Severity: 4
1 - #include <abstractions/totem>
2 - #include <abstractions/ubuntu-browsers.d/chromium-browser>
3 - #include <abstractions/ubuntu-browsers.d/user-files>
[4 - /srv/tftp/download.me]
[(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
Listing 29.9 »aa-genprof«-Scan: »atftpd«-Dateizugriffe
Mittels (G)lob wird ein Zugriff auf das gesamte Verzeichnis zugelassen oder aber lediglich ein Zugriff auf Dateien mit der gleichen Endung: Glob w/(E)xt. Bei der Eingabe von G wird Ihnen jeweils eine tiefere Verzeichnisebene angeboten.
Haben Sie die entsprechende Tiefe erreicht, können Sie den Zugriff erlauben, indem Sie den Buchstaben A eingeben. Listing 29.10 zeigt den Zugriff auf /srv/tftp/. Die aktive Auswahl wird stets durch eckige Klammern symbolisiert.
Profile: /usr/sbin/atftpd
Path: /srv/tftp/upload.me
Old Mode: r
New Mode: rw (owner permissions off)
Severity: 6
1 - /srv/tftp/upload.me
[2 - /srv/tftp/*]
[(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
Listing 29.10 »aa-genprof«-Scan: »atftpd«-Verzeichniszugriffe
In Tabelle 29.1 finden Sie eine Übersicht über die Parameter, die AppArmor anwendet.
Parameter | Bedeutung |
---|---|
Profile | beschreibt das Profil, für das die Regel gilt |
Execute | gibt an, welches Programm ausgeführt werden soll |
Path | legt fest, auf welche(s) Datei/Verzeichnis der Zugriff geschieht |
Mode | Zugriffsart: r = Lesen, w = Schreiben, l = folgt einem symbolischen Link |
Severity | Wert der Gefährdung: von 1 = bedenkenlos bis 10 = hohes Risiko |
Inherit | Vererbung des Profils auf child-processes. Nur verwenden, wenn die gleichen Zugriffe vorgenommen werden! |
Profil | Programmstart über das Profil. Existiert kein Profil, wird der Start unterbunden. |
Unconfined | normaler Programmstart |
Tabelle 29.1 »aa-genprof« – Parameter
Tabelle 29.2 zeigt die Optionen zu den beschriebenen Parametern.
Option | Bedeutung |
---|---|
Allow | erlaubt den Zugriff |
Deny | verbietet den Zugriff bzw. den Aufruf der Datei |
Glob | erlaubt den Zugriff auf Verzeichnisebene (bei mehrfacher Ausführung) |
Glob w/Ext | wie Glob; mit der Einschränkung auf gleiche Dateiendung |
New | erstellt eine eigene Regel durch reguläre Ausdrücke |
Abort | bricht den Vorgang des Profilerstellens ab |
Finish | beendet den Vorgang und erstellt das Profil anhand der bisher erfassten Regeln |
Tabelle 29.2 »aa-genprof« – Optionen
Am Ende der Verarbeitung wird das erstellte Profil durch Eingabe von S gespeichert und anschließend mittels F verlassen. Das soeben erstellte Profil finden Sie unter /etc/apparmor.d/usr.sbin.atftpd. Das Profil wird von aa-genprof umgehend in den enforce mode versetzt und in AppArmor geladen. Wenn es im Regelbetrieb zu Fehlern des Programms kommt, können Sie das erstellte Profil nochmals überarbeiten. Hierfür verwenden Sie den Befehl aa-logprof, der eine erneute Prüfung der Logfiles bewirkt und Sie erneut mit der Frage konfrontiert, welche Zugriffe gültig sind.