Sandboxing a Xamarin.Mac app

Tento článek se zabývá sandboxem aplikace Xamarin.Mac pro vydání na App Store. Zahrnuje všechny prvky, které se přechádují do 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 C# a .NET v aplikaci Xamarin.Mac máte stejnou možnost sandboxu aplikace jako při práci s jazykem Objective-C nebo Swiftem.

Příklad spuštěné aplikace Příklad

V tomto článku projdeme základy práce s sandboxingem v aplikaci Xamarin.Mac a všechny prvky, které se zavedou do sandboxu: adresáře kontejnerů, oprávnění, uživatelem 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ě oddíly Úvod do Xcode a Interface Builder a Výstupy a Akce, protože se zabývá klíčovými koncepty a technikami, které budeme v tomto článku používat.

Možná se budete chtít podívat i na část dokumentu Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C která vysvětluje atributy a používané k připojení tříd jazyka C# k objektům a prvkům uživatelského RegisterExportObjective-C rozhraní.

Informace o sandboxu aplikace

Sandbox aplikace poskytuje silnou obranu před poškozením, které může být způsobeno škodlivým spouštěním aplikace na počítači Mac tím, že omezuje přístup aplikace k systémovým prostředkům.

Aplikace, která není izolovaná v sandboxu, má úplná práva uživatele, který aplikaci používá, a může přistupovat nebo dělat cokoli, co uživatel může. Pokud aplikace obsahuje bezpečnostní otvory (nebo libovolnou architekturu, kterou používá), může hacker tyto slabiny potenciálně zneužít a pomocí aplikace převzít kontrolu nad macem, na který běží.

Když omezíte přístup k prostředkům pro každou aplikaci, izolovaná aplikace poskytuje obranu proti krádeži, poškození nebo škodlivému záměru na straně aplikace spuštěné na počítači uživatele.

App Sandbox je technologie řízení přístupu integrovaná v systému macOS (vynucená na úrovni jádra), která poskytuje dvousloupcovou strategii:

  1. Sandbox aplikace umožňuje vývojáři popsat, jak bude aplikace komunikovat s operačním systémem, a tímto způsobem má udělená pouze přístupová práva, která jsou nutná k provádění úlohy, a už žádné 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, operací přetažení a dalších běžných uživatelských interakcí.

Příprava implementace sandboxu aplikace

Prvky Sandboxu aplikace, které budou podrobně popsány v tomto článku, jsou následující:

  • Adresáře kontejnerů
  • Entitlements
  • User-Determined oprávnění
  • Oddělení oprávnění
  • Vynucení jádra

Až těmto podrobnostem porozumi budete moct vytvořit plán přijetí sandboxu aplikace v aplikaci Xamarin.Mac.

Nejprve budete muset určit, jestli je vaše aplikace dobrým kandidátem pro sandboxing (většina aplikací je). Dále budete muset vyřešit nekompatibilitu 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ě obrany 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. Vaše aplikace bude mít zejména adresář kontejneru, který se bude používat pro soubory podpory aplikací, databáze, mezipaměti a všechny ostatní soubory, které nejsou dokumenty uživatele. MacOS i Xcode podporují migraci těchto typů souborů ze starších umístění do kontejneru.

Rychlý start pro sandboxing

V této části vytvoříme jednoduchou aplikaci Xamarin.Mac, která používá webové zobrazení (které vyžaduje síťové připojení omezené v rámci sandboxu, pokud to výslovně nepožaduje) jako příklad toho, jak začít se sandboxem aplikace.

Ověříme, že je aplikace ve skutečnosti izolovaná v izolovaném prostoru, a naučíme se řešit běžné chyby sandboxu aplikací a řešit je.

Vytvoření projektu Xamarin.Mac

Pojďme vytvořit ukázkový projekt takto:

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

  2. V dialogovém okně Project vyberte MacAppCocoa App:

    Vytvoření nové aplikace Cocoa

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

    Zadání názvu aplikace

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

    Úprava hlavního scénáře Úprava

  5. Přetáhněte webové zobrazení do okna, velikostí vyplňte oblast obsahu a nastavte ho tak, aby se zvětšuje a zmenšuje pomocí okna:

    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 Visual Studio pro Mac a poklikejte na soubor ViewController.cs v Oblast řešení otevřete ho pro úpravy.

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

  9. Aby ViewDidLoad metoda vypadala 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 následujícím způsobem se ujistěte, že se v okně zobrazí web Apple:

Zobrazení příkladu spuštění aplikace

Podepisování a zřizování aplikace

Než povolíme Sandbox aplikací, musíme nejprve zřídit a podepsat aplikaci Xamarin.Mac.

Dejte nám následující postup:

  1. Přihlaste se k Portálu pro vývojáře Apple:

    Přihlášení k Portálu pro vývojáře Apple– Přihlášení k portálu pro vývojáře

  2. Vyberte Certifikáty, Profily identifikátorů:

    Výběr certifikátů, identifikátorů  Profily–

  3. V části Aplikace pro Macvyberte Identifikátory:

    Výběr identifikátorů

  4. Vytvořte nové ID aplikace:

    Vytvoření nového ID aplikace

  5. V části Zřizovací profilyvyberte 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ářů Přidávání

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

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

  10. Zadejte název profilu:

    Dáváte profilu název.

  11. Klikněte na tlačítko Hotovo.

Důležité

V některých případech možná budete muset nový zřizovací profil stáhnout přímo z portálu pro vývojáře Apple a dvakrát na něj kliknout a nainstalovat ho. Možná budete také muset zastavit a restartovat Visual Studio pro Mac, než bude mít přístup k novému profilu.

Dále musíme na vývojovém počítači načíst nové ID aplikace a profil. Pustíme se do následujících akcí:

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

    Úpravy účtů v účtech pro úpravy Xcode

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

    Kliknutí na tlačítko Zobrazit podrobnosti Kliknutímna tlačítko Zobrazit

  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 našem projektu Xamarin.Mac vybrat nové ID aplikace a zřizovací profil. Pustíme se do následujících akcí:

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

    Úprava identifikátoru sady prostředků

  3. Dále poklikejte na soubor Entitlements.plist a ujistěte se, že všechny kontejnery iCloud Key-Value Store a iCloudu odpovídají našemu ID aplikace, které jsme vytvořili výše (příklad: ):

    Úprava souboru Entitlements.plist

  4. Uložte provedené změny.

  5. V Oblast řešenípoklikejte na soubor projektu a otevřete jeho Možnosti pro úpravy:

    Editign možnosti řešení

  6. Vyberte podepisování Maca pak zaškrtněte podepsat sadu prostředků aplikace a podepište balíček instalačního programu. V části zřizovací profilvyberte ten, který jsme vytvořili výše:

    Nastavení zřizovacího profilunastavení profilu

  7. Klikněte na tlačítko Hotovo .

Důležité

je možné, že budete muset Visual Studio pro Mac ukončit a restartovat, aby bylo možné rozpoznat nové ID aplikace a zřizovací profil, který byl nainstalován nástrojem Xcode.

Řešení problémů zřizování

V tomto okamžiku byste se měli pokusit spustit aplikaci a ujistit se, že vše je podepsáno a zajištěno správně. Pokud bude aplikace pořád běžet stejně, vše je dobré. V případě selhání se může zobrazit dialogové okno podobné následujícímu:

An example provisioning issue dialogPříklad dialogového okna pro

Tady jsou nejběžnější příčiny problémů zřizování a podepisování:

  • ID sady prostředků aplikace se neshoduje s ID aplikace vybraného profilu.
  • ID vývojáře neodpovídá ID vývojáře vybraného profilu.
  • Identifikátor UUID testovaného počítače Mac není zaregistrován 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í izolovaného prostoru aplikace

Izolovaný prostor aplikace povolíte tak, že v možnostech projektu vyberete zaškrtávací políčko. Postupujte následovně:

  1. V oblast řešenídvakrát klikněte na soubor oprávnění. plist a otevřete ho pro úpravy.

  2. Zaškrtněte jak Povolit oprávnění , a Povolte sandboxing aplikací:

    Úpravy nároků a povolení úprav izolovaného prostoru

  3. Uložte provedené změny.

V tuto chvíli jste povolili izolovaný prostor aplikace, ale nemáte k dispozici požadovaný síťový přístup k webovému zobrazení. Pokud spustíte aplikaci nyní, měli byste získat prázdné okno:

Zobrazuje se blokovaný webový přístups blokovaným .

Ověření, jestli je aplikace v izolovaném prostoru

Kromě chování blokování prostředků existují tři hlavní způsoby, jak zjistit, jestli je aplikace Xamarin. Mac úspěšně izolovaná na izolovaném prostoru:

  1. V části Finder ověřte obsah ~/Library/Containers/ složky – Pokud je aplikace izolovaně izolovaná, bude se jednat o složku s názvem, jako je například identifikátor sady prostředků vaší aplikace (příklad: com.appracatappra.MacSandbox ):

    Otevření sady aplikace

  2. Systém uvidí aplikaci jako izolovaný prostor (sandbox) v monitorování aktivity:

    • Monitorování aktivity spuštění (pod /Applications/Utilities ).
    • Vyberte Zobrazitsloupce a ujistěte se, že je zaškrtnuta položka nabídky izolovaného prostoru (sandbox) .
    • Zajistěte, aby pro vaši aplikaci vypadal sloupec izolovaného prostoru Yes :

    Kontrola aplikace v monitorování aktivity

  3. Ověřte, jestli je binární soubor aplikace v izolovaném prostoru:

    • Spusťte aplikaci Terminal.
    • Přejděte do adresáře aplikace bin .
    • Vydejte tento příkaz: codesign -dvvv --entitlements :- executable_path (kde executable_path je cesta k vaší aplikaci):

    Kontrola aplikacena příkazovém řádku při

Ladění aplikace v izolovaném prostoru

Ladicí program se připojuje k aplikacím Xamarin. Mac prostřednictvím protokolu TCP, což znamená, že ve výchozím nastavení při povolení izolovaného prostoru (sandbox) se nemůže připojit k aplikaci, takže pokud se pokusíte aplikaci spustit bez správných povolených oprávnění, zobrazí se chyba "nelze se připojit k ladicímu programu".

Nastavení požadovaných možností možností

Oprávnění Povolit odchozí připojení k síti (klient) je ten, který je vyžadován pro ladicí program, takže povolení této možnosti umožní normální ladění. Vzhledem k tomu, že nemůžete ladit bez něj, Aktualizovali jsme CompileEntitlements cíl, msbuild aby automaticky přidal toto oprávnění do oprávnění pro všechny aplikace, které jsou v izolovaném prostoru pro sestavení pro ladění. Sestavení vydaných verzí by měla používat oprávnění uvedená v souboru oprávnění, která se nezměnila.

Řešení porušení izolovaného prostoru aplikace

K narušení izolovaného prostoru aplikace dojde, pokud se aplikace Xamarin. Mac v izolovaném prostoru pokusila o přístup k prostředku, který není explicitně povolen. Například naše webové zobrazení už nebude moct zobrazovat web společnosti Apple.

nejběžnější zdroj narušení izolovaného prostoru aplikace nastane, pokud nastavení nároků zadané v Visual Studio pro Mac neodpovídají požadavkům aplikace. Znovu zpátky na náš příklad, chybějící nároky na síťové připojení, které webové zobrazení brání v práci.

Zjišťují se porušení izolovaného prostoru aplikace

Pokud máte podezření, že došlo k narušení izolovaného prostoru aplikace v aplikaci Xamarin. Mac, nejrychlejší způsob, jak zjistit problém, je použití konzolové aplikace.

Postupujte následovně:

  1. zkompilujte příslušnou aplikaci a spusťte ji z Visual Studio pro Mac.

  2. Otevřete konzolovou aplikaci (z ).

  3. Vyberte všechny zprávy na bočním panelu a do pole Hledat zadejte:

    Příklad problému s izolovaným prostorem v konzole

V našem příkladu aplikace vidíte, že prokládání dat je blokováno network-outbound z důvodu izolovaného prostoru aplikace, protože toto právo nepožadujeme.

Oprava narušení izolovaného prostoru aplikace s nároky

Teď, když jsme se seznámili s tím, jak najít porušení v sandboxu aplikace, se podívejme, jak se dají vyřešit úpravou oprávnění našich aplikací.

Postupujte následovně:

  1. V oblast řešenídvakrát klikněte na soubor oprávnění. plist a otevřete ho pro úpravy.

  2. V části oprávnění zaškrtněte políčko Povolení odchozích síťových připojení (klientů) :

    Úprava oprávnění

  3. Uložte změny do aplikace.

Pokud pro naši ukázkovou aplikaci provedete výše uvedené, pak ji sestavíte a spustíte. webový obsah se teď bude zobrazovat podle očekávání.

Detailní izolovaný prostor aplikace

Mechanismy řízení přístupu, které poskytuje izolovaný prostor aplikace, jsou pár a je snadné je snadno pochopit. Způsob, jakým bude každá aplikace přijímat izolovaný prostor aplikace, je ale jedinečný a na základě požadavků aplikace.

Vzhledem k tomu, že vaše snaha chránit vaši aplikaci Xamarin. Mac před zneužitím škodlivého kódu, musí být v aplikaci (nebo některé z knihoven nebo architektur, kterou využívá) pouze jediná ohrožení zabezpečení, aby bylo možné získat kontrolu nad interakcí aplikace se systémem.

Izolovaný prostor aplikace byl navržený tak, aby zabránil převzetí (nebo omezit škodu, které může způsobovat) tím, že umožňuje určit zamýšlené interakce aplikace se systémem. Systém udělí přístup pouze k prostředku, který vaše aplikace potřebuje k provedení jeho úlohy, a ještě nic dalšího.

Při návrhu pro izolovaný prostor aplikace navrhujete pro nejhoršího případu scénář. Pokud dojde k ohrožení aplikace škodlivým kódem, je omezen přístup pouze k souborům a prostředkům v izolovaném prostoru aplikace.

Nároky a přístup k prostředkům systému

Jak jsme viděli výše, aplikace Xamarin. Mac, u které není izolovaný prostor (sandbox), má udělená úplná práva a přístup k uživateli, na kterém je aplikace spuštěná. Pokud dojde k ohrožení škodlivým kódem, může nechráněná aplikace fungovat jako agent pro nepřátelský způsob, a to s širokým potenciálem pro poškození.

Povolením izolovaného prostoru aplikace odeberete všechny, ale jenom minimální sady oprávnění, které pak znovu povolíte, a to pomocí vašich nároků vaší aplikace Xamarin. Mac.

Provedete úpravu prostředků izolovaného prostoru aplikace aplikace úpravou souboru oprávnění. plist a zaškrtnutím nebo výběrem požadovaných práv z rozevíracích seznamů editory:

Úprava oprávnění

Adresáře kontejnerů a přístup k systému souborů

Když vaše aplikace Xamarin. Mac přijme izolovaný prostor aplikace, má přístup k těmto umístěním:

  • Adresář kontejnerů aplikace – při prvním spuštění vytvoří operační systém speciální adresář kontejneru , ve kterém všechny jeho prostředky přecházejí, ke kterému má přístup jenom. Aplikace bude mít úplný přístup pro čtení a zápis do tohoto adresáře.
  • Adresáře kontejnerů skupiny aplikací – aplikaci lze udělit přístup k jednomu nebo více kontejnerům skupiny , které jsou sdíleny mezi aplikacemi ve stejné skupině.
  • Uživatelem zadané soubory – vaše aplikace automaticky získá přístup k souborům, které jsou explicitně otevřeny nebo přetaženy a vyřazeny 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 a .pdf .
  • Dočasné adresáře, adresáře nástrojů příkazového řádku a konkrétní World čitelná umístění – vaše aplikace má různé stupně přístupu k souborům v jiných dobře definovaných umístěních, která jsou určená systémem.

Adresář kontejneru aplikace

Adresář kontejnerů aplikace Xamarin. Mac má následující vlastnosti:

  • Je ve skrytém umístění v domovském adresáři uživatele (obvykle ~Library/Containers ) a lze k němu přistupovat pomocí NSHomeDirectory funkce (viz níže) v rámci aplikace. Vzhledem k tomu, že se nachází v domovském adresáři, získá každý uživatel svůj vlastní kontejner pro aplikaci.
  • Aplikace má neomezený přístup pro čtení a zápis k adresáři kontejneru a všem jeho podadresářům a souborům v něm.
  • Většina rozhraní API pro hledání cest macOS je relativní vzhledem k kontejneru aplikace. Například kontejner bude mít vlastní knihovnu (k němuž se dostanete prostřednictvím ), podadresáře Podpora aplikací a Předvolby .
  • macOS vytváří a vynutila propojení mezi aplikací a a jejím kontejnerem prostřednictvím podepisování kódu. I když se jiná aplikace pokusí o falešnou kopii aplikace pomocí jejího identifikátoru sady, nebude mít přístup ke kontejneru kvůli podepisování kódu.
  • Kontejner není pro uživatelem generované soubory. Místo toho je určena pro soubory, které vaše aplikace používá, jako jsou databáze, mezipaměti nebo jiné konkrétní typy dat.
  • V případě Shoebox typů aplikací (jako je aplikace pro fotografii od společnosti Apple) bude obsah uživatele přecházet do kontejneru.

Důležité

Xamarin. Mac bohužel zatím nemá pokrytí rozhraní API 100% (na rozdíl od Xamarin. iOS), proto NSHomeDirectory rozhraní API není namapované v aktuální verzi Xamarin. Mac.

Jako dočasné ř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 Mac macOS 10.7.5 (a vyšší) může aplikace použít com.apple.security.application-groups oprávnění pro 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živatelem orientovaný obsah, jako je například databáze nebo jiné typy podpůrných souborů (například mezipaměti).

Kontejnery skupiny se automaticky přidají do kontejneru izolovaného prostoru aplikace (pokud jsou součástí skupiny) a ukládají se na ~/Library/Group Containers/<application-group-id> . ID skupiny musí začínat vaším ID vývojového týmu a tečkou, například:

<team-id>.com.company.<group-name>

Další informace najdete v tématu Přidání aplikace do skupiny aplikací v odkazu na klíč k získání.

Powerbox a přístup k systému souborů mimo kontejner aplikace

Aplikace Xamarin. Mac s izolovaným prostorem (sandbox) má přístup k umístěním systému souborů mimo svůj kontejner následujícími způsoby:

  • V určitém směru uživatele (prostřednictvím otevřených a neukládejte dialogů nebo jiných metod, jako je například přetahování myší).
  • Pomocí nároků pro konkrétní umístění systému souborů (například /bin nebo /usr/lib ).
  • Když je umístění systému souborů v některých adresářích, které jsou World čitelné (například sdílení).

Powerbox je technologie MacOS pro zabezpečení, která spolupracuje s uživatelem k rozšíření přístupových práv k souborům v izolovaném prostoru Xamarin. Mac vaší aplikace. Powerbox nemá žádné rozhraní API, ale aktivuje se transparentně, když aplikace volá NSOpenPanel nebo NSSavePanel . Přístup k powerbox je povolený prostřednictvím oprávnění, která jste nastavili pro vaši aplikaci Xamarin. Mac.

Když aplikace v izolovaném prostoru zobrazí dialog Otevřít nebo uložit, okno je prezentováno powerbox (a ne Appkitu), a proto má přístup k jakémukoli 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 přetáhne buď na ikonu aplikace), powerbox přidá přidruženou cestu k izolovanému prostoru aplikace.

Systém navíc v izolovaném prostoru aplikace automaticky povoluje následující:

  • Připojení k metodě systémového vstupu.
  • Vyvolejte služby vybrané uživatelem z nabídky služby (jenom pro služby označené jako bezpečné pro aplikace izolovaného prostoru od poskytovatele služeb).
  • Otevřené soubory zvolí uživatel z nabídky otevřít poslední .
  • Použijte kopírování & mezi ostatními aplikacemi.
  • Čtení souborů z následujících celosvětově čitelných umístění:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Čtení a zápis souborů v adresářích vytvořených NSTemporaryDirectory .

Ve výchozím nastavení zůstanou soubory otevřené nebo uložené v izolovaném počítači Xamarin. Mac k dispozici, dokud se aplikace neukončí (Pokud se soubor ještě neotevřel při ukončení aplikace). Otevřené soubory se při příštím spuštění aplikace automaticky obnoví do izolovaného prostoru aplikace pomocí funkce macOS Resume.

K zajištění trvalosti souborů umístěných mimo kontejner aplikace Xamarin. Mac použijte Security-Scoped záložky (viz níže).

Izolovaný prostor 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 Info.plst souboru aplikace, b), který sděluje izolovanému prostoru (sandbox), co bude aplikace s těmito soubory dělat.

Existují dva scénáře, kde je to smysl:

  1. Aplikace musí být schopná uložit jinou verzi souboru (s novým rozšířením). Například exportování .txt souboru do .pdf souboru. Chcete-li tuto situaci zpracovat, je nutné použít NSFileCoordinator pro přístup k souboru. Nejprve zavoláte WillMove(fromURL, toURL) metodu, přesunete soubor do nového rozšíření a potom 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ů. K NSFilePresenter získání přístupu k sekundárnímu souboru použijte. Poskytněte hlavní soubor PrimaryPresentedItemURL vlastnosti a sekundárnímu souboru PresentedItemURL Vlastnosti. Když je otevřen hlavní soubor, 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 libovolný typ souboru přidejte do NSIsRelatedItemType své položky pole (s hodnotou YES ) CFBundleDocumentTypes .

Chování dialogového okna otevřít a uložit s aplikacemi v izolovaném prostoru

Následující omezení jsou umístěna na NSOpenPanel a NSSavePanel při volání z aplikace Xamarin. Mac v izolovaném prostoru:

  • Tlačítko OK nelze vyvolat programově.
  • Nemůžete programově změnit výběr uživatele v NSOpenSavePanelDelegate .

Dále jsou provedeny následující změny dědičnosti:

  • Aplikace, která není v izolovaném prostoru (sandbox)NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Záložky s rozsahem zabezpečení a trvalý přístup k prostředkům

Jak je uvedeno výše, aplikace Xamarin. Mac, která je v izolovaném prostoru, má přístup k souboru nebo prostředku mimo svůj kontejner prostřednictvím přímé interakce s uživatelem (jak poskytuje PowerBox). Přístup k těmto prostředkům se ale při spuštění aplikace nebo restartování systému automaticky neuloží.

Pomocí záložek s rozsahem zabezpečenímůže aplikace Xamarin. Mac v izolovaném prostoru (sandbox) zachovat záměr uživatele a zachovat přístup k daným prostředkům po restartování aplikace.

Typy záložek s rozsahem zabezpečení

Když pracujete se Security-Scopedými záložkami a trvalým přístupem k prostředkům, existují dva případy použití Sistine:

  • Záložka App-Scoped poskytuje trvalý přístup k souboru nebo složce zadaného uživatelem.

    Pokud například aplikace Xamarin. Mac v izolovaném prostoru umožňuje použít k otevření externího dokumentu pro úpravy (pomocí NSOpenPanel ), může aplikace vytvořit App-Scoped záložku, aby mohla znovu získat přístup ke stejnému souboru v budoucnu.

  • Záložka Document-Scoped poskytuje konkrétní dokument trvalého přístupu k dílčímu souboru.

Například aplikace pro úpravy videa, která vytvoří soubor projektu, který má přístup k jednotlivým obrázkům, videoklipy a zvukové soubory, které budou později zkombinovány do jediného filmu.

Když uživatel naimportuje soubor prostředků do projektu (přes a NSOpenPanel ), aplikace vytvoří Document-Scoped záložku pro položku, která je uložena v projektu, aby byl soubor vždy přístupný pro aplikaci.

Záložku Document-Scoped lze vyřešit libovolnou aplikací, která může otevřít data záložky a samotného dokumentu. To podporuje přenositelnost, což uživateli umožňuje odeslat soubory projektu jinému uživateli a všechny záložky budou fungovat i pro ně.

Důležité

Záložka Document-Scoped 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 nebo /Library ).

Použití záložek s rozsahem zabezpečení

Pomocí některého z typů Security-Scoped Bookmark vyžaduje, abyste provedli následující kroky:

  1. Nastavte příslušné oprávnění v aplikaci Xamarin. Mac, které musí používat Security-Scoped záložky – pro App-Scoped záložky nastavte klíč nároku na true . Pro záložky Document-Scoped nastavte com.apple.security.files.bookmarks.document-scope klíč nároku na true .
  2. Vytvořte záložku Security-Scoped – můžete to provést pro libovolný soubor nebo složku, ke kterým má uživatel přístup ( například prostřednictvím), ke kterému bude mít aplikace trvalý přístup. public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)NSUrl K vytvoření záložky použijte metodu třídy.
  3. Vyřešit Security-Scoped záložku – když aplikace potřebuje znovu získat přístup k prostředku (například po restartování), bude muset tuto záložku přeložit na adresu URL s rozsahem zabezpečení. public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)NSUrl K vyřešení záložky použijte metodu třídy.
  4. Explicitně upozorněte systém, ke kterému chcete přistupovat, z adresy url Security-Scoped – tento krok se musí provést hned po získání Security-Scoped adresy URL výše nebo, když později budete chtít znovu získat přístup k prostředku, který jste k němu měli přístup. Voláním StartAccessingSecurityScopedResource () metody NSUrl třídy zahajte přístup k Security-Scoped adrese URL.
  5. Explicitně upozorněte systém, že jste provedli přístup k souboru z Security-Scoped URL – co nejdříve, byste měli informovat systém, když už aplikace nebude potřebovat přístup k souboru (například pokud ho uživatel zavře). Zavolejte StopAccessingSecurityScopedResource () metodu NSUrl třídy, aby se zastavil přístup k Security-Scoped adrese URL.

Po odnechání přístupu k prostředku se budete muset znovu vrátit ke kroku 4, abyste mohli znovu navázat přístup. Pokud je aplikace Xamarin. Mac restartována, musíte se vrátit ke kroku 3 a tuto záložku znovu přeložit.

Důležité

Nepodaří-li se uvolnit přístup k prostředkům adresy URL Security-Scoped, způsobí to, že aplikace Xamarin. Mac nebude mít za následek únik prostředků jádra. V důsledku toho už aplikace nebude moct do kontejneru přidat umístění systému souborů, dokud se nerestartuje.

Izolovaný prostor aplikace a podepisování kódu

Po povolení izolovaného prostoru aplikace a povolení specifických požadavků vaší aplikace Xamarin. Mac (prostřednictvím oprávnění) musíte podepsat projekt, aby se sandboxing projevil. Je nutné provést podepisování kódu, protože nároky vyžadované pro sandboxing aplikace jsou propojeny s signaturou aplikace.

macOS vynutil propojení mezi kontejnerem aplikace a jeho podpisem kódu, a to tak, že k tomuto kontejneru nemá přístup žádná jiná aplikace, a to ani v případě, že je falšování ID sady prostředků aplikace. Tento mechanismus funguje takto:

  1. Když systém vytvoří kontejner aplikace, nastaví v tomto kontejneru seznam Access Control (ACL). Počáteční položka řízení přístupu v seznamu obsahuje určený požadavek (Dr) aplikace, který popisuje, jak se můžou budoucí verze aplikace rozpoznat (když se upgraduje).
  2. Pokaždé, když se spustí aplikace se stejným ID sady, systém zkontroluje, jestli signatura kódu aplikace odpovídá stanoveným požadavkům zadaným v jedné z položek v seznamu ACL kontejneru. Pokud systém nenalezne shodu, zabrání spuštění aplikace.

Podepisování kódu pracuje na následujících způsobech:

  1. Před vytvořením projektu Xamarin. Mac Získejte certifikát pro vývoj, certifikát distribuce a certifikát pro vývojáře z portálu pro vývojáře Apple.
  2. Když aplikace 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). Později, pokud chcete verzi otestovat nebo nainstalovat z Apple App Storu, bude se podepsat podpisem Apple a nebude možné ji spustit (protože nemá stejný podpis kódu jako původní kontejner aplikace). V této situaci se zobrazí zpráva o chybě podobná následující:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Pokud to chcete opravit, budete muset upravit položku seznamu řízení přístupu tak, aby odkazovala na verzi aplikace podepsané společností Apple.

Další informace o vytváření a stahování zřizovacích profilů vyžadovaných pro sandboxing najdete v části podepisování a zřizování aplikace výše.

Úprava položky seznamu řízení přístupu

Chcete-li povolit spuštění aplikace Xamarin. Mac podepsané verzí Apple, postupujte následovně:

  1. Otevřete aplikaci Terminal (v /Applications/Utilities ).
  2. Otevřete okno hledání verze aplikace Xamarin. Mac podepsané společností Apple.
  3. asctl container acl add -fileDo okna terminálu zadejte.
  4. Přetáhněte ikonu aplikace Xamarin. Mac z okna Finder a umístěte ji do okna terminálu.
  5. Úplná cesta k souboru bude přidána do příkazu v terminálu.
  6. Stiskněte klávesu ENTER a spusťte příkaz.

Seznam ACL kontejneru teď obsahuje určené požadavky na kód pro obě verze aplikace Xamarin. Mac a macOS teď umožní spuštění obou verzí.

Zobrazit seznam požadavků na kód v seznamu ACL

Seznam požadavků na kód v seznamu ACL kontejneru můžete zobrazit následujícím způsobem:

  1. Otevřete aplikaci Terminal (v /Applications/Utilities ).
  2. Zadejte asctl container acl list -bundle <container-name>.
  3. Stiskněte klávesu ENTER a spusťte příkaz.

<container-name>Obvykle je identifikátor sady prostředků pro aplikaci Xamarin. Mac.

Návrh aplikace Xamarin. Mac pro izolovaný prostor aplikace

Při návrhu aplikace Xamarin. Mac pro izolovaný prostor aplikace je třeba postupovat podle společného pracovního postupu. To znamená, že konkrétní implementace sandboxing v aplikaci bude pro danou funkci aplikace jedinečná.

Šest kroků pro přijetí izolovaného prostoru aplikace

Návrh aplikace Xamarin. Mac pro izolovaný prostor aplikace se obvykle skládá z následujících kroků:

  1. Určete, jestli je aplikace vhodná pro sandboxing.
  2. Navrhněte strategii vývoje a distribuce.
  3. Vyřešte všechny nekompatibility rozhraní API.
  4. Použijte pro projekt Xamarin. Mac požadovaná oprávnění izolovaného prostoru aplikace.
  5. Přidejte oddělení oprávnění pomocí XPC.
  6. Implementujte strategii migrace.

Důležité

V sadě prostředků aplikace musíte mít nejen hlavní spustitelný soubor izolovaného prostoru (sandbox), ale také všechny zahrnuté aplikace pomocníka nebo nástroje v dané sadě. To se vyžaduje pro všechny aplikace distribuované z Mac App Storu a pokud je to možné, měli byste je udělat pro jakoukoliv jinou formu distribuce aplikací.

Pokud chcete zobrazit seznam všech spustitelných souborů ve svazku aplikace Xamarin. Mac, zadejte v terminálu následující příkaz:

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ě prostředků aplikace.

Určení, jestli je aplikace Xamarin. Mac vhodná pro sandboxing

Většina aplikací Xamarin. Mac je plně kompatibilní s izolovaným prostorem aplikací, a proto je vhodná pro sandboxing. Pokud aplikace vyžaduje chování, které izolovaný prostor aplikace nepovoluje, měli byste uvažovat o alternativním přístupu.

Pokud vaše aplikace vyžaduje jedno z následujících chování, není kompatibilní s izolovaným prostorem aplikace:

  • Autorizační služby – s využitím izolovaného prostoru aplikace nemůžete pracovat s funkcemi popsanými v tématu authorization Services – informace o autorizaci C.
  • Rozhraní API pro přístupnost – aplikace pro usnadnění přístupu do izolovaného prostoru (sandbox), jako jsou čtečky obrazovky nebo aplikace, které ovládají jiné aplikace
  • Odesílání událostí Apple do libovolných aplikací – Pokud aplikace vyžaduje odeslání událostí Apple do neznámé, libovolné aplikace, nedá se v izolovaném prostoru (sandbox). Známý seznam aplikací, které se nazývají, jsou stále v izolovaném prostoru (sandbox) a nároky budou muset zahrnout seznam volaných aplikací.
  • Odeslat slovníky informací o uživateli v distribuovaných oznámeních – s využitím izolovaného prostoru aplikace nemůžete při odesílání do NSDistributedNotificationCenter objektu pro zasílání zpráv na další úkoly zahrnout slovník.
  • Načíst rozšíření jádra – v izolovaném prostoru aplikace je načítání rozšíření jádra zakázané.
  • Simulace vstupu uživatele v dialogových oknech Otevřít a uložit – programově se manipulují s otevřenými nebo uloženými dialogy pro simulaci nebo změnu vstupu uživatele zakázané v izolovaném prostoru aplikace.
  • Přístup k nebo nastavení předvoleb u jiných aplikací – manipulace s nastavením jiných aplikací je zakázaná izolovaným prostorem aplikace.
  • konfigurace Nastavení sítě – manipulace s Nastavení sítě je zakázaná izolovaným prostorem aplikace.
  • Ukončení ostatních aplikací – izolovaný prostor aplikace zabraňuje použití pro ukončení dalších aplikací.

Řešení nekompatibility rozhraní API

Při návrhu aplikace Xamarin. Mac pro izolovaný prostor aplikace můžete narazit na nekompatibilitu s používáním některých rozhraní macOS API.

Tady je několik běžných problémů a věcí, které můžete vyřešit:

  • Otevírání, ukládání a sledování dokumentů – Pokud spravujete dokumenty pomocí jiné technologie než , měli byste na ni přejít z důvodu integrované podpory pro izolovaný prostor aplikace. NSDocument automaticky spolupracuje s PowerBox a poskytuje podporu pro uchování dokumentů v izolovaném prostoru (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, zachovejte přístup pomocí záložek s rozsahem zabezpečení.
  • Vytvoření položky přihlášení pro aplikaci – s využitím izolovaného prostoru aplikace nemůžete vytvořit položku přihlášení pomocí ani nemůžete manipulovat se stavem spouštěcích služeb pomocí LSRegisterURL . Použijte SMLoginItemSetEnabled funkci popsanou v tématu jablka SMLoginItemSetEnabled .
  • Přístup k uživatelským datům – Pokud používáte funkce POSIX, jako je například získání domovského adresáře uživatele z adresářových služeb, zvažte použití symbolů kakaa nebo Core Foundation, jako je například NSHomeDirectory .
  • Přístup k předvolbám jiných aplikací – protože izolovaný prostor aplikace směruje rozhraní API pro hledání cest do kontejneru aplikace, mění se předvolby v rámci tohoto kontejneru a přístup k jiným předvolbách aplikací není povolený.
  • Použití vloženého videa HTML5 ve webových zobrazeních – Pokud aplikace Xamarin. Mac používá Webkit k přehrání VLOŽENÝCH videí HTML5, musíte také propojit aplikaci s rozhraním AV Foundation Framework. Izolovaný prostor aplikace zabrání v CoreMedia přehrávání těchto videí jinak.

Aplikují se požadovaná oprávnění sandboxu aplikace.

Budete muset upravit nároky pro libovolnou aplikaci Xamarin. Mac, kterou chcete spustit v izolovaném prostoru aplikace, a zaškrtnout políčko Povolit sandboxing aplikace .

Na základě funkcí aplikace může být nutné povolit další oprávnění pro přístup k funkcím nebo prostředkům operačního systému. Izolované prostředí aplikací funguje nejlépe, když minimalizujete nároky, které požadujete pro spuštění vaší aplikace, takže stačí jenom náhodně povolit oprávnění.

Pokud chcete zjistit, která oprávnění vyžaduje aplikace Xamarin. Mac, udělejte toto:

  1. Povolte izolovaný prostor aplikace a spusťte aplikaci Xamarin. Mac.
  2. Spouštějte prostřednictvím funkcí aplikace.
  3. Otevřete konzolovou aplikaci (k dispozici v části /Applications/Utilities ) a vyhledejte sandboxd porušení v protokolu /Applications/Utilities .
  4. Pro každé sandboxd porušení Vyřešte problém buď pomocí kontejneru aplikace namísto jiných umístění systému souborů, nebo použijte oprávnění k použití izolovaného prostoru aplikace, abyste umožnili přístup k omezeným funkcím operačního systému.
  5. Znovu spusťte a otestujte všechny funkce aplikace Xamarin. Mac.
  6. Opakujte, dokud nejsou sandboxd vyřešena všechna porušení.

Přidání oddělování oprávnění pomocí XPC

Při vývoji aplikace Xamarin. Mac pro izolovaný prostor aplikace se podívejte na chování aplikace v části oprávnění a přístup a pak zvažte oddělení vysoce rizikové operace s vlastními XPC službami.

Další informace najdete v tématu Příručka k vytváření služeb XPC Services a démonů a služeb pro programováníspolečnosti Apple.

Implementace strategie migrace

Pokud uvolňujete novou verzi aplikace Xamarin. Mac v izolovaném prostoru (sandbox), která nebyla dřív izolovaným prostorem (sandbox), budete muset zajistit, aby aktuální uživatelé měli k dispozici plynulou cestu pro upgrade.

Podrobnosti o tom, jak implementovat manifest migrace kontejneru, najdete v dokumentaci k izolovanému prostoru (sandbox) od společnosti Apple.

Souhrn

V tomto článku se dozvíte, jak v izolovaném prostoru nahlížet na aplikaci Xamarin. Mac. Nejdřív jsme vytvořili jednoduše aplikaci Xamarin. Mac, která vám ukáže základy izolovaného prostoru aplikace. Dále jsme ukázali, jak vyřešit narušení izolovaného prostoru (sandbox). Pak jsme si pořídili podrobný pohled na izolovaný prostor aplikace a nakonec jsme si vyhledali návrh aplikace Xamarin. Mac pro izolovaný prostor aplikace.