Bagikan melalui


Sandboxing aplikasi Xamarin.Mac

Artikel ini membahas sandboxing aplikasi Xamarin.Mac untuk rilis di App Store. Ini mencakup semua elemen yang masuk ke sandboxing, seperti direktori kontainer, pemberian hak, izin yang ditentukan pengguna, pemisahan hak istimewa, dan penegakan kernel.

Gambaran Umum

Saat bekerja dengan C# dan .NET dalam aplikasi Xamarin.Mac, Anda memiliki kemampuan yang sama untuk melakukan sandbox aplikasi seperti yang Anda lakukan saat bekerja dengan Objective-C atau Swift.

An example of the running app

Dalam artikel ini, kita akan membahas dasar-dasar bekerja dengan sandboxing dalam aplikasi Xamarin.Mac dan semua elemen yang masuk ke sandboxing: direktori kontainer, pemberian hak, izin yang ditentukan pengguna, pemisahan hak istimewa, dan penegakan kernel. Sangat disarankan agar Anda bekerja melalui artikel Hello, Mac terlebih dahulu, khususnya bagian Pengenalan Xcode dan Penyusun Antarmuka dan Outlet dan Tindakan , karena mencakup konsep dan teknik utama yang akan kita gunakan dalam artikel ini.

Anda mungkin ingin melihat kelas /metode Exposing C# keObjective-Cbagian dari dokumen Xamarin.Mac Internals juga, ini menjelaskan Register atribut dan Export yang digunakan untuk menghubungkan kelas C# Anda ke Objective-C objek dan elemen UI.

Tentang Kotak Pasir Aplikasi

App Sandbox memberikan pertahanan yang kuat terhadap kerusakan yang dapat disebabkan oleh aplikasi berbahaya yang dijalankan di Mac dengan membatasi akses yang dimiliki aplikasi ke sumber daya sistem.

Aplikasi non-kotak pasir memiliki hak penuh pengguna yang menjalankan aplikasi dan dapat mengakses atau melakukan apa pun yang dapat dilakukan pengguna. Jika aplikasi berisi lubang keamanan (atau kerangka kerja apa pun yang digunakannya), peretas berpotensi mengeksploitasi kelemahan tersebut dan menggunakan aplikasi untuk mengontrol Mac yang dijalankannya.

Dengan membatasi akses ke sumber daya per aplikasi, aplikasi terkotakpasir menyediakan garis pertahanan terhadap pencurian, kerusakan, atau niat jahat pada bagian aplikasi yang berjalan di komputer pengguna.

App Sandbox adalah teknologi kontrol akses yang terpasang di macOS (diberlakukan pada tingkat kernel) yang menyediakan strategi dua kali lipat:

  1. App Sandbox memungkinkan pengembang untuk menjelaskan bagaimana aplikasi akan berinteraksi dengan OS dan, dengan cara ini, hanya diberikan hak akses yang diperlukan untuk menyelesaikan pekerjaan, dan tidak lebih.
  2. Kotak Pasir Aplikasi memungkinkan pengguna untuk memberikan akses lebih lanjut ke sistem dengan lancar melalui kotak dialog Buka dan Simpan, operasi seret dan letakkan serta interaksi pengguna umum lainnya.

Bersiap untuk mengimplementasikan App Sandbox

Elemen Kotak Pasir Aplikasi yang akan dibahas secara rinci dalam artikel adalah sebagai berikut:

  • Direktori Kontainer
  • Penetapan
  • Izin yang Ditentukan Pengguna
  • Pemisahan Hak Istimewa
  • Penegakan Kernel

Setelah memahami detail ini, Anda akan dapat membuat rencana untuk mengadopsi App Sandbox di aplikasi Xamarin.Mac Anda.

Pertama, Anda harus menentukan apakah aplikasi Anda adalah kandidat yang baik untuk sandboxing (sebagian besar aplikasi). Selanjutnya, Anda harus menyelesaikan ketidaksesuaian API apa pun dan menentukan elemen App Sandbox mana yang akan Anda butuhkan. Terakhir, lihat menggunakan Pemisahan Hak Istimewa untuk memaksimalkan tingkat pertahanan aplikasi Anda.

Saat mengadopsi App Sandbox, beberapa lokasi sistem file yang digunakan aplikasi Anda akan berbeda. Terutama, aplikasi Anda akan memiliki Direktori Kontainer yang akan digunakan untuk file dukungan aplikasi, database, cache, dan file lain yang bukan dokumen pengguna. MacOS dan Xcode memberikan dukungan untuk memigrasikan jenis file ini dari lokasi warisan mereka ke kontainer.

Mulai cepat sandboxing

Di bagian ini, kita akan membuat aplikasi Xamarin.Mac sederhana yang menggunakan Tampilan Web (yang memerlukan koneksi jaringan yang dibatasi di bawah sandboxing kecuali diminta secara khusus) sebagai contoh memulai Dengan App Sandbox.

Kami akan memverifikasi bahwa aplikasi benar-benar dikotakpasir dan mempelajari cara memecahkan masalah dan mengatasi kesalahan Sandbox Aplikasi umum.

Membuat proyek Xamarin.Mac

Mari kita lakukan hal berikut untuk membuat proyek sampel kami:

  1. Mulai Visual Studio untuk Mac dan klik tautan Solusi Baru.. .

  2. Dari kotak dialog Proyek Baru, pilih App Mac>>Cocoa App:

    Creating a new Cocoa App

  3. Klik tombol Berikutnya , masukkan MacSandbox untuk nama proyek dan klik tombol Buat :

    Entering the app name

  4. Di Solution Pad, klik dua kali file Main.storyboard untuk membukanya untuk pengeditan di Xcode:

    Editing the main storyboard

  5. Seret Tampilan Web ke Jendela, ukur untuk mengisi area konten dan atur agar bertambah dan menyusut dengan jendela:

    Adding a web view

  6. Buat outlet untuk tampilan web yang disebut webView:

    Creating a new outlet

  7. Kembali ke Visual Studio untuk Mac dan klik dua kali file ViewController.cs di Pad Solusi untuk membukanya untuk pengeditan.

  8. Tambahkan pernyataan penggunaan berikut: using WebKit;

  9. ViewDidLoad Buat metode terlihat seperti berikut:

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. Simpan perubahan.

Jalankan aplikasi Anda dan pastikan Situs Web Apple ditampilkan di jendela sebagai berikut:

Showing an example app run

Menandatangani dan menyediakan aplikasi

Sebelum dapat mengaktifkan App Sandbox, pertama-tama kita perlu memprovisikan dan menandatangani aplikasi Xamarin.Mac kita.

Mari lakukan hal berikut:

  1. Masuk ke Portal Pengembang Apple:

    Logging into the Apple Developer Portal

  2. Pilih Sertifikat, Pengidentifikasi & Profil:

    Selecting Certificates, Identifiers & Profiles

  3. Di bawah Mac Apps, pilih Pengidentifikasi:

    Selecting Identifiers

  4. Buat ID baru untuk aplikasi:

    Creating a new App ID

  5. Di bawah Profil Provisi, pilih Pengembangan:

    Selecting Development

  6. Buat profil baru dan pilih Pengembangan Aplikasi Mac:

    Creating a new profile

  7. Pilih ID Aplikasi yang kami buat di atas:

    Selecting the App ID

  8. Pilih Pengembang untuk profil ini:

    Adding developers

  9. Pilih komputer untuk profil ini:

    Selecting the allowed computers

  10. Beri nama pada profil:

    Giving the profile a name

  11. Klik tombol Selesai.

Penting

Dalam beberapa kasus, Anda mungkin perlu mengunduh Profil Provisi baru dari Portal Pengembang Apple secara langsung dan mengeklik dua kali untuk menginstalnya. Anda mungkin juga perlu menghentikan dan memulai ulang Visual Studio untuk Mac sebelum dapat mengakses profil baru.

Selanjutnya, kita perlu memuat ID Aplikasi dan Profil baru pada komputer pengembangan. Mari kita lakukan hal berikut:

  1. Mulai Xcode dan pilih Preferensi dari menu Xcode :

    Editing accounts in Xcode

  2. Klik tombol Tampilkan Detail... :

    Clicking the View Details button

  3. Klik tombol Refresh (di sudut kiri bawah).

  4. Klik tombol Selesai .

Selanjutnya, kita perlu memilih ID Aplikasi dan Profil Provisi baru di proyek Xamarin.Mac kami. Mari kita lakukan hal berikut:

  1. Di Solution Pad, klik dua kali file Info.plist untuk membukanya untuk pengeditan.

  2. Pastikan bahwa Pengidentifikasi Bundel cocok dengan ID Aplikasi yang kami buat di atas (misalnya: com.appracatappra.MacSandbox):

    Editing the Bundle Identifier

  3. Selanjutnya, klik dua kali file Entitlements.plist dan pastikan iCloud Key-Value Store dan iCloud Containers semuanya cocok dengan ID Aplikasi yang kami buat di atas (misalnya: com.appracatappra.MacSandbox):

    Editing the Entitlements.plist file

  4. Simpan perubahan.

  5. Di Pad Solusi, klik dua kali file proyek untuk membuka Opsi pengeditannya:

    Editign the solution's options

  6. Pilih Penandatanganan Mac, lalu centang Tanda tangani bundel aplikasi dan Tanda tangani paket penginstal. Di bawah Profil provisi, pilih profil yang kami buat di atas:

    Setting the provisioning profile

  7. Klik tombol Selesai.

Penting

Anda mungkin harus keluar dan memulai ulang Visual Studio untuk Mac agar dapat mengenali ID Aplikasi dan Profil Provisi baru yang diinstal oleh Xcode.

Pemecahan masalah provisi

Pada titik ini Anda harus mencoba menjalankan aplikasi dan memastikan bahwa semuanya ditandatangani dan disediakan dengan benar. Jika aplikasi masih berjalan seperti sebelumnya, semuanya baik. Jika terjadi kegagalan, Anda mungkin mendapatkan kotak dialog seperti berikut ini:

An example provisioning issue dialog

Berikut adalah penyebab paling umum dari masalah provisi dan penandatanganan:

  • ID App Bundle tidak cocok dengan ID Aplikasi dari profil yang dipilih.
  • ID Pengembang tidak cocok dengan ID Pengembang dari profil yang dipilih.
  • UUID Mac yang sedang diuji tidak terdaftar sebagai bagian dari profil yang dipilih.

Dalam kasus masalah, koreksi masalah di Portal Pengembang Apple, refresh profil di Xcode dan lakukan build bersih di Visual Studio untuk Mac.

Mengaktifkan Kotak Pasir Aplikasi

Anda mengaktifkan Kotak Pasir Aplikasi dengan memilih kotak centang di opsi proyek Anda. Lakukan:

  1. Di Solution Pad, klik dua kali file Entitlements.plist untuk membukanya untuk pengeditan.

  2. Periksa Aktifkan Pemberian Izin dan Aktifkan Sandboxing Aplikasi:

    Editing entitlements and enabling sandboxing

  3. Simpan perubahan.

Pada titik ini, Anda telah mengaktifkan Kotak Pasir Aplikasi tetapi Anda belum menyediakan akses jaringan yang diperlukan untuk Tampilan Web. Jika Anda menjalankan aplikasi sekarang, Anda harus mendapatkan jendela kosong:

Showing the web access being blocked

Memverifikasi bahwa aplikasi dikotakpasir

Selain perilaku pemblokiran sumber daya, ada tiga cara utama untuk mengetahui apakah aplikasi Xamarin.Mac telah berhasil dikotakpasir:

  1. Di Finder, periksa konten ~/Library/Containers/ folder - Jika aplikasi dikotakpasir, akan ada folder bernama seperti Pengidentifikasi Bundel aplikasi Anda (misalnya: com.appracatappra.MacSandbox):

    Opening the app's bundle

  2. Sistem melihat aplikasi sebagai kotak pasir di Monitor Aktivitas:

    • Luncurkan Monitor Aktivitas (di bawah /Applications/Utilities).
    • Pilih Tampilkan>Kolom dan pastikan item menu Kotak Pasir dicentang.
    • Pastikan kolom Sandbox dibaca Yes untuk aplikasi Anda:

    Checking the app in the Activity Monitor

  3. Periksa apakah biner aplikasi dikotakpasir:

    • Mulai aplikasi Terminal.
    • Navigasikan ke direktori aplikasi bin .
    • Terbitkan perintah ini: codesign -dvvv --entitlements :- executable_path (di mana executable_path adalah jalur ke aplikasi Anda):

    Checking the app on the command line

Men-debug aplikasi berkotak pasir

Debugger terhubung ke aplikasi Xamarin.Mac melalui TCP, yang berarti bahwa secara default saat Anda mengaktifkan sandboxing, tidak dapat terhubung ke aplikasi, jadi jika Anda mencoba menjalankan aplikasi tanpa izin yang tepat diaktifkan, Anda mendapatkan kesalahan "Tidak dapat terhubung ke debugger".

Setting the required options

Izin Izinkan Jaringan Keluar Koneksi (Klien) adalah izin yang diperlukan untuk debugger, mengaktifkan yang satu ini akan memungkinkan penelusuran kesalahan secara normal. Karena Anda tidak dapat men-debug tanpanya, kami telah memperbarui CompileEntitlements target untuk msbuild secara otomatis menambahkan izin tersebut ke pemberian hak untuk aplikasi apa pun yang dikotakpasir untuk build debug saja. Build rilis harus menggunakan hak yang ditentukan dalam file pemberian hak, tidak dimodifikasi.

Mengatasi pelanggaran Kotak Pasir Aplikasi

Pelanggaran Kotak Pasir Aplikasi terjadi jika aplikasi Xamarin.Mac terkotakpasir mencoba mengakses sumber daya yang belum diizinkan secara eksplisit. Misalnya, Tampilan Web kami tidak lagi dapat menampilkan Situs Web Apple.

Sumber pelanggaran Kotak Pasir Aplikasi yang paling umum terjadi ketika pengaturan Pemberian Izin yang ditentukan di Visual Studio untuk Mac tidak cocok dengan persyaratan aplikasi. Sekali lagi, kembali ke contoh kami, penetapan Koneksi ion Jaringan yang hilang yang menjaga Tampilan Web tidak berfungsi.

Menemukan pelanggaran Kotak Pasir Aplikasi

Jika Anda menduga Pelanggaran Kotak Pasir Aplikasi terjadi di aplikasi Xamarin.Mac Anda, cara tercepat untuk menemukan masalah adalah dengan menggunakan aplikasi Konsol .

Lakukan:

  1. Kompilasi aplikasi yang dimaksud dan jalankan dari Visual Studio untuk Mac.

  2. Buka aplikasi Konsol (dari /Applications/Utilties/).

  3. Pilih Semua Pesan di bar samping dan masukkan sandbox dalam pencarian:

    An example of a sandboxing issue in the console

Untuk contoh aplikasi kami di atas, Anda dapat melihat bahwa Kernal memblokir network-outbound lalu lintas karena App Sandbox, karena kami belum meminta hak tersebut.

Memperbaiki pelanggaran Kotak Pasir Aplikasi dengan pemberian izin

Sekarang setelah kita melihat cara menemukan Pelanggaran Sandboxing Aplikasi, mari kita lihat bagaimana mereka dapat diselesaikan dengan menyesuaikan Pemberian Izin aplikasi kami.

Lakukan:

  1. Di Solution Pad, klik dua kali file Entitlements.plist untuk membukanya untuk pengeditan.

  2. Di bawah bagian Pemberian Izin, centang kotak centang Izinkan Jaringan Keluar Koneksi (Klien) :

    Editing the entitlements

  3. Simpan perubahan ke aplikasi.

Jika kita melakukan hal di atas untuk aplikasi contoh kita, maka buat dan jalankan, konten web sekarang akan ditampilkan seperti yang diharapkan.

Kotak Pasir Aplikasi secara mendalam

Mekanisme kontrol akses yang disediakan oleh App Sandbox sedikit dan mudah dipahami. Namun, cara app Sandbox akan diadopsi oleh setiap aplikasi bersifat unik dan berdasarkan persyaratan aplikasi.

Mengingat upaya terbaik Anda untuk melindungi aplikasi Xamarin.Mac Anda agar tidak dieksploitasi oleh kode berbahaya, hanya perlu ada satu kerentanan baik di aplikasi (atau salah satu pustaka atau kerangka kerja yang dikonsumsinya) untuk mendapatkan kontrol interaksi aplikasi dengan sistem.

App Sandbox dirancang untuk mencegah pengamblihan (atau membatasi kerusakan yang dapat ditimbulkannya) dengan memungkinkan Anda menentukan interaksi yang dimaksudkan aplikasi dengan sistem. Sistem hanya akan memberikan akses ke sumber daya yang diperlukan aplikasi Anda untuk menyelesaikan pekerjaannya dan tidak lebih.

Saat merancang untuk App Sandbox, Anda merancang untuk skenario terburuk. Jika aplikasi memang disusupi oleh kode berbahaya, aplikasi hanya terbatas pada mengakses file dan sumber daya di kotak pasir aplikasi.

Hak dan akses sumber daya sistem

Seperti yang kita lihat di atas, aplikasi Xamarin.Mac yang belum dikotakpasir diberikan hak penuh dan akses pengguna yang menjalankan aplikasi. Jika disusupi oleh kode berbahaya, aplikasi yang tidak dilindungi dapat bertindak sebagai agen untuk perilaku bermusuhan, dengan berbagai potensi untuk melakukan bahaya.

Dengan mengaktifkan App Sandbox, Anda menghapus semua kecuali sekumpulan hak istimewa minimal, yang kemudian Anda aktifkan kembali berdasarkan kebutuhan saja menggunakan hak aplikasi Xamarin.Mac Anda.

Anda memodifikasi Sumber Daya Kotak Pasir Aplikasi aplikasi dengan mengedit file Entitlements.plist dan mencentang atau memilih hak yang diperlukan dari kotak dropdown editor:

Editing the entitlements

Direktori kontainer dan akses sistem file

Saat aplikasi Xamarin.Mac Anda mengadopsi App Sandbox, aplikasi tersebut memiliki akses ke lokasi berikut:

  • Direktori Kontainer Aplikasi - Saat pertama kali dijalankan, OS membuat Direktori Kontainer khusus tempat semua sumber dayanya pergi, yang hanya dapat diaksesnya. Aplikasi akan memiliki akses baca/tulis penuh ke direktori ini.
  • Direktori Kontainer Grup Aplikasi - Aplikasi Anda dapat diberikan akses ke satu atau beberapa Kontainer Grup yang dibagikan di antara aplikasi dalam grup yang sama.
  • File yang Ditentukan Pengguna - Aplikasi Anda secara otomatis mendapatkan akses ke file yang secara eksplisit dibuka atau diseret dan dijatuhkan ke aplikasi oleh pengguna.
  • Item Terkait - Dengan hak yang sesuai, aplikasi Anda dapat memiliki akses ke file dengan nama yang sama tetapi ekstensi yang berbeda. Misalnya, dokumen yang telah disimpan sebagai .txt file dan .pdf.
  • Direktori sementara, direktori alat baris perintah, dan lokasi tertentu yang dapat dibaca di dunia - Aplikasi Anda memiliki berbagai tingkat akses ke file di lokasi lain yang ditentukan dengan baik seperti yang ditentukan oleh sistem.

Direktori kontainer aplikasi

Direktori Kontainer Aplikasi Xamarin.Mac memiliki karakteristik berikut:

  • Ini berada di lokasi tersembunyi di direktori Beranda pengguna (biasanya ~Library/Containers) dan dapat diakses dengan NSHomeDirectory fungsi (lihat di bawah) dalam aplikasi Anda. Karena berada di direktori Beranda, setiap pengguna akan mendapatkan kontainer mereka sendiri untuk aplikasi.
  • Aplikasi ini memiliki akses baca/tulis yang tidak dibatasi ke Direktori Kontainer dan semua sub-direktori dan filenya di dalamnya.
  • Sebagian besar API pencari jalur macOS relatif terhadap kontainer aplikasi. Misalnya, kontainer akan memiliki Pustaka sendiri (diakses melalui NSLibraryDirectorysubdirektori ), Dukungan Aplikasi dan Preferensi.
  • macOS menetapkan dan memberlakukan koneksi antara dan aplikasi dan kontainernya melalui penandatanganan kode. Bahkan adalah aplikasi lain yang mencoba memalsukan aplikasi dengan menggunakan Pengidentifikasi Bundelnya, aplikasi tersebut tidak akan dapat mengakses Kontainer karena penandatanganan kode.
  • Kontainer bukan untuk file yang dihasilkan pengguna. Sebaliknya untuk file yang digunakan aplikasi Anda seperti database, cache, atau jenis data tertentu lainnya.
  • Untuk jenis app shoebox (seperti app Foto Apple), konten pengguna akan masuk ke Kontainer.

Penting

Sayangnya, Xamarin.Mac belum memiliki cakupan API 100% (tidak seperti Xamarin.iOS), akibatnya NSHomeDirectory API belum dipetakan dalam versi Xamarin.Mac saat ini.

Sebagai solusi sementara, Anda dapat menggunakan kode berikut:

[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 ();
        }
}

Direktori kontainer grup aplikasi

Dimulai dengan Mac macOS 10.7.5 (dan lebih besar), aplikasi dapat menggunakan com.apple.security.application-groups hak untuk mengakses kontainer bersama yang umum untuk semua aplikasi dalam grup. Anda dapat menggunakan kontainer bersama ini untuk konten yang tidak menghadap pengguna seperti database atau jenis file dukungan lainnya (seperti cache).

Kontainer Grup secara otomatis ditambahkan ke Kontainer Kotak Pasir setiap aplikasi (jika merupakan bagian dari grup) dan disimpan di ~/Library/Group Containers/<application-group-id>. ID Grup harus dimulai dengan ID Tim Pengembangan dan titik Anda, misalnya:

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

Untuk informasi selengkapnya, lihat Menambahkan Aplikasi Apple ke Grup Aplikasi di Referensi Kunci Pemberian Izin.

Akses powerbox dan sistem file di luar kontainer aplikasi

Aplikasi Xamarin.Mac terkotakpasir dapat mengakses lokasi sistem file di luar kontainernya dengan cara berikut:

  • Pada arah tertentu pengguna (melalui Buka dan Simpan Dialog atau metode lain seperti seret dan letakkan).
  • Dengan menggunakan pemberian izin untuk lokasi sistem file tertentu (seperti /bin atau /usr/lib).
  • Ketika lokasi sistem file berada di direktori tertentu yang dapat dibaca dunia (seperti Berbagi).

Powerbox adalah teknologi keamanan macOS yang berinteraksi dengan pengguna untuk memperluas hak akses file aplikasi Xamarin.Mac terkotakpasir Anda. Powerbox tidak memiliki API, tetapi diaktifkan secara transparan saat aplikasi memanggil NSOpenPanel atau NSSavePanel. Akses Powerbox diaktifkan melalui Hak yang Anda tetapkan untuk aplikasi Xamarin.Mac Anda.

Saat aplikasi berkotak pasir menampilkan dialog Buka atau Simpan, jendela disajikan oleh Powerbox (dan bukan AppKit) dan karenanya memiliki akses ke file atau direktori apa pun yang dapat diakses pengguna.

Saat pengguna memilih file atau direktori dari dialog Buka atau Simpan (atau seret ke ikon Aplikasi), Powerbox menambahkan jalur terkait ke kotak pasir aplikasi.

Selain itu, sistem secara otomatis mengizinkan hal berikut ke aplikasi terkotakpasir:

  • Koneksi ke metode input sistem.
  • Layanan panggilan yang dipilih oleh pengguna dari menu Layanan (hanya untuk layanan yang ditandai sebagai aman untuk aplikasi kotak pasir oleh penyedia layanan).
  • Buka file yang dipilih oleh pengguna dari menu Buka Terbaru .
  • Gunakan Salin & Tempel di antara aplikasi lain.
  • Baca file dari lokasi yang dapat dibaca di dunia berikut:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Membaca dan menulis file di direktori yang dibuat oleh NSTemporaryDirectory.

Jadilah default, file yang dibuka atau disimpan oleh aplikasi Xamarin.Mac dalam kotak pasir tetap dapat diakses hingga aplikasi berakhir (kecuali file masih terbuka saat aplikasi berhenti). File terbuka akan dipulihkan secara otomatis ke kotak pasir aplikasi melalui fitur Resume macOS saat aplikasi dimulai lagi.

Untuk memberikan persistensi pada file yang terletak di luar kontainer Xamarin.Mac App, gunakan marka buku Cakupan Keamanan (lihat di bawah).

App Sandbox memungkinkan aplikasi mengakses item terkait yang memiliki nama file yang sama, tetapi ekstensi yang berbeda. Fitur ini memiliki dua bagian: a) daftar ekstensi terkait dalam file aplikasi Info.plst , b) kode untuk memberi tahu kotak pasir apa yang akan dilakukan aplikasi dengan file-file ini.

Ada dua skenario di mana hal ini masuk akal:

  1. Aplikasi harus dapat menyimpan versi file yang berbeda (dengan ekstensi baru). Misalnya, mengekspor .txt file ke .pdf file. Untuk menangani situasi ini, Anda harus menggunakan NSFileCoordinator untuk mengakses file. Anda akan memanggil metode terlebih WillMove(fromURL, toURL) dahulu, memindahkan file ke ekstensi baru lalu memanggil ItemMoved(fromURL, toURL).
  2. Aplikasi ini perlu membuka file utama dengan satu ekstensi dan beberapa file pendukung dengan ekstensi yang berbeda. Misalnya, Film dan file Subtitel. NSFilePresenter Gunakan untuk mendapatkan akses ke file sekunder. Berikan file utama ke PrimaryPresentedItemURL properti dan file sekunder ke PresentedItemURL properti . Ketika file utama dibuka, panggil AddFilePresenter metode NSFileCoordinator kelas untuk mendaftarkan file sekunder.

Dalam kedua skenario, file Info.plist aplikasi harus mendeklarasikan Jenis Dokumen yang dapat dibuka aplikasi. Untuk jenis file apa pun, tambahkan NSIsRelatedItemType (dengan nilai YES) ke entrinya dalam CFBundleDocumentTypes array.

Membuka dan menyimpan perilaku dialog dengan aplikasi terkotakpasir

Batas berikut ditempatkan pada NSOpenPanel dan NSSavePanel saat memanggilnya dari aplikasi Xamarin.Mac terkotakpasir:

  • Anda tidak dapat memanggil tombol OK secara terprogram.
  • Anda tidak dapat mengubah pilihan pengguna secara terprogram dalam NSOpenSavePanelDelegate.

Selain itu, modifikasi warisan berikut ini ada di tempat:

  • Aplikasi Non-Kotak Pasir - NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Bookmark cakupan keamanan dan akses sumber daya persisten

Seperti yang dinyatakan di atas, aplikasi Sandboxed Xamarin.Mac dapat mengakses file atau sumber daya di luar kontainernya dengan cara interaksi pengguna langsung (seperti yang disediakan oleh PowerBox). Namun, akses ke sumber daya ini tidak secara otomatis bertahan di seluruh peluncuran aplikasi atau menghidupkan ulang sistem.

Dengan menggunakan Bookmark Cakupan Keamanan, aplikasi Sandboxed Xamarin.Mac dapat mempertahankan niat pengguna dan mempertahankan akses ke sumber daya tertentu setelah aplikasi dimulai ulang.

Jenis bookmark dengan cakupan keamanan

Saat bekerja dengan Bookmark Cakupan Keamanan dan Akses Sumber Daya Persisten, ada dua kasus penggunaan sistine:

  • Bookmark Cakupan Aplikasi menyediakan akses persisten ke file atau folder yang ditentukan pengguna.

    Misalnya, jika aplikasi Xamarin.Mac terkotakpasir memungkinkan untuk menggunakan untuk membuka dokumen eksternal untuk pengeditan (menggunakan NSOpenPanel), aplikasi dapat membuat Bookmark Cakupan Aplikasi sehingga dapat mengakses file yang sama lagi di masa mendatang.

  • Bookmark Cakupan Dokumen menyediakan akses persisten dokumen tertentu ke sub-file.

Misalnya, aplikasi pengeditan video yang membuat file proyek yang memiliki akses ke masing-masing gambar, klip video, dan file suara yang nantinya akan digabungkan ke dalam satu film.

Saat pengguna mengimpor file sumber daya ke dalam proyek (melalui NSOpenPanel), aplikasi membuat Bookmark Cakupan Dokumen untuk item yang disimpan dalam proyek, sehingga file selalu dapat diakses oleh aplikasi.

Bookmark Cakupan Dokumen dapat diselesaikan oleh aplikasi apa pun yang dapat membuka data bookmark dan dokumen itu sendiri. Ini mendukung portabilitas, memungkinkan pengguna untuk mengirim file proyek ke pengguna lain dan memiliki semua marka buku juga berfungsi untuk mereka.

Penting

Bookmark Cakupan Dokumen hanya dapat menunjuk ke satu file dan bukan folder dan file tersebut tidak dapat berada di lokasi yang digunakan oleh sistem (seperti /private atau /Library).

Menggunakan marka buku cakupan keamanan

Menggunakan salah satu jenis Bookmark Cakupan Keamanan, mengharuskan Anda melakukan langkah-langkah berikut:

  1. Atur Pemberian Hak yang sesuai di aplikasi Xamarin.Mac yang perlu menggunakan Bookmark Cakupan Keamanan - Untuk Bookmark Cakupan Aplikasi, atur com.apple.security.files.bookmarks.app-scope kunci Pemberian Hak ke true. Untuk Bookmark Cakupan Dokumen, atur com.apple.security.files.bookmarks.document-scope kunci Pemberian Izin ke true.
  2. Buat Bookmark Cakupan Keamanan - Anda akan melakukan ini untuk file atau folder apa pun yang telah disediakan pengguna akses (melalui NSOpenPanel misalnya), yang akan memerlukan akses persisten ke aplikasi. public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error) Gunakan metode NSUrl kelas untuk membuat marka buku.
  3. Atasi Bookmark Cakupan Keamanan - Saat aplikasi perlu mengakses sumber daya lagi (misalnya, setelah menghidupkan ulang) aplikasi perlu menyelesaikan bookmark ke URL dengan cakupan keamanan. public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error) Gunakan metode NSUrl kelas untuk mengatasi bookmark.
  4. Beri tahu Sistem secara eksplisit bahwa Anda ingin mengakses file dari URL Cakupan Keamanan - Langkah ini perlu dilakukan segera setelah mendapatkan URL Cakupan Keamanan di atas atau, ketika Anda nanti ingin mendapatkan kembali akses ke sumber daya setelah melepaskan akses Anda ke file tersebut. StartAccessingSecurityScopedResource () Panggil metode NSUrl kelas untuk mulai mengakses URL Cakupan Keamanan.
  5. Secara eksplisit memberi tahu Sistem bahwa Anda selesai mengakses file dari URL Cakupan Keamanan - Sesegera mungkin, Anda harus memberi tahu Sistem ketika aplikasi tidak lagi memerlukan akses ke file (misalnya, jika pengguna menutupnya). StopAccessingSecurityScopedResource () Panggil metode NSUrl kelas untuk berhenti mengakses URL Cakupan Keamanan.

Setelah melepaskan akses ke sumber daya, Anda harus kembali ke langkah 4 lagi untuk membuat kembali akses. Jika aplikasi Xamarin.Mac dimulai ulang, Anda harus kembali ke langkah 3 dan menyelesaikan kembali marka buku.

Penting

Kegagalan untuk merilis akses ke sumber daya URL Cakupan Keamanan akan menyebabkan aplikasi Xamarin.Mac membocorkan sumber daya Kernel. Akibatnya, aplikasi tidak akan lagi dapat menambahkan lokasi sistem file ke Kontainernya sampai dimulai ulang.

Kotak Pasir Aplikasi dan penandatanganan kode

Setelah mengaktifkan App Sandbox dan mengaktifkan persyaratan khusus untuk aplikasi Xamarin.Mac Anda (melalui Pemberian Izin), Anda harus menandatangani kode proyek agar sandboxing berlaku. Anda harus melakukan penandatanganan kode karena Hak yang diperlukan untuk App Sandboxing ditautkan ke tanda tangan aplikasi.

macOS memberlakukan tautan antara Kontainer aplikasi dan tanda tangan kodenya, dengan cara ini tidak ada aplikasi lain yang dapat mengakses kontainer tersebut, bahkan jika melakukan spoofing ID Bundel aplikasi. Mekanisme ini berfungsi sebagai berikut:

  1. Saat Sistem membuat Kontainer aplikasi, Sistem mengatur Daftar Kontrol Akses (ACL) pada Kontainer tersebut. Entri kontrol akses awal dalam daftar berisi Persyaratan yang Ditunjuk (DR) aplikasi, yang menjelaskan bagaimana versi aplikasi di masa mendatang dapat dikenali (ketika telah ditingkatkan).
  2. Setiap kali aplikasi dengan ID Bundel yang sama diluncurkan, sistem memeriksa apakah tanda tangan kode aplikasi cocok dengan Persyaratan yang Ditunjuk yang ditentukan dalam salah satu entri dalam ACL kontainer. Jika sistem tidak menemukan kecocokan, sistem mencegah aplikasi diluncurkan.

Penandatanganan Kode berfungsi dengan cara berikut:

  1. Sebelum membuat proyek Xamarin.Mac, dapatkan Sertifikat Pengembangan, Sertifikat Distribusi, dan Sertifikat ID Pengembang dari Portal Pengembang Apple.
  2. Saat Mac App Store mendistribusikan app Xamarin.Mac, app tersebut ditandatangani dengan tanda tangan kode Apple.

Saat menguji dan menelusuri kesalahan, Anda akan menggunakan versi aplikasi Xamarin.Mac yang Anda tandatangani (yang akan digunakan untuk membuat Kontainer Aplikasi). Nantinya, jika Anda ingin menguji atau menginstal versi dari Apple App Store, itu akan ditandatangani dengan tanda tangan Apple dan akan gagal diluncurkan (karena tidak memiliki tanda tangan kode yang sama dengan Kontainer Aplikasi asli). Dalam situasi ini, Anda akan mendapatkan laporan crash yang mirip dengan yang berikut ini:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Untuk memperbaikinya, Anda harus menyesuaikan entri ACL untuk menunjuk ke versi app yang ditandatangani Apple.

Untuk informasi selengkapnya tentang membuat dan mengunduh Profil Provisi yang diperlukan untuk Sandboxing, silakan lihat bagian Penandatanganan dan Provisi Aplikasi di atas.

Menyesuaikan entri ACL

Untuk mengizinkan versi app Xamarin.Mac yang ditandatangani Apple berjalan, lakukan hal berikut:

  1. Buka aplikasi Terminal (di /Applications/Utilities).
  2. Buka jendela Finder ke versi app Xamarin.Mac yang ditandatangani Apple.
  3. Ketik asctl container acl add -file di jendela Terminal.
  4. Seret ikon app Xamarin.Mac dari jendela Finder dan letakkan di jendela Terminal.
  5. Jalur lengkap ke file akan ditambahkan ke perintah di Terminal.
  6. Tekan Enter untuk menjalankan perintah.

ACL kontainer sekarang berisi persyaratan kode yang ditunjuk untuk kedua versi aplikasi Xamarin.Mac dan macOS sekarang akan memungkinkan salah satu versi untuk dijalankan.

Menampilkan daftar persyaratan kode ACL

Anda dapat melihat daftar persyaratan kode di ACL kontainer dengan melakukan hal berikut:

  1. Buka aplikasi Terminal (di /Applications/Utilities).
  2. Ketik asctl container acl list -bundle <container-name>.
  3. Tekan Enter untuk menjalankan perintah.

<container-name> biasanya adalah Pengidentifikasi Bundel untuk aplikasi Xamarin.Mac.

Merancang aplikasi Xamarin.Mac untuk App Sandbox

Ada alur kerja umum yang harus diikuti saat merancang aplikasi Xamarin.Mac untuk App Sandbox. Meskipun demikian, spesifikasi penerapan sandboxing dalam aplikasi akan unik untuk fungsionalitas aplikasi tertentu.

Enam langkah untuk mengadopsi App Sandbox

Merancang aplikasi Xamarin.Mac untuk App Sandbox biasanya terdiri dari langkah-langkah berikut:

  1. Tentukan apakah aplikasi cocok untuk sandboxing.
  2. Merancang strategi pengembangan dan distribusi.
  3. Atasi ketidaksesuaian API apa pun.
  4. Terapkan Hak App Sandbox yang diperlukan ke proyek Xamarin.Mac.
  5. Tambahkan pemisahan hak istimewa menggunakan XPC.
  6. Menerapkan strategi migrasi.

Penting

Anda tidak hanya boleh melakukan sandbox pada app bundle utama yang dapat dieksekusi, tetapi juga setiap aplikasi atau alat pembantu yang disertakan dalam bundel tersebut. Ini diperlukan untuk aplikasi apa pun yang didistribusikan dari Mac App Store dan, jika memungkinkan, harus dilakukan untuk bentuk distribusi aplikasi lainnya.

Untuk daftar semua biner yang dapat dieksekusi dalam bundel aplikasi Xamarin.Mac, ketik perintah berikut di Terminal:

find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"

Di mana [Your-App-Bundle] adalah nama dan jalur ke bundel aplikasi.

Menentukan apakah aplikasi Xamarin.Mac cocok untuk sandboxing

Sebagian besar aplikasi Xamarin.Mac sepenuhnya kompatibel dengan App Sandbox dan oleh karena itu, cocok untuk sandboxing. Jika aplikasi memerlukan perilaku yang tidak diizinkan oleh App Sandbox, Anda harus mempertimbangkan pendekatan alternatif.

Jika aplikasi Anda memerlukan salah satu perilaku berikut, aplikasi tersebut tidak kompatibel dengan App Sandbox:

  • Layanan Otorisasi - Dengan Kotak Pasir Aplikasi, Anda tidak dapat bekerja dengan fungsi yang dijelaskan dalam Referensi C Layanan Otorisasi.
  • API Aksesibilitas - Anda tidak dapat melakukan sandbox aplikasi bantuan seperti pembaca layar atau aplikasi yang mengontrol aplikasi lain.
  • Mengirim Peristiwa Apple ke Aplikasi Arbitrer - Jika aplikasi mengharuskan pengiriman peristiwa Apple ke aplikasi yang tidak diketahui dan seganas, itu tidak dapat dikotakpasir. Untuk daftar aplikasi yang disebut yang diketahui, aplikasi masih dapat dikotakpasir dan Pemberian Izin harus menyertakan daftar aplikasi yang disebut.
  • Kirim Kamus Info Pengguna di Pemberitahuan Terdistribusi ke Tugas lain - Dengan Kotak Pasir Aplikasi, Anda tidak dapat menyertakan userInfo kamus saat memposting ke NSDistributedNotificationCenter objek untuk mengirim pesan tugas lain.
  • Muat Ekstensi Kernel - Pemuatan Ekstensi Kernel dilarang oleh App Sandbox.
  • Mensimulasikan Input Pengguna dalam Dialog Buka dan Simpan - Memanipulasi dialog Buka atau Simpan secara terprogram untuk mensimulasikan atau mengubah input pengguna dilarang oleh Kotak Pasir Aplikasi.
  • Mengakses atau Mengatur Preferensi di Aplikasi lain - Memanipulasi pengaturan aplikasi lain dilarang oleh App Sandbox.
  • Mengonfigurasi Pengaturan Jaringan - Memanipulasi Pengaturan Jaringan dilarang oleh Kotak Pasir Aplikasi.
  • Menghentikan Aplikasi lain - Kotak Pasir Aplikasi melarang penggunaan NSRunningApplication untuk mengakhiri aplikasi lain.

Mengatasi ketidaksesuaian API

Saat mendesain aplikasi Xamarin.Mac untuk App Sandbox, Anda mungkin mengalami ketidakcocokan dengan penggunaan beberapa API macOS.

Berikut adalah beberapa masalah umum dan hal-hal yang dapat Anda lakukan untuk menyelesaikannya:

  • Membuka, Menyimpan, dan Melacak Dokumen - Jika Anda mengelola dokumen menggunakan teknologi apa pun selain NSDocument, Anda harus beralih ke dokumen tersebut karena dukungan bawaan untuk Kotak Pasir Aplikasi. NSDocument secara otomatis bekerja dengan PowerBox dan menyediakan dukungan untuk menyimpan dokumen dalam kotak pasir Anda jika pengguna memindahkannya di Finder.
  • Pertahankan Akses ke Sumber Daya Sistem File - Jika aplikasi Xamarin.Mac bergantung pada akses persisten ke sumber daya di luar kontainernya, gunakan bookmark cakupan keamanan untuk mempertahankan akses.
  • Buat Item Masuk untuk Aplikasi - Dengan Kotak Pasir Aplikasi, Anda tidak dapat membuat item masuk menggunakan LSSharedFileList juga tidak dapat memanipulasi status layanan peluncuran menggunakan LSRegisterURL. Gunakan fungsi seperti yang SMLoginItemSetEnabled dijelaskan di Apples Menambahkan Item Masuk Menggunakan dokumentasi Kerangka Kerja Manajemen Layanan.
  • Mengakses Data Pengguna - Jika Anda menggunakan fungsi POSIX seperti getpwuid untuk mendapatkan direktori beranda pengguna dari layanan direktori, pertimbangkan untuk menggunakan simbol Cocoa atau Core Foundation seperti NSHomeDirectory.
  • Mengakses Preferensi Aplikasi Lain - Karena App Sandbox mengarahkan API pencari jalur ke kontainer aplikasi, preferensi modifikasi terjadi dalam kontainer tersebut dan mengakses preferensi aplikasi lain di tidak diizinkan.
  • Menggunakan Html5 Embedded Video di Tampilan Web - Jika aplikasi Xamarin.Mac menggunakan WebKit untuk memutar video HTML5 yang disematkan, Anda juga harus menautkan aplikasi ke kerangka kerja AV Foundation. App Sandbox akan mencegah CoreMedia memutar video ini jika tidak.

Menerapkan hak App Sandbox yang diperlukan

Anda harus mengedit Pemberian Izin untuk aplikasi Xamarin.Mac apa pun yang ingin Anda jalankan di Kotak Pasir Aplikasi dan centang kotak centang Aktifkan Kotak Pasir Aplikasi.

Berdasarkan fungsionalitas aplikasi, Anda mungkin perlu mengaktifkan Hak lain untuk mengakses fitur atau sumber daya OS. Sandboxing Aplikasi berfungsi paling baik saat Anda meminimalkan hak yang Anda minta ke minimum yang diperlukan untuk menjalankan aplikasi Anda, jadi aktifkan pemberian hak secara acak.

Untuk menentukan pemberian izin mana yang diperlukan aplikasi Xamarin.Mac, lakukan hal berikut:

  1. Aktifkan App Sandbox dan jalankan aplikasi Xamarin.Mac.
  2. Jalankan melalui fitur Aplikasi.
  3. Buka aplikasi Konsol (tersedia di /Applications/Utilities) dan cari sandboxd pelanggaran di log Semua Pesan .
  4. Untuk setiap sandboxd pelanggaran, atasi masalah baik dengan menggunakan kontainer aplikasi, bukan lokasi sistem file lainnya atau terapkan Pemberian Hak Kotak Pasir Aplikasi untuk mengaktifkan akses ke fitur OS terbatas.
  5. Jalankan kembali dan uji semua fitur aplikasi Xamarin.Mac lagi.
  6. Ulangi hingga semua sandboxd pelanggaran telah diselesaikan.

Menambahkan pemisahan hak istimewa menggunakan XPC

Saat mengembangkan aplikasi Xamarin.Mac untuk App Sandbox, lihat perilaku aplikasi dalam hal hak istimewa dan akses, lalu pertimbangkan untuk memisahkan operasi berisiko tinggi ke dalam layanan XPC mereka sendiri.

Untuk informasi selengkapnya, lihat Panduan Membuat Layanan XPC dan Daemon dan Pemrograman Layanan Apple.

Menerapkan strategi migrasi

Jika Anda merilis versi baru yang dikotakpasir dari aplikasi Xamarin.Mac yang sebelumnya tidak dikotakpasir, Anda harus memastikan bahwa pengguna saat ini memiliki jalur peningkatan yang lancar.

Untuk detail tentang cara mengimplementasikan manifes migrasi kontainer, baca Dokumentasi Migrasi App ke Sandbox apple.

Ringkasan

Artikel ini telah melihat secara rinci tentang sandboxing aplikasi Xamarin.Mac. Pertama, kami membuat aplikasi Xamarin.Mac sederhana untuk menunjukkan dasar-dasar App Sandbox. Selanjutnya, kami menunjukkan cara mengatasi pelanggaran kotak pasir. Kemudian, kami melihat secara mendalam App Sandbox dan akhirnya, kami melihat merancang aplikasi Xamarin.Mac untuk App Sandbox.