Flatpak umožňuje desktopovým aplikacím běžet v izolovaných sandboxech, což výrazně zlepšuje zabezpečení, protože zabraňuje aplikacím, aby se navzájem ovlivňovaly a ovlivňovaly hostitelský systém. V praxi však typické aplikace stále potřebují přístup ke službám a uživatelským datům, které jsou sdíleny mezi ostatními aplikacemi a hostitelem. Tato situace byla vylepšena zpřísněním oprávnění kolem mechanismu portálu, i když došlo k dlouhodobému problému:Jak spravovat uživatelská tajemství.
V tomto článku představujeme náš přístup ke správě uživatelských tajemství pro aplikace Flatpak. Zatímco většina aplikací může transparentně využívat výhod navrhovaného mechanismu, některé aplikace potřebují úpravu kódu. Jsou také uvedeny kroky migrace.
Jak se spravují tajemství na ploše Linux
Na moderním linuxovém desktopu je většina tajemství – hesel, tokenů a tak dále, s jejich přidruženými atributy – centrálně spravována procesem démona gnome-keyring-daemon . Aplikace přistupují k tomuto démonovi prostřednictvím rozhraní Secret Service API, které je zpřístupněno prostřednictvím D-Bus. Tento proces se provádí pod kapotou, pokud aplikace používá klientskou knihovnu, jako je libsecret .
Poznámka: Pro stejný účel existuje knihovna s názvem libgnome-keyring , který je dnes již zastaralý. Všimněte si, že navzdory názvu libgnome-keyring je samostatný projekt od gnome-keyring , který NENÍ zastaralý a stále si zachovává ústřední roli správy tajemství.
Na straně démona jsou tajemství uložena v souborovém systému a zašifrována. Kromě toho není démon nic jiného než běžná služba úložiště, což znamená, že jakákoli aplikace může ukládat data na libovolných „cestách“, které ostatní aplikace také vidí. I když je tento model dostačující, pokud věříme všem aplikacím, neguje jeden z bezpečnostních cílů Flatpak:Zvýšit zabezpečení desktopových systémů izolací aplikací od sebe.
Proto při instalaci aplikace Flatpak, která používá rozhraní API tajné služby, je uživatel požádán, aby aplikaci udělil potřebná oprávnění. V níže uvedeném příkladu můžete vidět, že aplikace vyžaduje přístup k Secret Service API (org.freedesktop.secrets ). Pokud uživatel nechce této aplikaci povolit přístup ke službě, jeho jedinou možností je zrušit instalaci:
$ flatpak install org.gnome.Epiphany
…
org.gnome.Epiphany permissions:
ipc network pulseaudio wayland
x11 dri file access [1] dbus access [2]
system dbus access [3]
[1] xdg-download, xdg-run/dconf, ~/.config/dconf:ro
[2] ca.desrt.dconf, org.freedesktop.Notifications, org.freedesktop.secrets
[3] org.freedesktop.GeoClue2
Proceed with these changes to the Default system installation? [Y/n]:
To je zjevně nežádoucí výsledek.
Přístup k místnímu úložišti
Základní myšlenkou, jak tento problém vyřešit, je uložit tajemství na straně aplikace, nikoli na straně hostitele (gnome-keyring-daemon ). Tato praxe je analogická nedávné práci na GSettings, kde aplikace ukládají data nastavení do místního souboru namísto do dconf služba běžící na hostiteli.
Pokud jde o tajemství, existuje problém s bootstrapingem:Aplikace musí šifrovat tajemství, když je ukládá do místního souboru, ale zatím nezná šifrovací klíč. Abychom aplikaci zajistili šifrovací klíč, spoléháme na mechanismus portálu Flatpak, který je umístěn mezi aplikací a hostitelem a umožňuje těmto dvěma komunikovat prostřednictvím omezeného rozhraní.
Přidali jsme také nový portál, který aplikacím umožňuje získávat šifrovací klíče. Nejprve aplikace odešle na portál požadavek (požadavek obsahuje unixový souborový deskriptor, kde je zapsán šifrovací klíč). Poté portál deleguje požadavek na implementaci back-endu v gnome-keyring-daemon , který odešle jedinečný šifrovací klíč pro aplikaci v karanténě prostřednictvím deskriptoru souboru.
Pomocí přijatého šifrovacího klíče aplikace zašifruje tajné informace a uloží je do datového adresáře aplikace (~/.var/app/$APPID/data/keyrings ), což je závazné -připojeno a přístupné z hostitele i ze sandboxu.
Rozhraní libsecret API
libsecret projekt poskytuje dvě různé sady rozhraní API. Jedním je jednoduché API a druhým úplné API. První poskytuje jednodušší, bezstavové operace pro získávání a ukládání tajných informací, zatímco druhý poskytuje úplnější, objektově orientované API, které mapuje rozhraní D-Bus na C API.
Místní úložiště je podporováno pouze v jednoduchém rozhraní API. Pokud vaše aplikace již používají jednoduché API, budou automaticky používat místní úložiště, když běží pod Flatpakem. V opačném případě, aby bylo možné povolit místní úložiště, je třeba aplikace portovat na jednoduché rozhraní API. Podívejte se na migrační patch v Epiphany jako příklad.
Rozdíl mezi dvěma sadami API také umožňuje aplikacím odhlásit se z používání místního úložiště. Pokud je vaše aplikace například správcem hesel, který potřebuje úplný přístup k svazkům klíčů uživatelů, můžete místní úložiště obejít pomocí úplného rozhraní API.
Formát svazku klíčů
I když v ideálním případě bychom měli být schopni používat stejný formát klíčenek pro místní úložiště i gnome-keyring-daemon , jsme si uvědomili, že formát klíčenky používaný gnome-keyring-daemon má omezení. Tajemství, včetně přidružených atributů, jsou šifrována jako jeden blok, což znamená, že mohou spotřebovat zbytečné množství uzamčené paměti. Také atributy jsou hašovány bez klíče, což znamená, že je možné uhodnout, která tajemství jsou v souboru uložena.
Proto jsme se místo implementace tohoto formátu na dvou místech rozhodli definovat novou verzi formátu souboru klíčenek s následujícími charakteristikami: Tajemství jsou šifrována jednotlivě a hodnoty hash atributů jsou nyní ověřovacím kódem zprávy (MAC) nad atributy.
Tento nový formát je založen na serializačním formátu GVariant, s výjimkou záhlaví, a tato změna nám umožňuje znovu použít většinu kódu pro kódování, dekódování a vyhledávání.
Co bude dál pro správu tajemství Flatpak
Potřebné záplaty jsou (aktuálně) dostupné pouze v repozitářích Git příslušných komponent (xdg-desktop-portal , gnome-keyring a libsecret ). Budou zahrnuty v příštích vydáních před GNOME 3.36.
Jste-li vývojář, v této oblasti je stále co zlepšovat. Zde bychom vaši pomoc velmi ocenili:
-
Přívěsky klíčů relace: Rozhraní Secret Service API podporuje svazky klíčů „relace“, které trvají pouze po dobu trvání uživatelské relace. Backend místního úložiště tuto funkci zatím nepodporuje. Tento kód lze implementovat pomocí svazku klíčů relace v jádře Linuxu.
-
Aplikace pro správu a zálohování: Tajné informace aplikací jsou nyní uloženy na více místech, nejen na svazcích klíčů hostitele. Bylo by užitečné, kdyby existoval nástroj pro správu tajemství aplikací a vytváření záloh. Tento proces by měl být možný díky vylepšení Seahorse GNOME, aby se podíval na tajemství aplikace.
-
Portál online účtů: V dnešní době je běžné, že webové aplikace jsou integrovány s webovými protokoly delegování přístupu, jako je OAuth 2.0. Tyto protokoly jsou podporovány gnome-online-accounts , který zase používá gnome-keyring-daemon pro uložení tokenů. Portálové rozhraní pro online účty by bylo užitečné pro omezení přístupu pro jednotlivé aplikace.
-
Širší přijetí nového formátu svazku klíčů: I když má nový formát několik výhod, v současnosti jej používá pouze libsecret na straně aplikace. Bylo by užitečné, kdyby gnome-keyring-daemon na straně hostitele také používá stejný formát.
-
Zpřísnění procesu přeinstalace: Ve výchozím nastavení je soubor svazku klíčů aplikace (~/.var/app/$APPID/data/keyrings ) přetrvává po odinstalaci spolu s dalšími daty. Tato perzistence je zranitelná v případě, že ID aplikace znovu použije nedůvěryhodný vydavatel. V současné době doporučujeme použít --delete-data možnost zajistit odstranění takových dat aplikace. Tento postup by bylo možné zlepšit, pokud by bylo k aplikaci přidruženo ID vydavatele.
Přehled
Tento článek představil mechanismus pro poskytování aplikací Flatpak s uživatelskými tajemstvími. Tento mechanismus byl navržen na základě následujících principů:
- Minimalizujte hostitelské rozhraní.
- Umožněte aplikacím komunikovat s hostitelem prostřednictvím portálu Flatpak.
- Uložte data aplikace v běžném datovém formátu.
Ačkoli je mechanismus transparentní, pokud používáte libsecret , mechanismus je povolen pouze prostřednictvím libsecret jednoduché API. Pro hladší přechod doporučujeme migrovat aplikace na toto API. Více informací o pozadí projektu a zdůvodnění návrhu je k dispozici v prezentaci GUADEC (diapozitivy, záznam).