firejail
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
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.
Installation¶
Paketquelle¶
Das Programm kann über die Paketverwaltung installiert [1] werden:
firejail (universe)
firejail-profiles (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install firejail firejail-profiles
Oder mit apturl 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:
ppa:deki/firejail
Hinweis!
Zusätzliche Fremdquellen können das System gefährden.
Ein PPA unterstützt nicht zwangsläufig alle Ubuntu-Versionen. Weitere Informationen sind der PPA-Beschreibung des Eigentümers/Teams deki zu entnehmen.
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 /usr/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.
Links¶
SourceForge 🇬🇧
GitHub 🇬🇧