ADMIN

2021

07

2021-07-01T12:00:00

Container- und Applikationsmanagement

PRAXIS

058

Security-Tipp

Sicherheit

Containermanagement

Anwendungen in Container-Sandbox ausführen mit Firejail

Eingesperrt

von Dr. Matthias Wübbeling

Veröffentlicht in Ausgabe 07/2021 - PRAXIS

Nicht nur Administratoren wünschen sich einfache und intuitive Sandbox- Umgebungen, um mit wenig Aufwand Anwendungen zu Isolations-, Test- oder Analysezwecken abgeschottet in eigenen Laufzeitumgebungen auszuführen. Klassische virtuelle Maschinen gelten in Zeiten von Container-Technologie als Schwergewichte und umständlich. Container sind flexibel, schnell aufgesetzt und auch schnell wieder entsorgt. Unser Security-Tipp zeigt Ihnen mit Firejail eine einfache Möglichkeit, beliebte Anwendungen mit derselben Technik zu isolieren, die im klassischen Container-Betrieb zum Einsatz kommt.

Die Abschottung wichtiger Systemressourcen mit Prozessen in eigenen Namensräumen hat in der Betriebssystemwelt eine lange Historie. Mit chroot gibt es etwa im Linux-Kernel bereits seit jeher eine Möglichkeit zur Isolation von Anwendungen. Den Ursprung hat chroot aber bereits im Jahr 1979 als Teil der Unix- Version 7. Der Begriff "Isolation" bezieht sich dabei zunächst ausschließlich auf das Wurzeldateisystem. So lässt sich einem Programm ein anderes Dateisystem darstellen, etwa um zu verhindern, dass unberechtigt und ungewollt auf wichtige Systemressourcen oder -einstellungen zugegriffen werden kann. Das ist vor allem für Anwendungen interessant, die als root-Benutzer laufen und keine entsprechenden Berechtigungen auf dem Hostsystem erhalten sollen.
Die heute zum Betrieb von Containern genutzten Techniken zur Prozessisolation haben ihren Ursprung Anfang der 2000er Jahre. Seit 2002 gibt es im Linux-Kernel zusätzlich zu chroot Namensräume für das Dateisystem. Damit lassen sich in Prozessgruppen unterschiedliche Dateisysteminhalte darstellen, etwa für das ganze Wurzeldateisystem oder nur spezielle Pfade. Im Lauf der Zeit wurde neben dem Dateisystem die Nutzung weiterer Ressourcen in Namensräumen ermöglicht. Der Linux-Kernel unterstützt aktuell acht unterschiedliche Namensräume für Ressourcen zur Prozessisolation [1].
Prozessisolation
Linux-Namensräume ermöglichen die Isolation von Prozessen und die Abstraktion von Ressourcen, die diese Prozesse verwenden. Der bereits erwähnte Mount-Namensraum erlaubt die Auswahl der Mount- Punkte, die innerhalb der Prozessgruppe dargestellt werden. Mittels sogenannter Bind-Mounts lassen sich damit im Grunde beliebige Dateisysteminhalte realisieren. Der PID-Namensraum abstrahiert die Prozess- IDs und gibt innerhalb der Prozessgruppe dem ersten Prozess der Gruppe die ID 1 und damit die Funktionalität des Init- Prozesses. Die abstrahierte Prozess-ID wird auf die tatsächliche Prozess-ID im darüberliegenden Namensraum gemapped. Im Netzwerk-Namensraum lassen sich die verfügbaren Netzwerkinterfaces, IP-Adressen, Routen und Firewall-Regeln genauso abstrahieren wie Unix-Domainsockets. Um auch den Hostnamen oder veraltete NISNamen innerhalb einer Prozessgruppe zu isolieren, können Sie den UTS-Namensraum verwenden.
Die Abschottung wichtiger Systemressourcen mit Prozessen in eigenen Namensräumen hat in der Betriebssystemwelt eine lange Historie. Mit chroot gibt es etwa im Linux-Kernel bereits seit jeher eine Möglichkeit zur Isolation von Anwendungen. Den Ursprung hat chroot aber bereits im Jahr 1979 als Teil der Unix- Version 7. Der Begriff "Isolation" bezieht sich dabei zunächst ausschließlich auf das Wurzeldateisystem. So lässt sich einem Programm ein anderes Dateisystem darstellen, etwa um zu verhindern, dass unberechtigt und ungewollt auf wichtige Systemressourcen oder -einstellungen zugegriffen werden kann. Das ist vor allem für Anwendungen interessant, die als root-Benutzer laufen und keine entsprechenden Berechtigungen auf dem Hostsystem erhalten sollen.
Die heute zum Betrieb von Containern genutzten Techniken zur Prozessisolation haben ihren Ursprung Anfang der 2000er Jahre. Seit 2002 gibt es im Linux-Kernel zusätzlich zu chroot Namensräume für das Dateisystem. Damit lassen sich in Prozessgruppen unterschiedliche Dateisysteminhalte darstellen, etwa für das ganze Wurzeldateisystem oder nur spezielle Pfade. Im Lauf der Zeit wurde neben dem Dateisystem die Nutzung weiterer Ressourcen in Namensräumen ermöglicht. Der Linux-Kernel unterstützt aktuell acht unterschiedliche Namensräume für Ressourcen zur Prozessisolation [1].
Prozessisolation
Linux-Namensräume ermöglichen die Isolation von Prozessen und die Abstraktion von Ressourcen, die diese Prozesse verwenden. Der bereits erwähnte Mount-Namensraum erlaubt die Auswahl der Mount- Punkte, die innerhalb der Prozessgruppe dargestellt werden. Mittels sogenannter Bind-Mounts lassen sich damit im Grunde beliebige Dateisysteminhalte realisieren. Der PID-Namensraum abstrahiert die Prozess- IDs und gibt innerhalb der Prozessgruppe dem ersten Prozess der Gruppe die ID 1 und damit die Funktionalität des Init- Prozesses. Die abstrahierte Prozess-ID wird auf die tatsächliche Prozess-ID im darüberliegenden Namensraum gemapped. Im Netzwerk-Namensraum lassen sich die verfügbaren Netzwerkinterfaces, IP-Adressen, Routen und Firewall-Regeln genauso abstrahieren wie Unix-Domainsockets. Um auch den Hostnamen oder veraltete NISNamen innerhalb einer Prozessgruppe zu isolieren, können Sie den UTS-Namensraum verwenden.
Der IPC-Namensraum deckt alle gängigen Mechanismen zur Interprozesskommunikation ab, die nicht über das Dateisystem funktionieren – also etwa Posix-IPC oder System-V Message Queues. Im User-Namespace lassen sich Benutzer- und Gruppen- IDs von Prozessen und Dateien anpassen und auf Benutzer im darüberliegenden Namensraum mappen. Dieses Mapping lässt sich dann an Unter-Namensräume weitergeben. Die Abstraktion von Control- Groups beziehungsweise den Namensräumen erlaubt der Cgroups-Namespace. Der erst im letzten Jahr mit Kernel 5.6 veröffentlichte Time-Namensraum kann zwar nicht die Realzeit innerhalb des Namespaces abstrahieren, liefert aber angepasste Werte für die Laufzeit von Programmen und des Betriebssystems.
Container-Sandboxing
Die im Linux-Kernel verfügbaren Namensräume ermöglichen den heute alltäglichen Einsatz von Containern in virtuellen Laufzeitumgebungen wie bei LXC oder Docker. Eine manuelle Nutzung dieser Namensräume ist natürlich möglich, aufgrund der Vielzahl an Optionen aber zum Teil sehr umständlich. Wenn Sie Ihre installierten Anwendungen zur Erhöhung der Sicherheit standardmäßig in einer eigenen Sandbox starten oder übersichtlich spezifische Regeln für einzelne Anwendungen erstellen möchten, können Sie Firejail [2] verwenden.
In der Auslieferungskonfiguration von Firejail finden Sie nach der Installation eine Menge vorgefertigter Profile unter "/etc/firejail". Sollten die Profile auf Ihrem System fehlen, installieren Sie noch das Paket "firejail- profiles". Vor der Benutzung von Firejail prüfen Sie zunächst, ob Ihr Benutzer in der Datei "/etc/firejail/firejail.users" aufgeführt ist. Dort steht jeder für Firejail zugelassene Benutzer in einer Zeile. Anschließend können Sie etwa Chrome einfach mit dem folgenden Kommando in einer eingeschränkten Umgebung starten:
firejail google-chrome
Anschließend öffnet sich der Browser so, wie Sie ihn kennen. In der Konsole erhalten Sie Meldungen zu den genutzten Konfigurationsdateien, bei der Benutzung merken Sie zunächst keinen Unterschied. Möchten Sie nun eine Datei mit "Speichern unter" auf Ihren Rechner herunterladen, werden Sie keinen Inhalt mehr in Ihrem Homeverzeichnis sehen. Sie können lediglich auf den Ordner "Downloads" zugreifen. Natürlich lassen sich Dateien in Ihrem isolierten Homeverzeichnis speichern. Allerdings verschwinden diese beim Beenden des Programms wieder und stehen dann nicht mehr zur Verfügung. Um auf der Kommandozeile zu überprüfen, auf welche Dateien ein Prozess zugreifen kann, nutzen Sie das Programm "ls" zum Auflisten von Verzeichnisinhalten. Um beispielsweise das Chrome-Profil zu überprüfen, führen Sie das folgende Kommando aus:
firejail --quiet --profile=/etc/firejail/google-chrome.profile ls -ahl ~/
Mit "--quiet" schalten Sie die in diesem Fall störenden Ausgaben von Firejail ab und mit "--profile" erzwingen Sie die Nutzung des angegebenen Profils. Wie Sie dann sehen, ist ein Zugriff nur auf einzelne Dateien in Ihrem Homeverzeichnis und auf den Downloads-Ordner möglich.
Mit dem Argument "--private" erstellen Sie eine Sandbox, die keine Inhalte des Home-Verzeichnisses einbindet. Damit legt der Browser bei jedem Start ein neues Profil in das leere Verzeichnis an, das beim Programmende wieder komplett verschwindet. Möchten Sie die im Home- Verzeichnis angelegten Dateien beim nächsten Programmstart wiederverwenden, können Sie "--private" darüber hinaus ein Verzeichnis mitgeben, das dann als Home-Verzeichnis eingebunden wird.
Eigene Profile nutzen
Um eigene Profile zu verwenden, legen Sie diese in Ihrem Home-Verzeichnis unter ".config/firejail/" an. Als Name des Profils wählen Sie den Namen des Programms, das Sie in der Sandbox starten möchten. Als einfaches Beispiel und zum Testen können wir wieder "ls" verwenden. Legen Sie dafür direkt die Datei "~/.config/firejail/ ls.profile" an und fügen Sie dort nur eine Zeile mit dem folgenden Inhalt ein:
whitelist ${HOME}/Downloads
Nun erhalten Sie eine Ausgabe und erkennen, dass etwa auch Dateien wie ".bashrc" oder ".Xauthority" angezeigt werden. Die Datei ".bashrc" legt dabei Firejail an und sie enthält keine der individuellen Anpassungen aus Ihrer eigenen Datei ".bashrc". Um das zu überprüfen, geben Sie den Inhalt einfach mit "cat" aus. Legen Sie dafür zunächst die Datei "~/.config/firejail/ cat.profile" an und fügen die folgende Zeile hinzu, mit der Sie das zuvor angelegte Profil von "ls" einbinden können:
include ls.profile
Nun überprüfen Sie die Inhalte der Datei mit dem folgenden Kommando:
firejail --quiet cat ~/.bashrc
Wie Sie sehen, enthält die Datei nur die Standardversion der ".bashrc" von Ihrem System, die Sie unter "/etc/skel/.bashrc" finden. Diese Datei kopiert und verwendet Firejail entsprechend. Die Datei ".Xauthority" legt das Tool an, um grafischen Programmen den Zugriff auf den X11- Server zu ermöglichen und Fenster öffnen zu können. Möchten Sie den Zugriff auf X11 aus einer Sandbox verhin dern, fügen Sie dem Kommando das Argu ment "--x11=none" hinzu oder deaktivieren in der Konfiguration x11 entsprechend. Ist Ihr x11-Server auch über einen Netzwerk- Socket erreichbar, erhalten Sie einen Fehler beim Start des Programms. Deaktivieren Sie diesen Socket oder direkt das ganze Netzwerk Ihrer Sandbox mit "--net=none", wird die Datei ".Xauthority" im Home-Verzeichnis nicht mehr angelegt.
Sandkasten für alle
Firejail bringt mit "firecfg" ein Hilfsprogramm mit, das alle unterstützten Programme automatisch in einer Sandbox startet. Wenn Sie "firecfg" als root ausführen, legt es für diese Programme symbolische Links in "/usr/local/bin" an, die Firejail automatisch mit dem gewählten Programm starten. Möchten Sie das nur für Ihren aktuellen Benutzer erreichen, können Sie mit "--bindir=~/bin" etwa ein Verzeichnis im Home-Verzeichnis für die angelegten Symlinks verwenden. Sie müssen dann nur sicherstellen, dass das Verzeichnis am Anfang Ihrer PATH-Umgebungsvariablen eingetragen ist. Mit "--clean" machen Sie die Änderungen einfach wieder rückgängig.
Fazit
Linux Namespaces ermöglichen die Isolation von Anwendungen. Möchten Sie Programme ohne großen Aufwand in einer Container-Sandbox ausführen, haben Sie mit Firejail ein übersichtliches Werkzeug, um diese zu konfigurieren.
(dr)
Link-Codes
[1] Namensräume für Ressourcen zur Prozessisolation: https://man7.org/linux/man-pages/man7/namespaces.7.html