Sdílet prostřednictvím


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 .

Příklad spuštěné aplikace

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:

  1. 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ší.
  2. 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:

  1. Spusťte Visual Studio pro Mac a klikněte na odkaz Nové řešení..

  2. V dialogovém okně Nový projekt vyberte Mac>App>Cocoa App:

    Vytvoření nové aplikace Cocoa

  3. Klikněte na tlačítko Další , zadejte MacSandbox název projektu a klikněte na tlačítko Vytvořit :

    Zadání názvu aplikace

  4. V oblasti řešení poklikejte na soubor Main.storyboard a otevřete ho pro úpravy v Xcode:

    Úprava hlavní scénáře

  5. Přetáhněte webové zobrazení do okna, nastavte velikost oblasti obsahu a nastavte jeho zvětšení a zmenšení oknem:

    Přidání webového zobrazení

  6. Vytvořte výstup pro webové zobrazení s názvem webView:

    Vytvoření nové zásuvky

  7. Vraťte se do Visual Studio pro Mac a poklikejte na soubor ViewController.cs v oblasti řešení a otevřete ho pro úpravy.

  8. Přidejte následující příkaz using: using WebKit;

  9. Udělejte metodu ViewDidLoad takto:

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. 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:

Zobrazení ukázkového spuštění aplikace

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:

  1. Přihlaste se k portálu Apple Developer Portal:

    Přihlášení k portálu Apple Developer Portal

  2. Vyberte certifikáty, identifikátory a profily:

    Výběr certifikátů, identifikátorů a profilů

  3. V části Aplikace pro Mac vyberte Identifikátory:

    Výběr identifikátorů

  4. Vytvořte nové ID pro aplikaci:

    Vytvoření nového ID aplikace

  5. V části Zřizovací profily vyberte Vývoj:

    Výběr možnosti Vývoj

  6. Vytvořte nový profil a vyberte Vývoj aplikací pro Mac:

    Vytvoření nového profilu

  7. Vyberte ID aplikace, které jsme vytvořili výše:

    Výběr ID aplikace

  8. Vyberte vývojáře pro tento profil:

    Přidávání vývojářů

  9. Vyberte počítače pro tento profil:

    Výběr povolených počítačů

  10. Zadejte název profilu:

    Udělení názvu profilu

  11. 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:

  1. Spusťte Xcode a v nabídce Xcode vyberte Předvolby:

    Úpravy účtů v Xcode

  2. Klikněte na tlačítko Zobrazit podrobnosti...

    Kliknutí na tlačítko Zobrazit podrobnosti

  3. Klikněte na tlačítko Aktualizovat (v levém dolním rohu).

  4. 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:

  1. V oblasti řešení poklikejte na soubor Info.plist a otevřete ho pro úpravy.

  2. Ujistěte se, že identifikátor sady odpovídá našemu ID aplikace, které jsme vytvořili výše (příklad: com.appracatappra.MacSandbox):

    Úprava identifikátoru sady

  3. 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):

    Úprava souboru Entitlements.plist

  4. Uložte provedené změny.

  5. Na panelu řešení poklikejte na soubor projektu a otevřete jeho možnosti pro úpravy:

    Úprava možností řešení

  6. 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:

    Nastavení zřizovacího profilu

  7. 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:

Příklad dialogového okna problému se zřizováním

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ě:

  1. V oblasti řešení poklikejte na soubor Entitlements.plist a otevřete ho pro úpravy.

  2. Zkontrolujte oprávnění a povolte sandboxování aplikací:

    Úprava nároků a povolení sandboxu

  3. 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:

Zobrazení zablokovaného webového přístupu

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á:

  1. 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):

    Otevření sady aplikací

  2. 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:

    Kontrola aplikace v monitorování aktivit

  3. 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 (kde executable_path je cesta k vaší aplikaci):

    Kontrola aplikace na příkazovém řádku

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.

Nastavení požadovaných možností

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ě:

  1. Zkompilujte danou aplikaci a spusťte ji z Visual Studio pro Mac.

  2. Otevřete konzolovou aplikaci (z/Applications/Utilties/).

  3. Na bočním panelu vyberte Všechny zprávy a zadejte sandbox do hledání:

    Příklad problému s sandboxem v konzole

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ě:

  1. V oblasti řešení poklikejte na soubor Entitlements.plist a otevřete ho pro úpravy.

  2. V části Nároky zaškrtněte políčko Povolit odchozí síťová připojení (klient):

    Úprava nároků

  3. 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ů:

Úprava nároků

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).

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:

  1. 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žít NSFileCoordinator přístup k souboru. Nejprve zavoláte metodu WillMove(fromURL, toURL) , přesunete soubor do nové přípony a pak zavoláte ItemMoved(fromURL, toURL).
  2. 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 vlastnosti PrimaryPresentedItemURL a sekundární soubor vlastnosti PresentedItemURL . Při otevření hlavního souboru zavolejte AddFilePresenter metodu NSFileCoordinator 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 sandbox NSSavePanel``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í NSOpenPanela), 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:

  1. 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í na true. U záložek s vymezeným dokumentem nastavte com.apple.security.files.bookmarks.document-scope klíč oprávnění na truehodnotu .
  2. 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 metodu NSUrl třídy.
  3. 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 metodu NSUrl třídy.
  4. 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 metody NSUrl třídy začněte přistupovat k adrese URL s oborem zabezpečení.
  5. 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 metody NSUrl 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:

  1. 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).
  2. 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:

  1. 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.
  2. 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:

  1. Otevřete aplikaci Terminal (in /Applications/Utilities).
  2. Otevřete okno Finderu pro apple podepsanou verzi aplikace Xamarin.Mac.
  3. Zadejte asctl container acl add -file okno terminálu.
  4. Přetáhněte ikonu aplikace Xamarin.Mac z okna Finderu a přetáhněte ji do okna Terminálu.
  5. Úplná cesta k souboru se přidá do příkazu v terminálu.
  6. 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:

  1. Otevřete aplikaci Terminal (in /Applications/Utilities).
  2. Zadejte asctl container acl list -bundle <container-name>.
  3. 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ů:

  1. Určete, jestli je aplikace vhodná pro sandbox.
  2. Návrh strategie vývoje a distribuce
  3. Vyřešte případné nekompatibility rozhraní API.
  4. Použijte požadovaná oprávnění sandboxu aplikace na projekt Xamarin.Mac.
  5. Přidejte oddělení oprávnění pomocí XPC.
  6. 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 zahrnout userInfo 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, jako NSHomeDirectoryje .
  • 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:

  1. Povolte Sandbox aplikace a spusťte aplikaci Xamarin.Mac.
  2. Projděte si funkce aplikace.
  3. Otevřete konzolovou aplikaci (dostupná v /Applications/Utilities) a vyhledejte sandboxd porušení v protokolu Všechny zprávy .
  4. 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.
  5. Znovu spusťte a otestujte všechny funkce aplikace Xamarin.Mac znovu.
  6. 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.