Sandboxing a Xamarin.Mac app
Tento článek se zabývá sandboxem aplikace Xamarin.Mac pro vydání v App Storu. Zahrnuje všechny prvky, které se týkají sandboxu, jako jsou adresáře kontejnerů, nároky, uživatelsky určená oprávnění, oddělení oprávnění a vynucení jádra.
Přehled
Při práci s jazykem C# a .NET v aplikaci Xamarin.Mac máte stejnou schopnost sandboxovat aplikaci jako při práci s nebo Swiftem Objective-C .
V tomto článku se budeme zabývat základy práce s sandboxem v aplikaci Xamarin.Mac a všemi prvky, které se týkají sandboxingu: adresáře kontejnerů, oprávnění, uživatelsky určená oprávnění, oddělení oprávnění a vynucení jádra. Důrazně doporučujeme, abyste si nejprve prošli článek Hello, Mac , konkrétně úvod do Xcode a Tvůrce rozhraní a výstupy a akce , protože se zabývá klíčovými koncepty a technikami, které budeme používat v tomto článku.
Možná se budete chtít podívat také na třídy a metody v jazyce C#, které jsou uvedeny v Objective-C dokumentu Xamarin.Mac Internals , vysvětluje Register
Export
a atributy používané k připojení tříd jazyka C# k Objective-C objektům a prvkům uživatelského rozhraní.
Informace o sandboxu aplikace
Sandbox aplikace poskytuje silnou ochranu před poškozením, které může způsobovat spuštění škodlivé aplikace na Macu omezením přístupu, který aplikace musí mít na systémové prostředky.
Aplikace, která není v izolovaném prostoru (sandbox), má úplná práva uživatele, který aplikaci spouští, a má přístup k aplikaci nebo k čemukoliv, co uživatel může. Pokud aplikace obsahuje bezpečnostní díry (nebo jakoukoli architekturu, kterou používá), může hacker potenciálně zneužít tyto slabiny a pomocí aplikace převzít kontrolu nad systémem Mac, na kterém běží.
Omezením přístupu k prostředkům na základě jednotlivých aplikací poskytuje aplikace v izolovaném prostoru (sandbox) linii ochrany před krádeží, poškozením nebo škodlivým záměrem v části aplikace spuštěné na počítači uživatele.
Sandbox aplikace je technologie řízení přístupu integrovaná do macOS (vynucená na úrovni jádra), která poskytuje dvounásobnou strategii:
- Sandbox aplikace umožňuje vývojáři popsat , jak bude aplikace pracovat s operačním systémem, a tímto způsobem je udělena pouze přístupová práva, která jsou nutná k dokončení úlohy, a ne další.
- Sandbox aplikace umožňuje uživateli bezproblémově udělit další přístup k systému prostřednictvím dialogových oken Otevřít a Uložit, přetahování operací a dalších běžných uživatelských interakcí.
Příprava na implementaci sandboxu aplikace
Prvky sandboxu aplikace, které budou podrobně popsány v článku, jsou následující:
- Adresáře kontejnerů
- Nároky
- Uživatelsky určená oprávnění
- Oddělení oprávnění
- Vynucení jádra
Po pochopení těchto podrobností budete moct vytvořit plán pro přijetí sandboxu aplikace v aplikaci Xamarin.Mac.
Nejprve budete muset určit, jestli je vaše aplikace vhodným kandidátem pro sandboxing (většina aplikací je). V dalším kroku budete muset vyřešit případné nekompatibility rozhraní API a určit, které prvky sandboxu aplikace budete potřebovat. Nakonec se podívejte na použití oddělení oprávnění k maximalizaci úrovně ochrany aplikace.
Při přijetí sandboxu aplikace se některá umístění systému souborů, která vaše aplikace používá, budou lišit. Aplikace bude mít zejména adresář kontejneru, který se použije pro soubory podpory aplikací, databáze, mezipaměti a všechny ostatní soubory, které nejsou uživatelskými dokumenty. MacOS i Xcode poskytují podporu pro migraci těchto typů souborů ze starších umístění do kontejneru.
Rychlý start pro sandbox
V této části vytvoříme jednoduchou aplikaci Xamarin.Mac, která používá webové zobrazení (které vyžaduje síťové připojení, které je omezeno v sandboxu, pokud není výslovně požadováno) jako příklad zahájení práce s Sandboxem aplikace.
Ověříme, že je aplikace ve skutečnosti v izolovaném prostoru (sandbox) a zjistíme, jak řešit a řešit běžné chyby sandboxu aplikací.
Vytvoření projektu Xamarin.Mac
Pojďme vytvořit náš ukázkový projekt takto:
Spusťte Visual Studio pro Mac a klikněte na odkaz Nové řešení..
V dialogovém okně Nový projekt vyberte Mac>App>Cocoa App:
Klikněte na tlačítko Další , zadejte
MacSandbox
název projektu a klikněte na tlačítko Vytvořit :V oblasti řešení poklikejte na soubor Main.storyboard a otevřete ho pro úpravy v Xcode:
Přetáhněte webové zobrazení do okna, nastavte velikost oblasti obsahu a nastavte jeho zvětšení a zmenšení oknem:
Vytvořte výstup pro webové zobrazení s názvem
webView
:Vraťte se do Visual Studio pro Mac a poklikejte na soubor ViewController.cs v oblasti řešení a otevřete ho pro úpravy.
Přidejte následující příkaz using:
using WebKit;
Udělejte metodu
ViewDidLoad
takto:public override void AwakeFromNib () { base.AwakeFromNib (); webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com"))); }
Uložte provedené změny.
Spusťte aplikaci a ujistěte se, že se web Apple zobrazí v okně následujícím způsobem:
Podepisování a zřizování aplikace
Než budeme moct povolit Sandbox aplikace, musíme nejprve zřídit a podepsat aplikaci Xamarin.Mac.
Udělejte toto:
Přihlaste se k portálu Apple Developer Portal:
Vyberte certifikáty, identifikátory a profily:
V části Aplikace pro Mac vyberte Identifikátory:
Vytvořte nové ID pro aplikaci:
V části Zřizovací profily vyberte Vývoj:
Vytvořte nový profil a vyberte Vývoj aplikací pro Mac:
Vyberte ID aplikace, které jsme vytvořili výše:
Vyberte vývojáře pro tento profil:
Vyberte počítače pro tento profil:
Zadejte název profilu:
Klikněte na tlačítko Hotovo .
Důležité
V některých případech možná budete muset stáhnout nový zřizovací profil z vývojářského portálu Společnosti Apple přímo a poklikáním na něj nainstalovat. Možná budete muset také zastavit a restartovat Visual Studio pro Mac, než bude mít přístup k novému profilu.
Dále musíme načíst nové ID a profil aplikace na vývojovém počítači. Pojďme udělat toto:
Spusťte Xcode a v nabídce Xcode vyberte Předvolby:
Klikněte na tlačítko Zobrazit podrobnosti...
Klikněte na tlačítko Aktualizovat (v levém dolním rohu).
Klikněte na tlačítko Hotovo .
Dále musíme v projektu Xamarin.Mac vybrat nové ID aplikace a zřizovací profil. Pojďme udělat toto:
V oblasti řešení poklikejte na soubor Info.plist a otevřete ho pro úpravy.
Ujistěte se, že identifikátor sady odpovídá našemu ID aplikace, které jsme vytvořili výše (příklad:
com.appracatappra.MacSandbox
):Potom poklikejte na soubor Entitlements.plist a ujistěte se, že úložiště klíč-hodnota iCloudu a kontejnery iCloud odpovídají našemu ID aplikace, které jsme vytvořili výše (příklad:
com.appracatappra.MacSandbox
):Uložte provedené změny.
Na panelu řešení poklikejte na soubor projektu a otevřete jeho možnosti pro úpravy:
Vyberte Podepisování pro Mac a pak zaškrtněte políčko Podepsat sadu aplikací a Podepsat instalační balíček. V části Zřizovací profil vyberte ten, který jsme vytvořili výše:
Klikněte na tlačítko Hotovo .
Důležité
Možná budete muset ukončit a restartovat Visual Studio pro Mac, aby bylo možné rozpoznat nové ID aplikace a zřizovací profil, který nainstaloval Xcode.
Řešení potíží se zřizováním
V tomto okamžiku byste se měli pokusit spustit aplikaci a ujistit se, že je vše podepsané a zřízené správně. Pokud aplikace pořád běží stejně jako předtím, všechno je v pořádku. V případě selhání se může zobrazit dialogové okno podobné tomuto:
Tady jsou nejčastější příčiny problémů se zřizováním a podepisováním:
- ID sady aplikací neodpovídá ID aplikace vybraného profilu.
- ID vývojáře neodpovídá ID vývojáře vybraného profilu.
- UUID otestovaného macu není zaregistrovaný jako součást vybraného profilu.
V případě problému opravte problém na portálu pro vývojáře Apple, aktualizujte profily v Xcode a proveďte čisté sestavení v Visual Studio pro Mac.
Povolení sandboxu aplikace
Sandbox aplikace povolíte zaškrtnutím políčka v možnostech projektů. Postupujte následovně:
V oblasti řešení poklikejte na soubor Entitlements.plist a otevřete ho pro úpravy.
Zkontrolujte oprávnění a povolte sandboxování aplikací:
Uložte provedené změny.
V tomto okamžiku jste povolili Sandbox aplikace, ale nezadáli jste požadovaný síťový přístup pro webové zobrazení. Pokud teď aplikaci spustíte, měli byste získat prázdné okno:
Ověření, že je aplikace v izolovaném prostoru (sandbox)
Kromě chování blokujícího prostředky existují tři hlavní způsoby, jak zjistit, jestli byla aplikace Xamarin.Mac úspěšně sandboxovaná:
Ve Finderu
~/Library/Containers/
zkontrolujte obsah složky – Pokud je aplikace v izolovaném prostoru (sandbox), zobrazí se složka s názvem identifikátor sady vaší aplikace (příklad:com.appracatappra.MacSandbox
):Systém uvidí aplikaci jako sandbox v monitorování aktivit:
- Spuštění monitorování aktivit (v části
/Applications/Utilities
). - Zvolte Zobrazit>sloupce a ujistěte se, že je zaškrtnutá položka nabídky Sandbox.
- Ujistěte se, že se sloupec sandboxu přečte
Yes
pro vaši aplikaci:
- Spuštění monitorování aktivit (v části
Zkontrolujte, jestli je binární soubor aplikace v izolovaném prostoru (sandbox):
- Spusťte terminálovou aplikaci.
- Přejděte do adresáře aplikací
bin
. - Zadejte tento příkaz:
codesign -dvvv --entitlements :- executable_path
(kdeexecutable_path
je cesta k vaší aplikaci):
Ladění aplikace v izolovaném prostoru (sandbox)
Ladicí program se připojí k aplikacím Xamarin.Mac prostřednictvím protokolu TCP, což znamená, že když povolíte sandboxing, nemůže se k aplikaci připojit, takže pokud se pokusíte spustit aplikaci bez povolených správných oprávnění, zobrazí se chyba Nejde se připojit k ladicímu programu.
Oprávnění Povolit odchozí síťová připojení (klient) je oprávnění vyžadované pro ladicí program a povolením tohoto typu umožníte normální ladění. Vzhledem k tomu, že bez toho nemůžete ladit, aktualizovali CompileEntitlements
jsme cíl msbuild
tak, aby automaticky přidal toto oprávnění k nárokům pro jakoukoli aplikaci, která je v izolovaném prostoru (sandbox) pouze pro sestavení ladění. Sestavení vydaných verzí by měla používat oprávnění zadaná v souboru nároků bez úprav.
Řešení porušení sandboxu aplikace
K porušení sandboxu aplikace dochází v případě, že se aplikace Xamarin.Mac v izolovaném prostoru pokusila získat přístup k prostředku, který explicitně nepovolil. Naše webové zobrazení už například nemůže zobrazit web Apple.
K nejběžnějšímu zdroji porušení sandboxu aplikace dochází, když nastavení oprávnění zadaná v Visual Studio pro Mac neodpovídají požadavkům aplikace. Znovu se vraťte k našemu příkladu s chybějícími nároky na síťové připojení, které brání fungování webového zobrazení.
Zjišťování porušení sandboxu aplikace
Pokud máte podezření, že v aplikaci Xamarin.Mac dochází k porušení sandboxu aplikace, nejrychlejší způsob, jak zjistit problém, je použití konzolové aplikace.
Postupujte následovně:
Zkompilujte danou aplikaci a spusťte ji z Visual Studio pro Mac.
Otevřete konzolovou aplikaci (z
/Applications/Utilties/
).Na bočním panelu vyberte Všechny zprávy a zadejte
sandbox
do hledání:
U výše uvedené ukázkové aplikace vidíte, že Kernal blokuje network-outbound
provoz z důvodu sandboxu aplikace, protože jsme to nepožadovali.
Oprava porušení sandboxu aplikace s nároky
Teď, když jsme viděli, jak najít porušení sandboxu aplikace, pojďme se podívat, jak se dají vyřešit úpravou nároků naší aplikace.
Postupujte následovně:
V oblasti řešení poklikejte na soubor Entitlements.plist a otevřete ho pro úpravy.
V části Nároky zaškrtněte políčko Povolit odchozí síťová připojení (klient):
Uložte změny aplikace.
Pokud pro naši ukázkovou aplikaci provedeme výše uvedené kroky, sestavíme ho a spustíme, webový obsah se teď zobrazí podle očekávání.
Podrobný sandbox aplikace
Mechanismy řízení přístupu poskytované sandboxem aplikace jsou málo a snadno pochopitelné. Způsob, jakým bude sandbox aplikace přijat každou aplikací, je ale jedinečný a na základě požadavků aplikace.
Vzhledem k tomu, že se vaše aplikace Xamarin.Mac snaží chránit před zneužitím škodlivého kódu, musí existovat pouze jedna chyba zabezpečení v aplikaci (nebo jedné z knihoven nebo architektur, které využívá) k získání kontroly nad interakcí aplikace se systémem.
Sandbox aplikace byl navržen tak, aby zabránil převzetí (nebo omezil poškození, které může způsobit) tím, že vám umožní určit zamýšlené interakce aplikace se systémem. Systém udělí přístup pouze k prostředku, který vaše aplikace vyžaduje, aby se jeho úloha dokončila a nic dalšího.
Při návrhu sandboxu aplikace navrhujete scénář nejhoršího případu. Pokud dojde k ohrožení zabezpečení aplikace škodlivým kódem, omezí se přístup jenom k souborům a prostředkům v sandboxu aplikace.
Nároky a přístup k systémovým prostředkům
Jak jsme viděli výše, aplikace Xamarin.Mac, která nebyla v izolovaném prostoru (sandbox), má udělená úplná práva a přístup uživatele, který aplikaci spouští. V případě ohrožení škodlivého kódu může nechráněná aplikace fungovat jako agent pro nepřátelské chování s širokým rozsahem potenciálního poškození.
Povolením sandboxu aplikace odeberete jenom minimální sadu oprávnění, která pak znovu povolíte jenom s použitím nároků aplikace Xamarin.Mac.
Prostředky sandboxu aplikace aplikace upravíte úpravou souboru Entitlements.plist a zaškrtnutím nebo výběrem práv požadovaných v rozevíracích polích editorů:
Adresáře kontejnerů a přístup k systému souborů
Když vaše aplikace Xamarin.Mac přijme Sandbox aplikace, má přístup k následujícím umístěním:
- Adresář kontejneru aplikací – Při prvním spuštění vytvoří operační systém speciální adresář kontejneru, ke kterému mají přístup všechny jeho prostředky. Aplikace bude mít k tomuto adresáři úplný přístup pro čtení a zápis.
- Adresáře kontejnerů skupin aplikací – Aplikaci je možné udělit přístup k jednomu nebo více kontejnerům skupin, které se sdílejí mezi aplikacemi ve stejné skupině.
- Soubory zadané uživatelem – Aplikace automaticky získá přístup k souborům, které jsou explicitně otevřeny nebo přetaženy do aplikace uživatelem.
- Související položky – S příslušnými nároky může mít vaše aplikace přístup k souboru se stejným názvem, ale s jinou příponou. Například dokument, který byl uložen jako
.txt
soubor i soubor.pdf
. - Dočasné adresáře, adresáře nástrojů příkazového řádku a konkrétní svět čitelná umístění – Vaše aplikace má různý stupeň přístupu k souborům v jiných dobře definovaných umístěních, jak určuje systém.
Adresář kontejneru aplikace
Adresář kontejneru aplikací aplikace Xamarin.Mac má následující charakteristiky:
- Nachází se ve skrytém umístění v domovském adresáři uživatele (obvykle
~Library/Containers
) a je přístupný pomocíNSHomeDirectory
funkce (viz níže) v rámci vaší aplikace. Protože je v domovském adresáři, každý uživatel získá pro aplikaci vlastní kontejner. - Aplikace má neomezený přístup pro čtení a zápis do služby Container Directory a všechny jeho podadresáři a soubory v něm.
- Většina rozhraní API pro hledání cest pro macOS je relativní vzhledem ke kontejneru aplikace. Kontejner bude mít například vlastní knihovnu (přístup prostřednictvím
NSLibraryDirectory
), podadresáře Podpory aplikací a Předvolby . - macOS vytváří a vynucuje propojení mezi aplikacemi a jeho kontejnery prostřednictvím podepisování kódu. Dokonce i jiná aplikace se pokusí aplikaci zoofovat pomocí identifikátoru sady prostředků, nebude mít přístup ke kontejneru kvůli podepisování kódu.
- Kontejner není určený pro uživatelem generované soubory. Místo toho se používá pro soubory, které vaše aplikace používá, jako jsou databáze, mezipaměti nebo jiné konkrétní typy dat.
- U typů aplikací do botníku (například aplikace Fotka od Společnosti Apple) se obsah uživatele přesune do kontejneru.
Důležité
Xamarin.Mac bohužel ještě nemá 100% pokrytí rozhraní API (na rozdíl od Xamarin.iOS), proto NSHomeDirectory
rozhraní API nebylo namapováno v aktuální verzi Xamarin.Mac.
Jako dočasné alternativní řešení můžete použít následující kód:
[System.Runtime.InteropServices.DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")]
public static extern IntPtr NSHomeDirectory();
public static string ContainerDirectory {
get {
return ((NSString)ObjCRuntime.Runtime.GetNSObject(NSHomeDirectory())).ToString ();
}
}
Adresář kontejneru skupiny aplikací
Od macOS 10.7.5 (a vyšší) může aplikace používat com.apple.security.application-groups
nárok na přístup ke sdílenému kontejneru, který je společný pro všechny aplikace ve skupině. Tento sdílený kontejner můžete použít pro neuživatelný obsah, jako je databáze nebo jiné typy podpůrných souborů (například mezipaměti).
Kontejnery skupin se automaticky přidají do kontejneru sandboxu každé aplikace (pokud jsou součástí skupiny) a ukládají se na ~/Library/Group Containers/<application-group-id>
adrese . ID skupiny musí začínat ID vývojového týmu a tečkou, například:
<team-id>.com.company.<group-name>
Další informace najdete v tématu Apple Přidání aplikace do skupiny aplikací v referenčních informacích ke klíči nároku.
Přístup k Powerboxu a systému souborů mimo kontejner aplikace
Aplikace Xamarin.Mac v izolovaném prostoru (sandbox) má přístup k umístěním systému souborů mimo svůj kontejner následujícími způsoby:
- V konkrétním směru uživatele (prostřednictvím dialogových oken Otevřít a Uložit nebo jiné metody, jako je přetažení).
- Pomocí nároků pro konkrétní umístění systému souborů (například
/bin
)/usr/lib
- Pokud je umístění systému souborů v určitých adresářích, které jsou na světě čitelné (například sdílení).
Powerbox je technologie zabezpečení systému macOS, která komunikuje s uživatelem a rozšiřuje přístupová práva k souborům aplikace Xamarin.Mac v izolovaném prostoru (sandbox). Powerbox nemá žádné rozhraní API, ale je aktivované transparentně, když aplikace volá nebo NSOpenPanel
NSSavePanel
. Přístup ke službě Powerbox je povolený prostřednictvím nároků, které jste nastavili pro aplikaci Xamarin.Mac.
Když aplikace v izolovaném prostoru (sandbox) zobrazí dialogové okno Otevřít nebo Uložit, zobrazí powerbox (a ne AppKit), takže má přístup k libovolnému souboru nebo adresáři, ke kterému má uživatel přístup.
Když uživatel vybere soubor nebo adresář z dialogového okna Otevřít nebo Uložit (nebo ho přetáhne na ikonu aplikace), Powerbox přidá přidruženou cestu k sandboxu aplikace.
Systém navíc automaticky povolí aplikaci v izolovaném prostoru (sandbox):
- Připojení k metodě zadávání systému
- Volejte služby vybrané uživatelem z nabídky Služby (pouze pro služby označené jako bezpečné pro aplikace sandboxu poskytovatelem služeb).
- Otevřete soubory, které uživatel zvolí v nabídce Otevřít poslední .
- Použijte možnost Kopírovat a vložit mezi jinými aplikacemi.
- Čtení souborů z následujících umístění s možností čtení:
/bin
/sbin
/usr/bin
/usr/lib
/usr/sbin
/usr/share
/System
- Čtení a zápis souborů v adresářích vytvořených nástrojem
NSTemporaryDirectory
.
Ve výchozím nastavení zůstanou soubory otevřené nebo uložené v aplikaci Xamarin.Mac v izolovaném prostoru (pokud se soubor po ukončení aplikace stále neotevře). Otevřené soubory se automaticky obnoví do sandboxu aplikace prostřednictvím funkce obnovení macOS při příštím spuštění aplikace.
Pokud chcete zajistit trvalost souborů umístěných mimo kontejner aplikace Xamarin.Mac, použijte záložky s oborem zabezpečení (viz níže).
Související položky
Sandbox aplikace umožňuje aplikaci přistupovat k souvisejícím položkám, které mají stejný název souboru, ale různá rozšíření. Tato funkce má dvě části: a) seznam souvisejících rozšíření v souboru aplikace Info.plst
, b) kód, který řekne sandboxu, co bude aplikace s těmito soubory dělat.
Existují dva scénáře, kdy to dává smysl:
- Aplikace musí být schopná uložit jinou verzi souboru (s novou příponou). Například export
.txt
souboru do.pdf
souboru. Chcete-li tuto situaci vyřešit, musíte použítNSFileCoordinator
přístup k souboru. Nejprve zavoláte metoduWillMove(fromURL, toURL)
, přesunete soubor do nové přípony a pak zavoláteItemMoved(fromURL, toURL)
. - Aplikace musí otevřít hlavní soubor s jednou příponou a několika podpůrnými soubory s různými příponami. Například film a soubor titulků.
NSFilePresenter
Slouží k získání přístupu k sekundárnímu souboru. Zadejte hlavní soubor vlastnostiPrimaryPresentedItemURL
a sekundární soubor vlastnostiPresentedItemURL
. Při otevření hlavního souboru zavolejteAddFilePresenter
metoduNSFileCoordinator
třídy pro registraci sekundárního souboru.
V obou scénářích musí soubor Info.plist aplikace deklarovat typy dokumentů, které může aplikace otevřít. Pro jakýkoli typ souboru přidejte NSIsRelatedItemType
(s hodnotou YES
) do jeho položky v CFBundleDocumentTypes
poli.
Otevření a uložení chování dialogového okna s aplikacemi v izolovaném prostoru (sandbox)
Následující omezení se umisťují NSOpenPanel
do a NSSavePanel
při jejich volání z aplikace Xamarin.Mac v izolovaném prostoru (sandbox):
- Tlačítko OK nelze vyvolat prostřednictvím kódu programu.
- Nelze programově změnit výběr uživatele v objektu
NSOpenSavePanelDelegate
.
Kromě toho platí následující úpravy dědičnosti:
- Aplikace -
NSOpenPanel
mimo sandboxNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel
Záložky s vymezeným zabezpečením a trvalý přístup k prostředkům
Jak je uvedeno výše, aplikace Xamarin.Mac v izolovaném prostoru (sandbox) má přístup k souboru nebo prostředku mimo svůj kontejner prostřednictvím přímé interakce uživatele (jak poskytuje PowerBox). Přístup k těmto prostředkům se ale automaticky neuchovává napříč spuštěními aplikací nebo restartováním systému.
Pomocí záložek s oborem zabezpečení může aplikace Xamarin.Mac v izolovaném prostoru (sandbox) zachovat záměr uživatele a po restartování aplikace udržovat přístup k daným prostředkům.
Typy záložek v oboru zabezpečení
Při práci se záložkami s vymezeným zabezpečením a trvalým přístupem k prostředkům existují dva případy použití:
Záložka s oborem aplikace poskytuje trvalý přístup k souboru nebo složce zadanému uživatelem.
Pokud například aplikace Xamarin.Mac v izolovaném prostoru umožňuje otevřít externí dokument pro úpravy (pomocí
NSOpenPanel
a), může aplikace vytvořit záložku s vymezeným oborem aplikace, aby v budoucnu znovu získal přístup ke stejnému souboru.Záložka s vymezeným oborem dokumentu poskytuje konkrétní trvalý přístup k podsouboru.
Například aplikace pro úpravy videa, která vytvoří soubor projektu, který má přístup k jednotlivým obrázkům, videoklipům a zvukovým souborům, které se později zkombinují do jednoho filmu.
Když uživatel importuje soubor zdroje do projektu (prostřednictvím a NSOpenPanel
), aplikace vytvoří záložku s oborem dokumentu pro položku uloženou v projektu, aby byl soubor vždy přístupný pro aplikaci.
Záložku s oborem dokumentu lze vyřešit libovolnou aplikací, která může otevřít data záložky a samotný dokument. To podporuje přenositelnost, což uživateli umožňuje odeslat soubory projektu jinému uživateli a mít pro ně také všechny záložky.
Důležité
Záložka s oborem dokumentu může odkazovat pouze na jeden soubor, nikoli na složku a tento soubor nemůže být v umístění používaném systémem (například /private
)./Library
Použití záložek s vymezeným zabezpečením
Použití některého typu záložky s oborem zabezpečení vyžaduje, abyste provedli následující kroky:
- Nastavte příslušná oprávnění v aplikaci Xamarin.Mac, která potřebuje použít záložky s oborem zabezpečení – pro záložky v rozsahu aplikace nastavte
com.apple.security.files.bookmarks.app-scope
klíč oprávnění natrue
. U záložek s vymezeným dokumentem nastavtecom.apple.security.files.bookmarks.document-scope
klíč oprávnění natrue
hodnotu . - Vytvořte záložku s oborem zabezpečení – provedete to pro všechny soubory nebo složky, ke kterým uživatel poskytl přístup (například prostřednictvím
NSOpenPanel
), ke kterému bude aplikace potřebovat trvalý přístup.public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)
K vytvoření záložky použijte metoduNSUrl
třídy. - Vyřešte záložku s oborem zabezpečení – Když aplikace potřebuje znovu získat přístup k prostředku (například po restartování), bude potřeba ji přeložit na adresu URL s vymezeným zabezpečením.
public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)
K vyřešení záložky použijte metoduNSUrl
třídy. - Explicitně upozorněte systém, že chcete získat přístup k souboru z adresy URL s oborem zabezpečení – tento krok je potřeba provést okamžitě po získání výše uvedené adresy URL s oborem zabezpečení nebo, když později budete chtít znovu získat přístup k prostředku poté, co se k němu znovu připojíte.
StartAccessingSecurityScopedResource ()
Voláním metodyNSUrl
třídy začněte přistupovat k adrese URL s oborem zabezpečení. - Explicitně upozorněte systém, že máte přístup k souboru z adresy URL s oborem zabezpečení – co nejdříve byste měli systém informovat, když aplikace už k souboru nepotřebuje přístup (například pokud ho uživatel zavře).
StopAccessingSecurityScopedResource ()
Voláním metodyNSUrl
třídy zastavte přístup k adrese URL s oborem zabezpečení.
Po opětovném zřízení přístupu k prostředku se budete muset vrátit ke kroku 4, abyste znovu vytvořili přístup. Pokud se aplikace Xamarin.Mac restartuje, musíte se vrátit ke kroku 3 a znovu ji vyřešit.
Důležité
Pokud se nepodaří uvolnit přístup k prostředkům adresy URL s vymezeným zabezpečením, dojde k úniku prostředků jádra v aplikaci Xamarin.Mac. V důsledku toho už aplikace nebude moct do kontejneru přidávat umístění systému souborů, dokud se nerestartuje.
Podepisování kódu a sandboxu aplikace
Po povolení sandboxu aplikace a povolení konkrétních požadavků pro aplikaci Xamarin.Mac (prostřednictvím nároků) musíte projekt podepsat, aby se sandboxing projevil. Podepisování kódu musíte provést, protože oprávnění požadovaná pro sandbox aplikací jsou propojená s podpisem aplikace.
macOS vynucuje propojení mezi kontejnerem aplikace a jeho podpisem kódu, tímto způsobem k tomuto kontejneru nemá přístup žádná jiná aplikace, a to ani v případě, že id sady prostředků aplikací falšuje. Tento mechanismus funguje takto:
- Když systém vytvoří kontejner aplikace, nastaví pro něj seznam řízení přístupu (ACL). Počáteční položka řízení přístupu v seznamu obsahuje určený požadavek aplikace (DR), který popisuje, jak lze rozpoznat budoucí verze aplikace (při upgradu).
- Pokaždé, když se spustí aplikace se stejným ID sady prostředků, systém zkontroluje, že podpis kódu aplikace odpovídá určeným požadavkům zadaným v některé z položek v seznamu ACL kontejneru. Pokud systém nenajde shodu, zabrání spuštění aplikace.
Podepisování kódu funguje následujícími způsoby:
- Před vytvořením projektu Xamarin.Mac získejte certifikát pro vývoj, distribuční certifikát a certifikát ID vývojáře z portálu Apple Developer Portal.
- Když Mac App Store distribuuje aplikaci Xamarin.Mac, je podepsaná podpisem kódu Apple.
Při testování a ladění budete používat verzi aplikace Xamarin.Mac, kterou jste podepsali (která se použije k vytvoření kontejneru aplikace). Pokud budete chtít později otestovat nebo nainstalovat verzi z Apple App Storu, podepíše se pod podpisem Apple a nespustí se (protože nemá stejný podpis kódu jako původní kontejner aplikace). V této situaci se zobrazí zpráva o chybovém ukončení podobná této:
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Pokud chcete tento problém vyřešit, budete muset upravit položku seznamu ACL tak, aby odkazovat na verzi aplikace podepsanou společností Apple.
Další informace o vytváření a stahování zřizovacích profilů požadovaných pro sandboxing najdete v části Podepisování a zřizování aplikace výše.
Úprava položky seznamu ACL
Pokud chcete povolit spuštění podepsané verze aplikace Xamarin.Mac společnosti Apple, postupujte takto:
- Otevřete aplikaci Terminal (in
/Applications/Utilities
). - Otevřete okno Finderu pro apple podepsanou verzi aplikace Xamarin.Mac.
- Zadejte
asctl container acl add -file
okno terminálu. - Přetáhněte ikonu aplikace Xamarin.Mac z okna Finderu a přetáhněte ji do okna Terminálu.
- Úplná cesta k souboru se přidá do příkazu v terminálu.
- Stisknutím klávesy Enter spusťte příkaz.
Seznam ACL kontejneru teď obsahuje určené požadavky na kód pro obě verze aplikace Xamarin.Mac a macOS.
Zobrazení seznamu požadavků na kód seznamu ACL
Seznam požadavků na kód můžete zobrazit v seznamu ACL kontejneru následujícím způsobem:
- Otevřete aplikaci Terminal (in
/Applications/Utilities
). - Zadejte
asctl container acl list -bundle <container-name>
. - Stisknutím klávesy Enter spusťte příkaz.
Obvykle <container-name>
je identifikátor sady pro aplikaci Xamarin.Mac.
Návrh aplikace Xamarin.Mac pro Sandbox aplikace
Při návrhu aplikace Xamarin.Mac pro sandbox aplikace je potřeba dodržovat běžný pracovní postup. To znamená, že specifika implementace sandboxu v aplikaci budou jedinečná pro funkčnost dané aplikace.
Šest kroků pro přijetí sandboxu aplikace
Návrh aplikace Xamarin.Mac pro Sandbox aplikace se obvykle skládá z následujících kroků:
- Určete, jestli je aplikace vhodná pro sandbox.
- Návrh strategie vývoje a distribuce
- Vyřešte případné nekompatibility rozhraní API.
- Použijte požadovaná oprávnění sandboxu aplikace na projekt Xamarin.Mac.
- Přidejte oddělení oprávnění pomocí XPC.
- Implementujte strategii migrace.
Důležité
Musíte nejen sandbox hlavní spustitelný soubor v sadě aplikací, ale také všechny zahrnuté pomocné aplikace nebo nástroje v této sadě. To se vyžaduje pro libovolnou aplikaci distribuovanou z Mac App Storu a pokud je to možné, měla by být provedena pro jakoukoli jinou formu distribuce aplikací.
Seznam všech spustitelných binárních souborů v sadě aplikací Xamarin.Mac zobrazíte zadáním následujícího příkazu v terminálu:
find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"
Kde [Your-App-Bundle]
je název a cesta k sadě aplikace.
Určení, jestli je aplikace Xamarin.Mac vhodná pro sandboxing
Většina aplikací Xamarin.Mac je plně kompatibilní s sandboxem aplikací, a proto je vhodná pro sandbox. Pokud aplikace vyžaduje chování, které sandbox aplikace neumožňuje, měli byste zvážit alternativní přístup.
Pokud vaše aplikace vyžaduje některé z následujících chování, není kompatibilní s sandboxem aplikace:
- Autorizační služby – S sandboxem aplikace nemůžete pracovat s funkcemi popsanými v referenčních informacích k autorizačním službám C.
- Rozhraní API pro usnadnění – Aplikace pro usnadnění sandboxu, jako jsou čtečky obrazovky nebo aplikace, které řídí jiné aplikace, nemůžete používat.
- Odesílání událostí Apple do libovolných aplikací – pokud aplikace vyžaduje odesílání událostí Apple do neznámé, libovolné aplikace, nemůže být v izolovaném prostoru (sandbox). U známého seznamu pojmenovaných aplikací může být aplikace stále v izolovaném prostoru (sandbox) a nároky musí obsahovat pojmenovaný seznam aplikací.
- Posílat slovníky informací o uživatelích v distribuovaných oznámeních do jiných úloh – s sandboxem aplikace nemůžete při publikování do objektu
NSDistributedNotificationCenter
zahrnoutuserInfo
slovník pro zasílání dalších úkolů. - Načtení rozšíření jádra – Načítání rozšíření jádra je zakázáno sandboxem aplikace.
- Simulace uživatelského vstupu v dialogových oknech Otevřít a Uložit – Aplikace sandbox zakáže práci s dialogovými okny Otevřít nebo Uložit, aby simuloval nebo změnil uživatelský vstup.
- Přístup k předvolbě nebo nastavení v jiných aplikacích – Manipulace s nastavením jiných aplikací je zakázána sandboxem aplikace.
- Konfigurace nastavení sítě – Manipulace s nastavením sítě je zakázána sandboxem aplikace.
- Ukončování jiných aplikací – Sandbox aplikace zakáže použití
NSRunningApplication
k ukončení jiných aplikací.
Řešení nekompatibility rozhraní API
Při navrhování aplikace Xamarin.Mac pro Sandbox aplikace můžete narazit na nekompatibility s využitím některých rozhraní API pro macOS.
Tady je několik běžných problémů a věcí, které je můžete vyřešit:
- Otevírání, ukládání a sledování dokumentů – Pokud spravujete dokumenty pomocí jakékoli jiné technologie než
NSDocument
, měli byste na ni přepnout z důvodu integrované podpory sandboxu aplikace.NSDocument
Automaticky funguje s PowerBoxem a poskytuje podporu pro uchovávání dokumentů v sandboxu, pokud je uživatel přesune ve Finderu. - Zachovat přístup k prostředkům systému souborů – Pokud aplikace Xamarin.Mac závisí na trvalém přístupu k prostředkům mimo svůj kontejner, použijte záložky s vymezeným zabezpečením pro zachování přístupu.
- Vytvoření položky přihlášení pro aplikaci – Pomocí sandboxu aplikace nemůžete vytvořit přihlašovací položku pomocí
LSSharedFileList
ani nemůžete manipulovat se stavem spouštěcích služeb pomocíLSRegisterURL
.SMLoginItemSetEnabled
Použijte funkci, jak je popsáno v Apples Přidání položek přihlášení pomocí dokumentace k rozhraní Service Management Framework. - Přístup k uživatelským datům – Pokud používáte funkce POSIX, jako
getpwuid
je získání domovského adresáře uživatele z adresářových služeb, zvažte použití symbolů Cocoa nebo Core Foundation, jakoNSHomeDirectory
je . - Přístup k předvolbám jiných aplikací – protože Sandbox aplikace směruje rozhraní API pro hledání cest do kontejneru aplikace, probíhá úpravy předvoleb v rámci tohoto kontejneru a přístup k jiným předvolbám aplikací, které nejsou povoleny.
- Použití HTML5 Embedded Video ve webových zobrazeních – Pokud aplikace Xamarin.Mac používá WebKit k přehrávání vložených videí HTML5, musíte aplikaci propojit také s architekturou AV Foundation. Sandbox aplikace zabrání službě CoreMedia přehrávat tato videa jinak.
Použití požadovaných nároků na sandbox aplikací
Budete muset upravit oprávnění pro libovolnou aplikaci Xamarin.Mac, kterou chcete spustit v sandboxu aplikace, a zaškrtnout políčko Povolit sandbox aplikace .
Na základě funkcí aplikace možná budete muset povolit další oprávnění pro přístup k funkcím nebo prostředkům operačního systému. Sandboxing aplikací funguje nejlépe, když minimalizujete nároky, které požadujete na úplné minimum potřebné ke spuštění aplikace, takže stačí jen náhodně povolit nároky.
Pokud chcete zjistit, které nároky vyžaduje aplikace Xamarin.Mac, postupujte takto:
- Povolte Sandbox aplikace a spusťte aplikaci Xamarin.Mac.
- Projděte si funkce aplikace.
- Otevřete konzolovou aplikaci (dostupná v
/Applications/Utilities
) a vyhledejtesandboxd
porušení v protokolu Všechny zprávy . - U každého
sandboxd
porušení vyřešte problém buď pomocí kontejneru aplikace místo jiných umístění systému souborů, nebo použijte oprávnění sandboxu aplikace, abyste povolili přístup k omezeným funkcím operačního systému. - Znovu spusťte a otestujte všechny funkce aplikace Xamarin.Mac znovu.
- Opakujte, dokud se nevyřeší všechna
sandboxd
porušení.
Přidání oddělení oprávnění pomocí XPC
Při vývoji aplikace Xamarin.Mac pro Sandbox aplikace se podívejte na chování aplikace z hlediska oprávnění a přístupu a pak zvažte oddělení vysoce rizikových operací do vlastních služeb XPC.
Další informace najdete v průvodci programováním pro vytváření služeb XPC a démonů a služeb společnosti Apple.
Implementace strategie migrace
Pokud vydáváte novou verzi aplikace Xamarin.Mac v izolovaném prostoru (sandbox), která nebyla dříve v izolovaném prostoru (sandbox), budete muset zajistit, aby aktuální uživatelé měli bezproblémovou cestu upgradu.
Podrobnosti o tom, jak implementovat manifest migrace kontejnerů, najdete v dokumentaci k migraci aplikace do sandboxu společnosti Apple.
Shrnutí
Tento článek se podrobně podíval na sandboxing aplikace Xamarin.Mac. Nejprve jsme vytvořili jednoduchou aplikaci Xamarin.Mac, která zobrazuje základy Sandboxu aplikací. Dále jsme ukázali, jak vyřešit porušení sandboxu. Pak jsme se podrobněji podívali na Sandbox aplikace a nakonec jsme se podívali na návrh aplikace Xamarin.Mac pro Sandbox aplikace.