Hlavní navigace

Firejail: zamkněte neposlušné aplikace do vězení v sandboxu

 Autor: Depositphotos
Všechny programy a utility nejsou stejně důvěryhodné. Ty velmi komplikované nebo bezpečnostně pochybné je vhodné nějak oddělit od zbytku systému a především od citlivých dat. Firejail k tomu používá mechanismy z jádra.
Petr Krčmář 11. 6. 2020
Doba čtení: 5 minut

Sdílet

Firejail je bezpečnostní program, který významně snižuje riziko průniků, protože umožňuje uzavřít nedůvěryhodné aplikace do samostatného odděleného prostředí. Dobrým příkladem je moderní webový prohlížeč. Je to obrovský software, s velkou spoustou možností a vlastním běhovým prostředím, který se připojuje do internetu a zpracovává vše, co mu přijde pod ruku.

Takovou věc je velmi rozumné oddělit od zbytku systému, aby v případě bezpečnostního incidentu nemohly být napáchány větší škody. Přesně k tomu slouží Firejail, který dovoluje oddělit takové aplikace do vlastní škatule, která má nastavené parametry a pravidla.

Jeho výhodou je navíc nenáročnost na samotný systém, ale i na uživatelské znalosti. S použitím běžně dostupných vlastností linuxového jádra je možné velmi rychle dosáhnout požadovaného stavu.

Vlastnosti Firejailu

Firejail staví uzavřené prostředí (sandbox) pomocí namespaces a seccomp-bpf. Díky tomu dostane proces své vlastní oddělené prostředí a jsou mu filtrována volání jádra. Dosáhne tedy jen na velmi omezené a předem vyjmenované zdroje. Tím se zužuje prostor pro nechtěné nakládání s daty či ovlivňování ostatních procesů.

Protože Firejail používá vlastnosti, které už jsou součástí linuxového jádra, nevyžaduje žádný rozšiřující modul, žádného démona v pozadí ani nic podobného. Jde vlastně o jednoduchou utilitu, která se postará o načtení konfigurace, přípravu sandboxu a spuštění procesu.

Výhodou jednoduchého a univerzálního přístupu je, že se neomezuje jen na serverové aplikace, ale je možné s jeho pomocí svázat také velké grafické aplikace nebo celá prostředí. Přesto je jeho použití velmi jednoduché, jak si za okamžik ukážeme.

Co budeme potřebovat

Je toho vlastně docela málo, stačí nám libovolná běžící linuxová distribuce s jádrem řady 3.x či novějším, které obsahuje potřebné funkce. Abychom měli k těmto funkcím přístup, budeme potřebovat také práva roota. Buď se na něj přímo přihlásíme nebo použijeme  sudo.

Protože je Firejail běžně dostupný v balíčkovacích systémech, stačí jej jednoduše nainstalovat. V Debianu (a tedy i v Ubuntu) existuje ještě samostatný balíček obsahující profily jednotlivých aplikací. Doporučuji nainstalovat i ten. Stačí pak jednoduše zavolat:

MIF obecny

# apt install firejail firejail-profiles

Základní použití

Pokud chceme spustit například Firefox v sandboxovaném prostředí, stačí jeho název předat jako parametr utilitě firejail. Při tom už nemusíme mít práva roota, protože utilita má zapnutý setUID bit, takže automaticky získává při svém spuštění oprávnění sama.

$ firejail firefox

Firejail je takto spuštěn po celou dobu, po kterou běží samotná aplikace. Bez ohledu na to, jak dlouho proces běží, je neustále uzavřen ve svém sandboxu a nemůže ovlivňovat ostatní procesy.

Konfigurace týkající se konkrétního software je k dispozici v adresáři /etc/firejail/aplikace.profile. Pokud požadujete nějakou lokální modifikaci, je rozumné zkopírovat balíčkem dodávaný profil do domovského adresáře do ~/.config/firejail/ a upravit ho.

Pokud daná aplikace nemá svůj explicitní profil, použije Firejail výchozí profil /etc/firejail/default.profile, který je ale pochopitelně velmi obecný a může způsobit nefunkčnost vybraného procesu.

Pokud chcete vidět, jaké sandboxy jsou pro jednotlivé procesy vytvořené, můžete si je nechat vypsat:

# firejail --list

Automatické použití

Pokud nechceme Firejail volat explicitně při každém spuštění procesu, můžeme systém přepnout do režimu automatického použití. Provedeme to spuštěním utility firecfg. Ta za nás projde všechny profily a pro všechny pokryté programy vytvoří symbolické linky v adresáři  /usr/local/bin.

Vedou na binárku /usr/bin/firejail, která se už automaticky postará o kontrolu názvu spouštěného programu a o jeho spuštění. Zavoláním příslušného spustitelného souboru (třeba firefox) tak vyvoláme na pozadí nejprve spuštění Firejailu, který si poté vytvoří sandbox a spustí v něm vybraný proces.

Pokud se chceme vrátit k původnímu stavu, můžeme automaticky vytvářené symbolické linky zrušit pomocí  firecfg --clean.

Tohle můžeme samozřejmě jednoduše vyvolat i manuálně, pokud chceme některou binárku spustit v sandboxu. Prostě pro ni vytvoříme zmíněný symbolický link sami:

# ln -s /usr/bin/firejail /usr/local/bin/vlc

Parametry

Spouštěné binárce můžeme samozřejmě předat parametry tím, že je zapíšeme dále za její jméno. Tedy například:

# firejail firefox -ProfileManager

Pokud chceme předat parametry přímo Firejailu, musíme je napsat před název binárky. Firejail nabízí mnoho různých možností úpravy běhového prostředí pomocí parametrů. Některé nejzajímavější si ukážeme.

--private je rychlý způsob, jak před aplikací ukrýt soubory v domovském adresáři. Firejail to zařídí tak, že připojí dočasný souborový systém tmpfs na místo domovského adresáře. Soubory pak zmizí, jakmile sandbox uzavřete. Pokud chcete jako domovský adresář použít perzistentní úložiště, můžete cestu k novému domovskému adresáři uvést:  --private=/nejaka/cesta.

--net umožňuje vytvořit nový síťový namespace a připojit do k existujícímu síťovému rozhraní. Pokud není určeno jinak pomocí parametrů --ip a --defaultgw, bude IP adresa a brána shodná s těmi na skutečném rozhraní. Zajímavá je možnost --net=none, která procesu znemožní přístup k síti.

--bandwidth nabízí omezení použitelné šířky pásma síťového připojení. Používá se jednoduchý shaping pomocí tc. Omezení pracuje na úrovní sandboxů. Nejprve je potřeba spustit proces a poté mu nastavit limity. V následujícím příkladu je omezen download na 80 kbps a upload na 20 kbps.

# firejail --name=browser --net=eth0 firefox &
# firejail --bandwidth=browser set eth0 80 20

Obsah profilů

Pro běh Firejailu je zásadní obsah profilů, které se nacházejí v  /etc/firejail/aplikace.profile. Kompletní dokumentace se nachází v samostatné manuálové stránce, tady si jen stručně popíšeme princip.

Použitelné volby je možné rozdělit do několika kategorií:

  • Scripting – interní volby Firejailu umožňující vkládat další soubory ( include) nebo třeba označit cesty, které nikdy nebudou odstraněny ( noblacklist) nebo naopak nikdy nebudou povoleny ( nowhitelist).
  • Filesystem – volby definující souborový systém vytvořený nad skutečným hostitelským systémem. Je možné prvek odstranit ( blackist), povolit jej jen pro čtení ( read-only), připojit jej do dočasného souborového systému ( tmpfs) nebo jej při startu vytvořit ( mkdir). Také je tu možné zapnout soukromý režim ( private).
  • Security filters – možnost přidání dalších bezpečnostních filtrů. Je tu možné zakázat jaderné capabilities ( caps.drop  nebo caps.keep), zvolit povolené protokoly ( protocol) nebo zakázat některá systémová volání ( seccomp.drop).
  • Resource limits – umožňuje omezit systémové zdroje jako virtuální paměť ( rlimit-as), využití procesoru ( rlimit-cpu), obsazení konkrétních procesorových jader ( cpu), nastavení systémové priority ( nice), či automatické ukončení sandboxu po určité době ( timeout).
  • User environment – umožňuje nastavit různé uživatelské parametry sandboxu. Například jej pojmenovat ( name), přidat do něj další proměnné prostředí ( env), či třeba vypnout podporu zvukového subsystému ( nosound).
  • Networking – nastavení parametrů síťování. Zde je možné vytvořit nový síťový namespace ( net), vybrat IP adresu ( ip), výchozí bránu ( defaultgw), DNS resolvery ( dns), MAC adresu ( mac), hodnotu MTU ( mtu) a další.

Odkazy