V první části jsme vytvořili velmi malou aplikaci. Vše, co dělala, byl výpis do standardního výstupu. Takový program je velmi jednoduché umístit do sandboxu. Vzhledem k tomu, že jsme pro aplikaci nespecifikovali žádná povolení, běžela už ve skutečnosti ve velmi těsném sandboxu.
Sandbox dělá následující věci:
- Žádný přístup k souborům hostitele kromě běhového prostředí, aplikace a ~/.var/app/org.test.Hello a pouze poslední z výjmenovaných je zapisovatelný.
- /tpm je unikátní pro každou instanci aplikace.
- Funkce setuid je vypnuta.
- Procesy jsou v cgroup, z které se nemohou dostat. To umožňuje s určitostí říci, v které aplikaci proces běží, aniž by to šlo nějak zakamuflovat (to je velmi důležité pro pozdější nastavení pro jednotlivé aplikace).
- Žádný přístup k síti.
- Žádný přístup k device nodes (kromě /dev/null atd.).
- Nelze vidět procesy mimo sandbox.
- Nahrávají se pravidla seccomp, což limituje systémová volání, která může aplikace udělat. Např. nemůže použít nestandardní typy síťových socketů nebo použít ptrace na další procesy.
- Omezený přístup k dbusu sezení, aplikace má pouze povoleno vlastnit svoje jméno v busu, ale nemůže s ničím komunikovat.
- Žádný přístup ke službám hosta jako X, systémový dbus nebo PulseAudio.
Samozřejmě je velmi jednoduché zabezpečit program "Hello World" vzhledem k tomu, že nepotřebuje nic dělat. Existují návrhy (experimentální kód), jak aplikacím umožnit dostat se bezpečně ze sandboxu (pomocí něčeho, čemu se říká Portals). Nicméně momentálně nejsou stabilní pro běžné používání. Co ale už možné je, je dělání malých děr v sanboxu tak, aby aplikace mohly dělat to, co potřebují.
Mohli jsme to vidět už v druhé části, kde jsme použili následující příkaz, abychom aplikaci udělili přístup k síti a X11:
xdg-app build-finish appdir2 --socket=x11 --share=network --command=gnome-dictionary
Tyto argumenty se překládají do následujících nastavení v souboru metadat pro danou aplikaci:
[Application]
name=org.gnome.Dictionary
runtime=org.gnome.Platform/x86_64/master
sdk=org.gnome.Sdk/x86_64/master
command=gnome-dictionary
[Context]
shared=network;
sockets=x11;
Jelikož jsme aplikaci nedali žádný přístup k souborovému systému, nemůže vidět vaše soubory. To si můžeme ověřit příkazem jako:
$ xdg-app run --command=ls org.gnome.Dictionary ~/
Povolení v souboru metadat jsou ale pouze výchozími hodnotami. Můžete je přepsat různými způsoby. Např. xdg-app run
přijímá stejné argumenty jako build-finish
, což může přepsat povolení pro dané sezení. Např. toto vám umožní vidět domovský adresář:
$ xdg-app run --filesystem=home --command=ls org.gnome.Dictionary ~/
Můžete povolení pro aplikaci přepsat také trvale:
$ xdg-app --user override --filesystem=home org.gnome.Dictionary
$ xdg-app run --command=ls org.gnome.Dictionary ~/
To může být opět přepsáno v určitém sezení:
$ xdg-app run --nofilesystem=home --command=ls org.gnome.Dictionary ~/
Existuje docela dost možností, které kontrolují povolení sandboxu. Takže ukážu seznam užitečných příkladů toho, co lze udělat (povšimněte si, že všechny možnosti mají také negující verzi, např. --unshare
neguje --share
).
Udělte přístup k některým souborům:
--filesystem=host # Všechny soubory
--filesystem=home # Domovská složka
--filesystem=home:ro # Domovská složka, jen pro čtení
--filesystem=/some/dir --filesystem=~/other/dir # cesty
--filesystem=xdg-download # Složka Stažené pro XDG
--nofilesystem=... # Negovat něco z výše napsaného
Povolte aplikaci, aby zobrazovala okna pomocí X11:
--socket=x11 --share=ipc
Poznámka: --share=ipc
znamená, že sandbox s hostitelem sdílí jmenný prostor ipc. To není nezbytně nutné, ale bez toho nebude fungovat rozšíření pro sdílenou paměť v X, což má velký dopad na výkon.
Povolte renderování pomocí OpenGL:
--device=dri
Povolte aplikaci, aby zobrazovala okna pomocí Waylandu:
--socket=wayland
Povolte aplikaci, aby hrála zvuky přes PulseAudio:
--socket=pulseaudio
Dejte aplikaci přístup k síti:
--share=network
Poznámka: udělení přístupu k síti také udělí přístup ke všem službám hostitele, které poslouchají na abstraktních unixových socketech (díky tomu, jak jmenný prostor sítě funguje), a tyto nemají žádnou kontrolu povolení. To se bohužel týká X serveru a busu sezení, protože ve výchozím stavu poslouchají abstraktní sockety. Distribuce dbající bezpečnosti by je měla zakázat a používat pouze bežné sockety.
Povolte aplikaci komunikaci s jmenovanou službou přes bus sezení:
--talk-name=org.freedesktop.secrets
Povolte aplikaci komunikaci s jmenovanou službou přes systémový bus:
--system-talk-name=org.freedesktop.GeoClue2
Dejte aplikaci přístup k celému dbusu:
--socket=system-bus --socket=session-bus
To je pro dnešek vše. V další části se podíváme na to, jak aplikaci distribuovat.
Autorem původního textu je Alex Larsson, který jej publikoval na svém blogu. Na mojefedora.cz jej vydáváme s jeho souhlasem přeložený do češtiny.