firejail

Dieser Artikel wurde fĂĽr die folgenden Ubuntu-Versionen getestet:

Firejail 🇬🇧 ermöglicht es, ein Programm relativ isoliert vom Rest des Systems in einer Sandbox auszuführen. Diese Isolation soll den Schaden, der durch das Ausnutzen einer Sicherheitslücke enstehen könnte, minimieren. So kann beispielsweise präventiv der Zugriff auf Bereiche des Dateisystems, das Internet oder auch etwa die Webcam entzogen werden.

Da für mehr als 350 häufig verwendete Programme bereits fertige Sandboxkonfigurationen mitgeliefert werden, ist es durchaus anfängerfreundlich.

Ein alternatives Werkzeug mit ähnlicher Zielsetzung ist AppArmor.

Inhaltsverzeichnis
  1. Installation
  2. Anwendung
  3. Beispiele
  4. Sichere Konfiguration
  5. Links

Installation¶

Paketquelle¶

Das Programm kann ĂĽber die Paketverwaltung installiert [1] werden:

Paketliste zum Kopieren:

sudo apt-get install firejail firejail-profiles 

Oder mit apturl die Pakete installieren. Link: apt://firejail,firejail-profiles

PPA¶

Da Firejail sich schnell weiterentwickelt, ist es oft sinnvoll stattdessen die letzte Version aus dem "Personal Package Archiv" (PPA) [2] zu beziehen. Dieses PPA wird von einem der Entwickler von Firejail gepflegt.

Adresszeile zum HinzufĂĽgen des PPAs:

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.


Ein PPA unterstützt nicht zwangsläufig alle Ubuntu-Versionen. Weitere Informationen sind der Wiki/Vorlagen/PPA/ppa.png PPA-Beschreibung des Eigentümers/Teams deki zu entnehmen.

Damit Pakete aus dem PPA genutzt werden können, müssen die Paketquellen neu eingelesen werden.

Nach dem Aktualisieren der Paketquellen erfolgt die Installation wie oben angegeben.

Anwendung¶

Die Anwendung von Firejail ist sehr einfach: Um ein Programm in einer Sandbox zu starten, genĂĽgt es firejail vor den Programmnamen zu setzen:

firejail PROGRAMM
firejail vlc  # startet den VLC Mediaplayer in einer Firejail Sandbox 

Hierbei sucht Firejail erst im Verzeichnis ~/.config/firejail und anschlieĂźend im Verzeichnis /etc/firejail nach einer Konfigurationsdatei mit dem Namen des Programms und der Endung .profile. War die Suche erfolgreich wird die Sandbox anhand dieser Datei konfiguriert, andernfalls wird die Standardkonfiguration /etc/firejail/default.profile verwendet.

Um zu vermeiden, dass bei jeder Verwendung von Firejail ein Terminal geöffnet werden muss, können symbolische Links in /usr/local/bin angelegt werden, die auf die Firejail Binärdatei zeigen. Auf diese Weise werden Programme immer in einer Sandbox ausgeführt, und zwar unabhängig davon auf welchem Weg sie gestartet wurden. Das kleine Werkzeug firecfg, das im Paket enthalten ist, unterstützt den Benutzer hierbei und erledigt dies automatisch für alle Programme mit einem existierenden Firejail Profil:

sudo firecfg 

Oder ohne firecfg und per Hand, fĂĽr ein einzelnes Programm:

cd /user/local/bin
sudo ln -s /usr/bin/firejail PROGRAMM
sudo ln -s /usr/bin/firejail firefox  # Firefox wird ab sofort immer in einer Firejail Sandbox ausgefĂĽhrt 

Achtung!

Firefox ist ein Sonderfall und sollte immer automatisch in einer Firejail Sandbox gestartet werden. Andernfalls sind Situationen möglich, in denen firejail firefox keinen Effekt hat.

Um die automatische Ausführung in Firejail zu beenden, genügt es diese symbolischen Links wieder zu löschen. Auch dafür kann man firecfg benutzen:

sudo firecfg --clean  # entfernt alle symbolischen Links 

Optionen¶

Aufgrund der großen Zahl mitgelieferter Profile besteht oft gar keine Notwendigkeit, eine Sandbox selbst zu konfigurieren. Einige der wichtigsten Optionen sollen jedoch an dieser Stelle vorgestellt werden. Für die vollständige Liste sei auf das Manual verwiesen.

Die Tabelle zeigt das Format fĂĽr die Kommandozeile, mit doppeltem Spiegelstrich -- und Gleichheitszeichen. In den Konfigurationsdateien mĂĽssen die Spiegelstriche weggelassen und die Gleichheitszeichen durch Leerzeichen ersetzt werden.

Option Beschreibung
--profile=PFAD teilt Firejail mit, dass eine bestimmte Konfigurationsdatei geladen werden soll. Es können mehrere profile Optionen gleichzeitig übergeben werden. profile steht nur auf der Kommandozeile zur Verfügung.
--noprofile keine Konfigurationsdateien werden geladen, auch nicht das Standardprofil. Alle Optionen müssen auf der Kommandozeile übergeben werden. Ist insbesondere hilfreich um schnell herauszufinden, ob es an einem Profil liegt wenn irgendetwas nicht funktioniert. Die Option noprofile kann naturgemäß nur auf der Kommandozeile und nicht innerhalb von Profilen verwendet werden.
--appimage erforderlich, wenn es sich bei dem auszuführenden Programm um ein AppImage handelt. Diese Option steht nur auf der Kommandozeile zur Verfügung. Soll appimage zusammen mit profile und den mitgelieferten Profilen verwendet werden, empfiehlt sich ein Upgrade auf Firejail Version 0.9.54 oder höher.
--net=none kein Internetzugriff in der Sandbox. Interessant beispielsweise fĂĽr PDF-Betrachter.
--blacklist=PFAD die Datei oder das Verzeichnis ist innerhalb der Sandbox zwar sichtbar, es kann jedoch nicht darauf zugegriffen werden. Es können beliebig viele blacklist Optionen übergeben werden.
--noblacklist=PFAD deaktiviert eine nachfolgende blacklist Anweisung.
--private Firejail erzeugt ein leeres, temporäres Homeverzeichnis, alle Veränderungen in diesem Verzeichnis werden beim Beenden verworfen. Das tatsächliche Homeverzeichnis ist innerhalb der Sandbox nicht sichtbar.
--private=PFAD in der Sandbox ist das Homeverzeichnis durch das angegebene Verzeichnis ersetzt. Veränderungen bleiben im angegebenen Verzeichnis erhalten.
--private-home=LISTE Firejail erzeugt ein leeres, temporäres Homeverzeichnis, und die gelisteten Dateien und Verzeichnisse werden in dieses temporäre Homeverzeichnis kopiert. Alle Veränderungen werden beim Beenden verworfen. Das tatsächliche Homeverzeichnis ist innerhalb der Sandbox nicht sichtbar.
--private-dev innerhalb der Sandbox ist nur ein kleiner Teil der Geräte in /dev sichtbar. Zudem ist /dev/shm ein leeres, temporäres Verzeichnis, und alle Veränderungen in diesem Verzeichnis werden beim Beenden verworfen.
--private-tmp Firejail erzeugt ein weitgehend leeres, temporäres /tmp Verzeichnis. Das tatsächliche /tmp Verzeichnis ist innerhalb der Sandbox nicht sichtbar.
--whitelist=PFAD Pfade in /home, /dev, /etc, /media, /mnt, /opt, /srv, /sys/module, /tmp, /usr/share und /var sind erlaubt. Wird dazu verwendet, um innerhalb der Sandbox eine alternative Ansicht eines dieser erlaubten Verzeichnisse zu erzeugen: Nur ausdrücklich mit whitelist markierte Dateien und Verzeichnisse sind sichtbar, und Änderungen daran bleiben erhalten. Alle übrigen Veränderungen werden beim Beenden verworfen.
--noexec=PFAD die Datei oder das Verzeichnis ist in der Sandbox mit noexec Option gemounted. Dies verhindert, dass Binärprogramme an diesem Ort ausgeführt werden können.
--read-only=PFAD die Datei oder das Verzeichnis ist innerhalb der Sandbox nicht schreibbar.
--read-write=PFAD die Datei oder das Verzeichnis ist innerhalb der Sandbox schreibbar. GegenstĂĽck zu read-only.
--nodbus seit Version 0.9.54. Verhindert, dass Programme in der Sandbox sich mit dem D-Bus Session-Bus verbinden können. Es empfiehlt sich immer zu prüfen ob eine Verwendung möglich ist, da D-Bus ein klassischer Weg ist um aus einer Sandbox auszubrechen. Hat allerdings bei manchen Programmen den Nebeneffekt, dass die Einstellungen in der Sandbox nicht veränderbar sind.
--nosound das Programm kann weder Audio aufnehmen noch wiedergeben. Ergänzt die private-dev Option.
--novideo die Sandbox hat keinen Zugriff auf die Webcam. Ergänzt die private-dev Option.
--seccomp ein Filter für Systemaufrufe. Bereits der Versuch, einen der verbotenen Systemaufrufe zu verwenden, führt zur sofortigen Beendigung des Programms. Verringert unter anderem die Angriffsoberfläche des Kernels und ist im allgemeinen eine der wichtigsten Sandbox-Komponenten.
--protocol=LISTE die Liste enthält die erlaubten Kommunikationsprotokolle und lautet vollständig unix,inet,inet6,netlink,packet. Ohne unix funktionieren die meisten Programme nicht. Wird inet,inet6 weggelassen, hat das Programm innerhalb der Sandbox keinen Internetzugriff. netlink wird nur selten von Programmen benötigt, packet muss fast nie erlaubt werden. Hilft auch dabei, die Angriffsoberfläche des Kernels zu verringern.
--memory-deny-write-execute erschwert es, Schadcode ĂĽberhaupt zur AusfĂĽhrung zu bringen. Leider bringt diese Option auch viele Anwendungsprogramme zum sofortigen Absturz und kann daher nicht immer eingesetzt werden.
--caps.drop=all hat zur Folge, dass die Sandbox alle Root-Rechte unwiderruflich aufgibt. Auf diese Weise wird es wesentlich schwieriger, Root-Rechte neu zu erlangen.
--list gibt eine Liste mit allen Sandboxen aus. So lässt sich kontrollieren, ob ein bestimmtes Programm gerade in einer Firejail Sandbox ausgeführt wird oder nicht. Nur für die Kommandozeile.
--version gibt die Programmversion aus. Nur fĂĽr die Kommandozeile.
Nur in Konfigurationsdateien
include PFAD alle Befehle einer anderen Datei werden an dieser Stelle eingefügt. Bis einschließlich Version 0.9.56 muss immer der vollständige Pfad angegeben werden, seither reicht der Dateiname aus, wenn sich die Datei in einem der Standardverzeichnisse befindet.

Makros¶

Firejail akzeptiert eine Reihe von Platzhaltern und ersetzt diese automatisch mit dem richtigen Pfad.

Makro Beschreibung
${HOME} Homeverzeichnis des aktuellen Benutzers. Alternative zur Tilde ~
${DOWNLOADS} Standardverzeichnis fĂĽr Downloads
${PATH} erstes Verzeichnis der PATH Umgebungsvariable, in dem Firejail das ausfĂĽhrbare Programm findet. Beispiel: ${PATH}/firefox
${DESKTOP} ab Version 0.9.56. Verzeichnis fĂĽr den Schreibtisch
${DOCUMENTS} ab Version 0.9.56. Standardverzeichnis fĂĽr Dokumente
${MUSIC} ab Version 0.9.56. Standardverzeichnis fĂĽr Musik
${PICTURES} ab Version 0.9.56. Standardverzeichnis fĂĽr Bilder
${VIDEOS} ab Version 0.9.56. Standardverzeichnis fĂĽr Videos

Beispiele¶

Das folgende kurze Beispielprofil lädt Befehle aus weiteren Dateien mittels include. Die Datei /etc/firejail/disable-common.inc enthält unter anderem auch die Anweisung blacklist /sbin. Aber das vorangehende noblacklist /sbin deaktiviert diese Anweisung, so dass in der Sandbox ganz normal auf /sbin zugegriffen werden kann.

blacklist /media                             # kein Zugriff auf /media
noblacklist /sbin                            # deaktiviert blacklist /sbin
include /etc/firejail/disable-common.inc     # fĂĽgt alle Befehle der Datei /etc/firejail/disable-common.inc an dieser Stelle ein
include /etc/firejail/disable-passwdmgr.inc  # fĂĽgt alle Befehle der Datei /etc/firejail/disable-passwdmgr.inc an dieser Stelle ein
caps.drop all                                # Root-Rechte werden unwiderruflich aufgegeben
seccomp                                      # Filter fĂĽr Systemaufrufe
protocol unix                                # Protokollfilter, Internet ist nicht erlaubt
net none                                     # kein Internet

Beispiel für eine Sandbox mit Internetzugang. Durch whitelist ${DOWNLOADS} ist im Homeverzeichnis zunächst nur der Downloads-Ordner sichtbar. Die mittels include eingebundene Datei /etc/firejail/whitelist-common.inc enthält aber zusätzliche whitelist Anweisungen für eine Reihe von Konfigurationsdateien.

whitelist ${DOWNLOADS}                       # Downloads-Ordner ist im Homeverzeichnis sichtbar
include /etc/firejail/disable-common.inc     # fĂĽgt alle Befehle der Datei /etc/firejail/disable-common.inc an dieser Stelle ein
include /etc/firejail/whitelist-common.inc   # fĂĽgt alle Befehle der Datei /etc/firejail/whitelist-common.inc an dieser Stelle ein
caps.drop all                                # Root-Rechte werden unwiderruflich aufgegeben
seccomp                                      # Filter fĂĽr Systemaufrufe
protocol unix,inet,inet6                     # Protokollfilter, Internet ist erlaubt
novideo                                      # keine Webcam in der Sandbox

Zahlreiche weitere Beispiele fĂĽr Profile finden sich in /etc/firejail.

Sichere Konfiguration¶

Die Sicherheit von Firejail kann durch Anpassungen an der Standardkonfiguration erhöht werden.

Seit Version 0.9.54 ist es möglich, nur bestimmten Nutzern den Einsatz von Firejail zu erlauben. Die Nutzerdatenbank kann mit Hilfe von firecfg angelegt werden:

sudo firecfg --add-users user1 user2 user3 ... 

Zudem sollte man Firejail idealerweise die Ausführung anderer SUID-Programme verbieten. Hierzu öffnet man die Datei /etc/firejail/firejail.config und aktiviert den Schalter force-nonewprivs:

# Force use of nonewprivs.  This mitigates the possibility of
# a user abusing firejail's features to trick a privileged (suid
# or file capabilities) process into loading code or configuration
# that is partially under their control.  Default disabled.
force-nonewprivs yes

In dieser Datei kann man auch Optionen abschalten, von denen man weiĂź dass man sie nicht verwenden wird.