[[Vorlage(Getestet, bionic)]] [https://firejail.wordpress.com/ Firejail] {en} ermöglicht es, ein Programm relativ isoliert vom Rest des Systems in einer [wikipedia: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 = == Paketquelle == Das Programm kann über die Paketverwaltung installiert [1] werden: {{{#!vorlage Paketinstallation firejail, universe firejail-profiles, universe }}} == 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. [[Vorlage(PPA, deki/firejail)]] 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: {{{#!vorlage Befehl 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 [:ln: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: {{{#!vorlage Befehl sudo firecfg }}} Oder ohne `firecfg` und per Hand, für ein einzelnes Programm: {{{#!vorlage Befehl 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 }}} {{{#!vorlage Warnung 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: {{{#!vorlage Befehl 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 [:man: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. {{{#!vorlage Tabelle 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 [wikipedia: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 [:mount: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 [wikipedia:Systemaufruf:Systemaufrufe]. Bereits der Versuch, einen der verbotenen Systemaufrufe zu verwenden, führt zur sofortigen Beendigung des Programms. Verringert unter anderem die Angriffsoberfläche des [:Kernel: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 [wikipedia:Root-Konto: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. +++ <-2; rowstyle="background-color:#F9EAAF"> '''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. {{{#!vorlage Tabelle Makro Beschreibung +++ `${HOME}` Homeverzeichnis des aktuellen Benutzers. Alternative zur Tilde '''~''' +++ `${DOWNLOADS}` [:Homeverzeichnis#Vorgegebene-Verzeichnisse:Standardverzeichnis für Downloads] +++ `${PATH}` erstes Verzeichnis der PATH [:Umgebungsvariable:], in dem Firejail das ausführbare Programm findet. Beispiel: `${PATH}/firefox` +++ `${DESKTOP}` Verzeichnis für den Schreibtisch ''(ab Version 0.9.56.)'' +++ `${DOCUMENTS}` Standardverzeichnis für Dokumente ''(ab Version 0.9.56.)'' +++ `${MUSIC}` Standardverzeichnis für Musik ''(ab Version 0.9.56.)'' +++ `${PICTURES}` Standardverzeichnis für Bilder ''(ab Version 0.9.56.)'' +++ `${VIDEOS}` Standardverzeichnis für Videos ''(ab Version 0.9.56.)'' }}} = 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: {{{#!vorlage Befehl sudo firecfg --add-users user1 user2 user3 ... }}} Zudem sollte man Firejail idealerweise die Ausführung anderer [:Rechte#Sonderrechte: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 = * [https://firejail.wordpress.com/ Projekthomepage] {en} * [https://firejail.wordpress.com/documentation-2/firefox-guide Firefox Sandboxing Guide] {en} * [https://firejail.wordpress.com/support FAQ] {en} * [sourceforge:firejail:SourceForge] {en} * [github:netblue30/firejail:GitHub] {en} # tag: Sicherheit, System