Xamarin.Mac 앱 샌드박싱

이 문서에서는 앱 스토어에서 릴리스할 Xamarin.Mac 애플리케이션의 샌드박싱에 대해 설명합니다. 컨테이너 디렉터리, 권한, 사용자 결정 권한, 권한 분리 및 커널 적용과 같은 샌드박싱으로 이동하는 모든 요소를 다룹니다.

개요

Xamarin.Mac 애플리케이션에서 C# 및 .NET으로 작업할 때 또는 Swift로 작업할 때와 Objective-C 동일한 방식으로 애플리케이션을 샌드박스할 수 있습니다.

An example of the running app

이 문서에서는 Xamarin.Mac 애플리케이션에서 샌드박싱을 사용하는 기본 사항과 샌드박싱으로 이동하는 모든 요소(컨테이너 디렉터리, 자격, 사용자 결정 권한, 권한 분리 및 커널 적용)에 대해 설명합니다. 이 문서에서 사용할 주요 개념과 기술을 다루므로 Hello, Mac 문서, 특히 Xcode 및 인터페이스 작성기 및 콘센트 및 작업 소개 섹션을 통해 작업하는 것이 좋습니다.

Xamarin.Mac Internals 문서의 섹션Objective-C대한 C# 클래스/메서드 노출을 살펴보고 C# 클래스 Objective-C 를 개체 및 UI 요소에 연결하는 데 사용되는 특성과 Export 특성을 설명 Register 합니다.

앱 샌드박스 정보

앱 샌드박스는 애플리케이션이 시스템 리소스에 대한 액세스를 제한하여 Mac에서 실행되는 악의적인 애플리케이션으로 인해 발생할 수 있는 손상에 대한 강력한 방어를 제공합니다.

샌드박스가 아닌 애플리케이션은 앱을 실행하는 사용자의 모든 권한을 가지며 사용자가 할 수 있는 모든 것에 액세스하거나 수행할 수 있습니다. 앱에 보안 허점(또는 사용하는 프레임워크)이 포함된 경우 해커는 잠재적으로 이러한 약점을 악용하고 앱을 사용하여 실행 중인 Mac을 제어할 수 있습니다.

샌드박스 앱은 애플리케이션별로 리소스에 대한 액세스를 제한하여 사용자의 컴퓨터에서 실행되는 애플리케이션의 도난, 손상 또는 악의적인 의도에 대한 방어선을 제공합니다.

앱 샌드박스는 두 가지 전략을 제공하는 macOS(커널 수준에서 적용됨)에 기본 제공되는 액세스 제어 기술입니다.

  1. 앱 샌드박스를 사용하면 개발자가 애플리케이션이 OS와 상호 작용하는 방법을 설명할 수 있으며, 이러한 방식으로 작업을 완료하는 데 필요한 액세스 권한만 부여되며 더 이상 허용되지 않습니다.
  2. 앱 샌드박스를 사용하면 사용자가 열기 및 저장 대화 상자, 끌어서 놓기 작업 및 기타 일반적인 사용자 상호 작용을 통해 시스템에 대한 추가 액세스 권한을 원활하게 부여할 수 있습니다.

앱 샌드박스 구현 준비

문서에서 자세히 설명할 앱 샌드박스의 요소는 다음과 같습니다.

  • 컨테이너 디렉터리
  • 권리 유형
  • 사용자가 결정한 사용 권한
  • 권한 분리
  • 커널 적용

이러한 세부 정보를 이해하면 Xamarin.Mac 애플리케이션에서 앱 샌드박스를 채택하기 위한 계획을 만들 수 있습니다.

먼저 애플리케이션이 샌드박싱에 적합한지 확인해야 합니다(대부분의 애플리케이션은). 다음으로, API 비호환성을 해결하고 필요한 앱 샌드박스의 요소를 결정해야 합니다. 마지막으로 권한 분리를 사용하여 애플리케이션의 방어 수준을 최대화합니다.

앱 샌드박스를 채택할 때 애플리케이션에서 사용하는 일부 파일 시스템 위치는 다릅니다. 특히 애플리케이션에는 애플리케이션 지원 파일, 데이터베이스, 캐시 및 사용자 문서가 아닌 다른 파일에 사용할 컨테이너 디렉터리가 있습니다. macOS와 Xcode는 모두 이러한 형식의 파일을 레거시 위치에서 컨테이너로 마이그레이션할 수 있도록 지원합니다.

샌드박싱 빠른 시작

이 섹션에서는 앱 샌드박스 시작의 예로 웹 보기를 사용하는 간단한 Xamarin.Mac 앱을 만듭니다(특별히 요청되지 않은 경우 샌드박싱에서 제한되는 네트워크 연결 필요).

애플리케이션이 실제로 샌드박스되었는지 확인하고 일반적인 앱 샌드박스 오류를 해결하고 해결하는 방법을 알아봅니다.

Xamarin.Mac 프로젝트 만들기

다음을 수행하여 샘플 프로젝트를 만들어 보겠습니다.

  1. Mac용 Visual Studio 시작하고 새 솔루션을 클릭합니다.

  2. 새 프로젝트 대화 상자에서 Mac>앱>코코아 앱을 선택합니다.

    Creating a new Cocoa App

  3. 다음 단추를 클릭하고 프로젝트 이름을 입력 MacSandbox 한 다음 만들기 단추를 클릭합니다.

    Entering the app name

  4. Solution Pad에서 Main.storyboard 파일을 두 번 클릭하여 Xcode에서 편집할 수 있도록 엽니다.

    Editing the main storyboard

  5. 웹 보기를 창으로 끌어서 크기를 조정하여 콘텐츠 영역을 채우고 창으로 확장 및 축소하도록 설정합니다.

    Adding a web view

  6. 다음과 같은 웹 보기에 대한 콘센트를 만듭니다 webView.

    Creating a new outlet

  7. Mac용 Visual Studio 돌아가서 Solution Pad에서 ViewController.cs 파일을 두 번 클릭하여 편집용으로 엽니다.

  8. 다음 using 문을 추가합니다. using WebKit;

  9. 메서드를 ViewDidLoad 다음과 같이 표시합니다.

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. 변경 내용을 저장합니다.

애플리케이션을 실행하고 다음과 같이 Apple 웹 사이트가 창에 표시되는지 확인합니다.

Showing an example app run

앱 서명 및 프로비전

앱 샌드박스를 사용하도록 설정하려면 먼저 Xamarin.Mac 애플리케이션을 프로비전하고 서명해야 합니다.

다음을 수행합니다.

  1. Apple 개발자 포털에 로그인합니다.

    Logging into the Apple Developer Portal

  2. 인증서, 식별자 및 프로필을 선택합니다.

    Selecting Certificates, Identifiers & Profiles

  3. Mac 앱에서 식별자를 선택합니다.

    Selecting Identifiers

  4. 애플리케이션에 대한 새 ID를 만듭니다.

    Creating a new App ID

  5. 프로비저닝 프로필에서 개발을 선택합니다.

    Selecting Development

  6. 새 프로필을 만들고 Mac 앱 개발을 선택합니다.

    Creating a new profile

  7. 위에서 만든 앱 ID를 선택합니다.

    Selecting the App ID

  8. 이 프로필에 대한 개발자를 선택합니다.

    Adding developers

  9. 이 프로필의 컴퓨터를 선택합니다.

    Selecting the allowed computers

  10. 프로필에 이름을 지정합니다.

    Giving the profile a name

  11. 완료 단추를 클릭합니다.

Important

경우에 따라 Apple 개발자 포털에서 새 프로비전 프로필을 직접 다운로드하고 두 번 클릭하여 설치해야 할 수 있습니다. 새 프로필에 액세스하기 전에 Mac용 Visual Studio 중지하고 다시 시작해야 할 수도 있습니다.

다음으로, 개발 머신에 새 앱 ID 및 프로필을 로드해야 합니다. 다음을 수행해 보겠습니다.

  1. Xcode를 시작하고 Xcode 메뉴에서 기본 설정을 선택합니다.

    Editing accounts in Xcode

  2. 세부 정보 보기... 단추를 클릭합니다.

    Clicking the View Details button

  3. 왼쪽 아래 모서리에 있는 새로 고침 단추를 클릭합니다.

  4. 완료 단추를 클릭합니다.

다음으로 Xamarin.Mac 프로젝트에서 새 앱 ID 및 프로비전 프로필을 선택해야 합니다. 다음을 수행해 보겠습니다.

  1. Solution Pad에서 Info.plist 파일을 두 번 클릭하여 편집용으로 엽니다.

  2. 번들 식별자가 위에서 만든 앱 ID와 일치하는지 확인합니다(예: com.appracatappra.MacSandbox).

    Editing the Bundle Identifier

  3. 다음으로 Entitlements.plist 파일을 두 번 클릭하고 iCloud 키-값 저장소iCloud 컨테이너가 모두 위에서 만든 앱 ID와 일치하는지 확인합니다(예: com.appracatappra.MacSandbox):.

    Editing the Entitlements.plist file

  4. 변경 내용을 저장합니다.

  5. Solution Pad에서 프로젝트 파일을 두 번 클릭하여 편집할 수 있는 옵션을 엽니다.

    Editign the solution's options

  6. Mac 서명을 선택한 다음, 검사 애플리케이션 번들에 서명하고 설치 관리자 패키지에 서명합니다. 프로비전 프로필에서 위에서 만든 프로필을 선택합니다.

    Setting the provisioning profile

  7. 완료 단추를 클릭합니다.

Important

Xcode에서 설치한 새 앱 ID 및 프로비저닝 프로필을 인식하려면 Mac용 Visual Studio 종료하고 다시 시작해야 할 수 있습니다.

프로비저닝 문제 해결

이 시점에서 애플리케이션을 실행하고 모든 항목이 올바르게 서명되고 프로비전되었는지 확인해야 합니다. 앱이 이전처럼 계속 실행되면 모든 것이 좋습니다. 오류가 발생할 경우 다음과 같은 대화 상자가 표시될 수 있습니다.

An example provisioning issue dialog

프로비전 및 서명 문제의 가장 일반적인 원인은 다음과 같습니다.

  • 앱 번들 ID가 선택한 프로필의 앱 ID와 일치하지 않습니다.
  • 개발자 ID가 선택한 프로필의 개발자 ID와 일치하지 않습니다.
  • 테스트 중인 Mac의 UUID는 선택한 프로필의 일부로 등록되지 않습니다.

문제가 발생할 경우 Apple 개발자 포털에서 문제를 해결하고 Xcode에서 프로필을 새로 고치고 Mac용 Visual Studio 클린 빌드를 수행합니다.

앱 샌드박스 사용

프로젝트 옵션에서 검사box를 선택하여 앱 샌드박스를 사용하도록 설정합니다. 다음을 수행하십시오:

  1. Solution Pad에서 Entitlements.plist 파일을 두 번 클릭하여 편집용으로 엽니다.

  2. 권한 사용 및 앱 샌드박싱 사용:

    Editing entitlements and enabling sandboxing

  3. 변경 내용을 저장합니다.

이 시점에서 앱 샌드박스를 사용하도록 설정했지만 웹 보기에 필요한 네트워크 액세스를 제공하지 않았습니다. 지금 애플리케이션을 실행하면 빈 창이 표시됩니다.

Showing the web access being blocked

앱이 샌드박스로 처리되었는지 확인

리소스 차단 동작 외에도 Xamarin.Mac 애플리케이션이 샌드박스에 성공적으로 적용되었는지 확인할 수 있는 세 가지 기본 방법이 있습니다.

  1. Finder에서 폴더의 ~/Library/Containers/ 내용을 검사 - 앱이 샌드박스에 추가된 경우 앱의 번들 식별자(예: com.appracatappra.MacSandbox)와 같은 폴더가 있습니다.

    Opening the app's bundle

  2. 시스템에서는 앱이 활동 모니터에서 샌드박스로 표시됩니다.

    • 작업 모니터를 시작합니다(아래 /Applications/Utilities).
    • 열 보기를>선택하고 샌드박스 메뉴 항목이 검사 있는지 확인합니다.
    • 샌드박스 열이 애플리케이션에 대해 읽는 Yes 지 확인합니다.

    Checking the app in the Activity Monitor

  3. 앱 이진 파일이 샌드박스로 지정되어 있는지 확인합니다.

    • 터미널 앱을 시작합니다.
    • 애플리케이션 bin 디렉터리로 이동합니다.
    • 다음 명령을 실행 codesign -dvvv --entitlements :- executable_path 합니다( 애플리케이션의 경로는 어디에 executable_path 있음).

    Checking the app on the command line

샌드박스 앱 디버깅

디버거는 TCP를 통해 Xamarin.Mac 앱에 연결합니다. 즉, 기본적으로 샌드박싱을 사용하도록 설정하면 앱에 연결할 수 없으므로 적절한 사용 권한 없이 앱을 실행하려고 하면 "디버거에 연결할 수 없음" 오류가 발생합니다.

Setting the required options

나가는 네트워크 커넥트(클라이언트) 사용 권한은 디버거에 필요한 권한이므로 이 권한을 사용하면 디버깅이 정상적으로 허용됩니다. 디버그 없이는 디버그할 수 없으므로 디버그 빌드에 msbuild 대해서만 샌드박스가 적용된 모든 앱의 권한에 해당 권한을 자동으로 추가하도록 대상을 업데이트 CompileEntitlements 했습니다. 릴리스 빌드는 수정되지 않은 권한 파일에 지정된 자격을 사용해야 합니다.

앱 샌드박스 위반 해결

샌드박스 Xamarin.Mac 애플리케이션이 명시적으로 허용되지 않는 리소스에 액세스하려고 하면 앱 샌드박스 위반이 발생합니다. 예를 들어 웹 보기는 더 이상 Apple 웹 사이트를 표시할 수 없습니다.

앱 샌드박스 위반의 가장 일반적인 원인은 Mac용 Visual Studio 지정된 권한 설정이 애플리케이션의 요구 사항과 일치하지 않는 경우에 발생합니다. 다시 예제로 돌아가서 웹 보기가 작동하지 않도록 하는 누락된 네트워크 커넥트ion 권한입니다.

앱 샌드박스 위반 검색

Xamarin.Mac 애플리케이션에서 앱 샌드박스 위반이 발생하는 것으로 의심되는 경우 가장 빠르게 문제를 검색하는 방법은 콘솔 앱을 사용하는 것입니다.

다음을 수행하십시오:

  1. 문제의 앱을 컴파일하고 Mac용 Visual Studio 실행합니다.

  2. 콘솔 애플리케이션을 엽니다(원본/Applications/Utilties/).

  3. 사이드바에서 모든 메시지를 선택하고 검색에 입력 sandbox 합니다.

    An example of a sandboxing issue in the console

위의 예제 앱의 경우 해당 권한을 요청하지 않았기 때문에 Kernal이 앱 샌드박스로 인해 트래픽을 차단 network-outbound 하고 있음을 알 수 있습니다.

자격으로 앱 샌드박스 위반 수정

이제 앱 샌드박싱 위반을 찾는 방법을 확인했으므로 애플리케이션의 자격을 조정하여 해결할 수 있는 방법을 살펴보겠습니다.

다음을 수행하십시오:

  1. Solution Pad에서 Entitlements.plist 파일을 두 번 클릭하여 편집용으로 엽니다.

  2. 권한 섹션에서 보내는 네트워크 커넥트 허용(클라이언트) 검사 상자를 검사.

    Editing the entitlements

  3. 애플리케이션에 변경 내용을 저장합니다.

예제 앱에 대해 위의 작업을 수행하면 빌드하고 실행하면 웹 콘텐츠가 예상대로 표시됩니다.

앱 샌드박스 심층 분석

앱 샌드박스에서 제공하는 액세스 제어 메커니즘은 거의 없으며 이해하기 쉽습니다. 그러나 각 앱에서 앱 샌드박스를 채택하는 방법은 고유하며 앱의 요구 사항에 따라 달라집니다.

Xamarin.Mac 애플리케이션이 악성 코드에 의해 악용되지 않도록 보호하기 위해 최선의 노력을 기울인 경우 앱(또는 앱이 사용하는 라이브러리 또는 프레임워크 중 하나)에 하나의 취약성만 있으면 앱과 시스템의 상호 작용을 제어할 수 있습니다.

앱 샌드박스는 애플리케이션이 의도한 시스템과의 상호 작용을 지정할 수 있도록 하여 인수를 방지하거나 발생할 수 있는 손상을 제한하도록 설계되었습니다. 시스템은 애플리케이션이 작업을 완료하는 데 필요한 리소스에 대한 액세스 권한만 부여합니다.

앱 샌드박스용으로 디자인할 때 최악의 시나리오를 위해 디자인합니다. 애플리케이션이 악성 코드에 의해 손상되는 경우 앱의 샌드박스에 있는 파일 및 리소스에만 액세스하는 것으로 제한됩니다.

권한 및 시스템 리소스 액세스

위에서 본 것처럼 샌드박스가 적용되지 않은 Xamarin.Mac 애플리케이션에는 앱을 실행하는 사용자의 모든 권한과 액세스 권한이 부여됩니다. 악성 코드에 의해 손상된 경우 보호되지 않는 앱은 악의적인 동작에 대한 에이전트 역할을 할 수 있으며, 광범위한 피해 가능성이 있습니다.

앱 샌드박스를 사용하도록 설정하면 최소한의 권한 집합을 제외한 모든 권한을 제거한 다음, Xamarin.Mac 앱의 자격을 사용하여 필요에 따라 다시 사용하도록 설정합니다.

Entitlements.plist 파일을 편집하고 편집기 드롭다운 상자에서 필요한 권한을 검사 선택하거나 선택하여 애플리케이션의 앱 샌드박스 리소스를 수정합니다.

Editing the entitlements

컨테이너 디렉터리 및 파일 시스템 액세스

Xamarin.Mac 애플리케이션이 앱 샌드박스를 채택하면 다음 위치에 액세스할 수 있습니다.

  • 앱 컨테이너 디렉터리 - 처음 실행할 때 OS는 모든 리소스가 액세스할 수 있는 특수 컨테이너 디렉터리를 만듭니다. 앱은 이 디렉터리에 대한 전체 읽기/쓰기 권한을 갖습니다.
  • 앱 그룹 컨테이너 디렉터리 - 동일한 그룹의 앱 간에 공유되는 하나 이상의 그룹 컨테이너 에 대한 액세스 권한을 앱에 부여할 수 있습니다.
  • 사용자 지정 파일 - 애플리케이션은 사용자가 명시적으로 열거나 끌어서 애플리케이션에 놓인 파일에 자동으로 액세스합니다.
  • 관련 항목 - 적절한 자격으로 애플리케이션은 이름이 같지만 확장명은 다른 파일에 액세스할 수 있습니다. 예를 들어 파일과 파일로 모두 .txt 저장된 문서입니다 .pdf.
  • 임시 디렉터리, 명령줄 도구 디렉터리 및 전 세계에서 읽을 수 있는 특정 위치 - 앱은 시스템에서 지정한 대로 잘 정의된 다른 위치의 파일에 대한 액세스 수준을 다양하게 제공합니다.

앱 컨테이너 디렉터리

Xamarin.Mac 애플리케이션의 App Container Directory에는 다음과 같은 특성이 있습니다.

  • 사용자의 홈 디렉터리(일반적으로 ~Library/Containers)의 숨겨진 위치에 있으며 애플리케이션 내에서 함수(아래 참조)를 사용하여 NSHomeDirectory 액세스할 수 있습니다. 홈 디렉터리에 있으므로 각 사용자는 앱에 대한 자체 컨테이너를 가져옵니다.
  • 앱은 컨테이너 디렉터리와 컨테이너 디렉터리 내의 모든 하위 디렉터리 및 파일에 대한 무제한 읽기/쓰기 액세스 권한을 갖습니다.
  • 대부분의 macOS 경로 찾기 API는 앱의 컨테이너를 기준으로 합니다. 예를 들어 컨테이너에는 자체 라이브러리 (액세스됨 NSLibraryDirectory), 애플리케이션 지원기본 설정 하위 디렉터리가 있습니다.
  • macOS는 코드 서명을 통해 앱과 해당 컨테이너 간의 연결을 설정하고 적용합니다. 다른 앱이 번들 식별자를 사용하여 앱을 스푸핑하려고 시도하더라도 코드 서명으로 인해 컨테이너에 액세스할 수 없습니다.
  • 컨테이너는 사용자가 생성한 파일에 대한 것이 아닙니다. 대신 애플리케이션에서 데이터베이스, 캐시 또는 기타 특정 형식의 데이터와 같은 파일을 사용합니다.
  • 신발 상자 유형의 앱(예: Apple의 사진 앱)의 경우 사용자의 콘텐츠가 컨테이너로 이동합니다.

Important

아쉽게도 Xamarin.Mac에는 아직 100% API 적용 범위가 없으므로(Xamarin.iOS와 달리) NSHomeDirectory API가 현재 버전의 Xamarin.Mac에서 매핑되지 않았습니다.

임시 해결 방법으로 다음 코드를 사용할 수 있습니다.

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

앱 그룹 컨테이너 디렉터리

Mac macOS 10.7.5 이상부터 애플리케이션은 권한을 사용하여 com.apple.security.application-groups 그룹의 모든 애플리케이션에 공통적인 공유 컨테이너에 액세스할 수 있습니다. 데이터베이스 또는 다른 유형의 지원 파일(예: 캐시)과 같은 비 사용자 연결 콘텐츠에 이 공유 컨테이너를 사용할 수 있습니다.

그룹 컨테이너는 각 앱의 샌드박스 컨테이너에 자동으로 추가되고(그룹에 속한 경우) 에 저장 ~/Library/Group Containers/<application-group-id>됩니다. 그룹 ID 는 개발 팀 ID와 마침표로 시작해야 합니다 . 예를 들면 다음과 같습니다.

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

자세한 내용은 자격 키 참조에서 애플리케이션 그룹에애플리케이션을 추가하는 Apple을 참조하세요.

앱 컨테이너 외부의 Powerbox 및 파일 시스템 액세스

샌드박스 Xamarin.Mac 애플리케이션은 다음과 같은 방법으로 컨테이너 외부의 파일 시스템 위치에 액세스할 수 있습니다.

  • 사용자의 특정 방향(열기 및 저장 대화 상자 또는 끌어서 놓기와 같은 다른 메서드를 통해).
  • 특정 파일 시스템 위치(예: /bin 또는 /usr/lib)에 대한 권한을 사용합니다.
  • 파일 시스템 위치가 전 세계에서 읽을 수 있는 특정 디렉터리(예: 공유)에 있는 경우

Powerbox 는 샌드박스 Xamarin.Mac 앱의 파일 액세스 권한을 확장하기 위해 사용자와 상호 작용하는 macOS 보안 기술입니다. Powerbox에는 API가 없지만 앱이 A 또는 NSSavePanel를 호출 NSOpenPanel 할 때 투명하게 활성화됩니다. Powerbox 액세스는 Xamarin.Mac 애플리케이션에 대해 설정한 자격을 통해 사용하도록 설정됩니다.

샌드박스가 적용된 앱에 열기 또는 저장 대화 상자가 표시되면 창은 AppKit이 아닌 Powerbox에서 표시되므로 사용자가 액세스할 수 있는 모든 파일 또는 디렉터리에 액세스할 수 있습니다.

사용자가 열기 또는 저장 대화 상자에서 파일 또는 디렉터리를 선택하거나 앱의 아이콘으로 끌면 Powerbox는 연결된 경로를 앱의 샌드박스에 추가합니다.

또한 시스템은 샌드박스 앱에 다음을 자동으로 허용합니다.

  • 시스템 입력 메서드에 대한 커넥트ion입니다.
  • 서비스 메뉴에서 사용자가 선택한 서비스를 호출합니다(서비스 공급자가 샌드박스 앱에 대해 안전하다고 표시된 서비스에만 해당).
  • 최근 항목 열기 메뉴에서 사용자가 선택한 파일을 엽니다.
  • 다른 애플리케이션 간에 복사 및 붙여넣기를 사용합니다.
  • 세계에서 읽을 수 있는 다음 위치에서 파일을 읽습니다.
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • 에서 만든 NSTemporaryDirectory디렉터리에서 파일을 읽고 씁니다.

기본적으로 샌드박스 Xamarin.Mac 앱에서 열거나 저장한 파일은 앱이 종료될 때까지 액세스할 수 기본 있습니다(앱이 종료될 때 파일이 열려 있지 않은 경우). 열려 있는 파일은 다음에 앱을 시작할 때 macOS 다시 시작 기능을 통해 앱의 샌드박스로 자동으로 복원됩니다.

Xamarin.Mac 앱의 컨테이너 외부에 있는 파일에 지속성을 제공하려면 보안 범위 책갈피를 사용합니다(아래 참조).

앱 샌드박스를 사용하면 앱이 파일 이름이 같지만 확장명이 다른 관련 항목에 액세스할 수 있습니다. 이 기능에는 두 부분으로 구성됩니다. a) 앱 파일의 Info.plst 관련 확장명 목록, b) 코드는 앱이 이러한 파일로 수행할 작업을 샌드박스에 알릴 수 있습니다.

이 방법이 적합한 두 가지 시나리오가 있습니다.

  1. 앱은 파일의 다른 버전을 저장할 수 있어야 합니다(새 확장명 포함). 예를 들어 파일을 파일로 .txt 내보냅니다 .pdf . 이 상황을 처리하려면 파일에 액세스하는 데 사용해야 NSFileCoordinator 합니다. 먼저 메서드를 WillMove(fromURL, toURL) 호출하고 파일을 새 확장으로 이동한 다음 호출 ItemMoved(fromURL, toURL)합니다.
  2. 앱은 확장명 하나와 확장이 다른 여러 지원 파일이 있는 기본 파일을 열어야 합니다. 예를 들어 동영상 및 부제 파일입니다. NSFilePresenter 보조 파일에 대한 액세스 권한을 얻는 데 사용합니다. 속성에 기본 파일을 PrimaryPresentedItemURL 제공하고 속성에 보조 파일을 PresentedItemURL 제공합니다. 기본 파일이 열리면 클래스의 메서드를 NSFileCoordinator 호출 AddFilePresenter 하여 보조 파일을 등록합니다.

두 시나리오에서 앱의 Info.plist 파일은 앱이 열 수 있는 문서 형식을 선언해야 합니다. 모든 파일 형식의 경우 배열의 NSIsRelatedItemTypeYES항목에 값이 있는 )를 CFBundleDocumentTypes 추가합니다.

샌드박스 앱으로 대화 상자 열기 및 저장 동작

샌드박스 Xamarin.Mac 앱에서 호출할 때 다음과 같은 제한이 적용 NSOpenPanelNSSavePanel 됩니다.

  • 프로그래밍 방식으로 확인 단추를 호출할 수 없습니다.
  • 에서 사용자의 선택을 NSOpenSavePanelDelegate프로그래밍 방식으로 변경할 수 없습니다.

또한 다음과 같은 상속 수정 사항이 적용됩니다.

  • 샌드박스가 아닌 앱 - NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

보안 범위 책갈피 및 영구 리소스 액세스

위에서 설명한 것처럼 샌드박스 Xamarin.Mac 애플리케이션은 직접 사용자 상호 작용(PowerBox에서 제공)을 통해 컨테이너 외부의 파일 또는 리소스에 액세스할 수 있습니다. 그러나 이러한 리소스에 대한 액세스는 앱 시작 또는 시스템 다시 시작에서 자동으로 유지되지 않습니다.

샌드박스 Xamarin.Mac 애플리케이션은 보안 범위 책갈피를 사용하여 사용자 의도를 유지하고 기본 앱을 다시 시작한 후 지정된 리소스에 대한 액세스를 유지할 수 있습니다.

보안 범위 책갈피 형식

보안 범위 책갈피 및 영구 리소스 액세스를 사용하는 경우 다음 두 가지 sistine 사용 사례가 있습니다.

  • 앱 범위 책갈피는 사용자 지정 파일 또는 폴더에 대한 영구 액세스를 제공합니다.

    예를 들어 샌드박스가 적용된 Xamarin.Mac 애플리케이션에서 편집을 위해 외부 문서를 여는 데 사용할 NSOpenPanel수 있는 경우 앱은 나중에 동일한 파일에 다시 액세스할 수 있도록 앱 범위 책갈피를 만들 수 있습니다.

  • 문서 범위 책갈피는 하위 파일에 대한 특정 문서 영구 액세스를 제공합니다.

예를 들어 나중에 단일 동영상으로 결합될 개별 이미지, 비디오 클립 및 사운드 파일에 액세스할 수 있는 프로젝트 파일을 만드는 비디오 편집 앱입니다.

사용자가 리소스 파일을 프로젝트로 가져올 때(a NSOpenPanel를 통해) 앱은 프로젝트에 저장된 항목에 대한 문서 범위 책갈피를 만들어 파일이 항상 앱에 액세스할 수 있도록 합니다.

책갈피 데이터와 문서 자체를 열 수 있는 모든 응용 프로그램에서 문서 범위 책갈피를 확인할 수 있습니다. 이 기능은 이식성을 지원하여 사용자가 프로젝트 파일을 다른 사용자에게 보낼 수 있도록 하고 모든 책갈피가 해당 사용자에게도 작동하도록 합니다.

Important

문서 범위 책갈피는 폴더가 아닌 단일 파일만 가리킬 수 있으며 해당 파일은 시스템에서 사용하는 위치(예: /private 또는/Library)에 있을 수 없습니다.

보안 범위 책갈피 사용

보안 범위 책갈피 유형 중 하나를 사용하려면 다음 단계를 수행해야 합니다.

  1. 보안 범위 책갈피를 사용해야 하는 Xamarin.Mac 앱에서 적절한 자격 설정 - 앱 범위 책갈 피의 경우 권한 키를 설정합니다 com.apple.security.files.bookmarks.app-scopetrue. 문서 범위 책갈피의 경우 권한 키를 true로 설정합니다com.apple.security.files.bookmarks.document-scope.
  2. 보안 범위 책갈피 만들기 - 사용자가 액세스 권한을 제공한 파일 또는 폴더( NSOpenPanel 예: 앱에 영구 액세스가 필요함)에 대해 이 작업을 수행합니다. 클래스의 public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error) 메서드를 NSUrl 사용하여 책갈피를 만듭니다.
  3. 보안 범위 책갈피 해결 - 앱이 리소스에 다시 액세스해야 하는 경우(예: 다시 시작한 후) 책갈피를 보안 범위 URL로 확인해야 합니다. 클래스의 public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error) 메서드를 NSUrl 사용하여 책갈피를 확인합니다.
  4. 보안 범위 URL에서 파일에 액세스하려는 시스템에 명시적으로 알림 - 이 단계는 위의 보안 범위 URL 을 얻은 직후 또는 나중에 리소스에 대한 액세스를 포기한 후 리소스에 대한 액세스 권한을 다시 확보하려는 경우 즉시 수행해야 합니다. 클래스의 StartAccessingSecurityScopedResource () 메서드를 NSUrl 호출하여 보안 범위 URL에 액세스하기 시작합니다.
  5. 보안 범위 URL 에서 파일에 대한 액세스가 완료되었음을 시스템에 명시적으로 알립니다. 가능한 한 빨리 앱이 파일에 더 이상 액세스할 필요가 없는 경우(예: 사용자가 파일을 닫는 경우) 시스템에 알려야 합니다. 클래스의 StopAccessingSecurityScopedResource () 메서드를 NSUrl 호출하여 보안 범위 URL에 대한 액세스를 중지합니다.

리소스에 대한 액세스를 포기한 후 액세스를 다시 설정하려면 4단계로 다시 돌아가야 합니다. Xamarin.Mac 앱을 다시 시작하면 3단계로 돌아가서 책갈피를 다시 확인해야 합니다.

Important

보안 범위 URL 리소스에 대한 액세스를 해제하지 못하면 Xamarin.Mac 앱이 커널 리소스를 누출합니다. 따라서 앱은 다시 시작될 때까지 컨테이너에 파일 시스템 위치를 더 이상 추가할 수 없습니다.

앱 샌드박스 및 코드 서명

앱 샌드박스를 사용하도록 설정하고 Xamarin.Mac 앱에 대한 특정 요구 사항(권한 사용)을 사용하도록 설정한 후에는 샌드박싱이 적용되도록 프로젝트에 코드를 서명해야 합니다. 앱 샌드박싱에 필요한 자격은 앱의 서명에 연결되므로 코드 서명을 수행해야 합니다.

macOS는 앱의 컨테이너와 해당 코드 서명 간에 링크를 적용합니다. 이러한 방식으로 앱 번들 ID를 스푸핑하는 경우에도 다른 애플리케이션에서 해당 컨테이너에 액세스할 수 없습니다. 이 메커니즘은 다음과 같이 작동합니다.

  1. 시스템에서 앱의 컨테이너를 만들 때 해당 컨테이너에 ACL(액세스 제어 목록 )을 설정합니다. 목록의 초기 액세스 제어 항목에는 앱의 향후 버전(업그레이드된 경우)을 인식할 수 있는 방법을 설명하는 앱의 DR(지정 요구 사항 )이 포함되어 있습니다.
  2. 번들 ID가 동일한 앱이 시작될 때마다 시스템은 앱의 코드 서명이 컨테이너 ACL의 항목 중 하나에 지정된 지정된 요구 사항과 일치하는지 검사. 시스템에서 일치 항목을 찾지 못하면 앱이 시작되지 않습니다.

코드 서명은 다음과 같은 방식으로 작동합니다.

  1. Xamarin.Mac 프로젝트를 만들기 전에 Apple 개발자 포털에서 개발 인증서, 배포 인증서 및 개발자 ID 인증서를 가져옵니다.
  2. Mac App Store에서 Xamarin.Mac 앱을 배포하면 Apple 코드 서명으로 서명됩니다.

테스트 및 디버깅할 때 서명한 Xamarin.Mac 애플리케이션 버전을 사용합니다(앱 컨테이너를 만드는 데 사용됨). 나중에 Apple App Store에서 버전을 테스트하거나 설치하려는 경우 Apple 서명으로 서명되고 시작되지 않습니다(원래 앱 컨테이너와 동일한 코드 서명이 없기 때문에). 이 경우 다음과 유사한 크래시 보고서가 표시됩니다.

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

이 문제를 해결하려면 앱의 Apple 서명 버전을 가리키도록 ACL 항목을 조정해야 합니다.

샌드박싱에 필요한 프로비저닝 프로필을 만들고 다운로드하는 방법에 대한 자세한 내용은 위의 앱 서명 및 프로비전 섹션을 참조하세요.

ACL 항목 조정

Apple에서 서명된 버전의 Xamarin.Mac 앱을 실행할 수 있도록 하려면 다음을 수행합니다.

  1. 터미널 앱(in)을 /Applications/Utilities엽니다.
  2. Apple 서명된 버전의 Xamarin.Mac 앱에 대한 Finder 창을 엽니다.
  3. 터미널 창에 입력 asctl container acl add -file 합니다.
  4. Finder 창에서 Xamarin.Mac 앱의 아이콘을 끌어 터미널 창에 놓습니다.
  5. 파일의 전체 경로가 터미널의 명령에 추가됩니다.
  6. Enter 키를 눌러 명령을 실행합니다.

이제 컨테이너의 ACL에는 Xamarin.Mac 앱 및 macOS의 두 버전 모두에 대해 지정된 코드 요구 사항이 포함되어 있습니다.

ACL 코드 요구 사항 목록 표시

다음을 수행하여 컨테이너의 ACL에서 코드 요구 사항 목록을 볼 수 있습니다.

  1. 터미널 앱(in)을 /Applications/Utilities엽니다.
  2. asctl container acl list -bundle <container-name>.
  3. Enter 키를 눌러 명령을 실행합니다.

<container-name> 일반적으로 Xamarin.Mac 애플리케이션의 번들 식별자입니다.

앱 샌드박스용 Xamarin.Mac 앱 디자인

앱 샌드박스용 Xamarin.Mac 앱을 디자인할 때 따라야 하는 일반적인 워크플로가 있습니다. 즉, 앱에서 샌드박싱을 구현하는 세부 사항은 지정된 앱의 기능에 고유하게 적용됩니다.

앱 샌드박스를 채택하기 위한 6단계

앱 샌드박스용 Xamarin.Mac 앱 디자인은 일반적으로 다음 단계로 구성됩니다.

  1. 앱이 샌드박싱에 적합한지 확인합니다.
  2. 개발 및 배포 전략을 설계합니다.
  3. API 비호환성을 해결합니다.
  4. Xamarin.Mac 프로젝트에 필요한 앱 샌드박스 자격을 적용합니다.
  5. XPC를 사용하여 권한 분리를 추가합니다.
  6. 마이그레이션 전략을 구현합니다.

Important

앱 번들에서 기본 실행 파일을 샌드박스할 뿐만 아니라 해당 번들에 포함된 모든 도우미 앱 또는 도구도 샌드박스로 만들어야 합니다. 이는 Mac App Store에서 배포된 앱에 필요하며, 가능하면 다른 형태의 앱 배포에 대해 수행해야 합니다.

Xamarin.Mac 앱의 번들에 있는 모든 실행 가능한 이진 파일 목록을 보려면 터미널에 다음 명령을 입력합니다.

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

애플리케이션 번들에 대한 이름과 경로는 어디에 [Your-App-Bundle] 있나요?

Xamarin.Mac 앱이 샌드박싱에 적합한지 확인

대부분의 Xamarin.Mac 앱은 앱 샌드박스와 완벽하게 호환되므로 샌드박싱에 적합합니다. 앱에 앱 샌드박스에서 허용하지 않는 동작이 필요한 경우 대체 방법을 고려해야 합니다.

앱에 다음 동작 중 하나가 필요한 경우 앱 샌드박스와 호환되지 않습니다.

  • Authorization Services - 앱 샌드박스를 사용하면 Authorization Services C 참조설명된 함수를 사용할 수 없습니다.
  • 접근성 API - 화면 읽기 프로그램 또는 다른 애플리케이션을 제어하는 앱과 같은 보조 앱을 샌드박스로 만들 수 없습니다.
  • 임의 앱 에 Apple 이벤트 보내기 - 앱에서 알 수 없는 임의 앱으로 Apple 이벤트를 보내야 하는 경우 샌드박스를 적용할 수 없습니다. 알려진 앱 목록의 경우 앱을 샌드박스로 처리할 수 있으며 권한에는 호출된 앱 목록이 포함되어야 합니다.
  • 분산 알림의 사용자 정보 사전을 다른 작업 으로 보내기 - 앱 샌드박스를 사용하면 다른 작업을 메시징하기 위해 개체에 게시할 때 사전을 포함 userInfoNSDistributedNotificationCenter 수 없습니다.
  • 커널 확장 로드 - 앱 샌드박스에서 커널 확장 로드를 금지합니다.
  • 열기 및 저장 대화 상자 에서 사용자 입력 시뮬레이션 - 프로그래밍 방식으로 열기 또는 저장 대화 상자를 조작하여 사용자 입력을 시뮬레이션하거나 변경하는 것은 앱 샌드박스에서 금지됩니다.
  • 다른 앱 에서 기본 설정에 액세스하거나 설정 - 다른 앱의 설정을 조작하는 것은 앱 샌드박스에서 금지됩니다.
  • 네트워크 설정 구성 - 앱 샌드박스에서 네트워크 설정 조작하는 것은 금지됩니다.
  • 다른 앱 종료 - 앱 샌드박스는 다른 앱을 종료하는 사용을 NSRunningApplication 금지합니다.

API 비호환성 해결

앱 샌드박스용 Xamarin.Mac 앱을 디자인할 때 일부 macOS API 사용과 호환되지 않을 수 있습니다.

다음은 몇 가지 일반적인 문제 및 문제를 해결하기 위해 수행할 수 있는 작업입니다.

  • 문서 열기, 저장 및 추적 - 이외의 NSDocument기술을 사용하여 문서를 관리하는 경우 앱 샌드박스에 대한 기본 제공 지원으로 인해 문서로 전환해야 합니다. NSDocument 는 PowerBox에서 자동으로 작동하며 사용자가 Finder에서 문서를 이동하는 경우 샌드박스 내에 문서를 보관할 수 있도록 지원합니다.
  • 파일 시스템 리소스에 대한 액세스 유지 - Xamarin.Mac 앱이 컨테이너 외부의 리소스에 대한 영구 액세스에 의존하는 경우 보안 범위 책갈피를 사용하여 액세스를 기본.
  • 에 대한 로그인 항목 만들기 - 앱 샌드박스를 사용하면 로그인 항목을 만들 수 없으며, 다음을 사용하여 LSSharedFileListLSRegisterURL시작 서비스의 상태를 조작할 수도 없습니다. SMLoginItemSetEnabled 서비스 관리 프레임워크 설명서를 사용하여 로그인 항목 추가에 설명된 대로 함수를 사용합니다.
  • 사용자 데이터 액세스 - 디렉터리 서비스에서 사용자의 홈 디렉터리를 가져오는 등의 getpwuid POSIX 함수를 사용하는 경우 Cocoa 또는 Core Foundation 기호를 NSHomeDirectory사용하는 것이 좋습니다.
  • 다른 앱 의 기본 설정에 액세스 - 앱 샌드박스가 경로 찾기 API를 앱의 컨테이너로 전달하기 때문에 해당 컨테이너 내에서 기본 설정을 수정하고 허용되지 않는 다른 앱 기본 설정에 액세스합니다.
  • 웹 보기 에서 HTML5 포함된 비디오 사용 - Xamarin.Mac 앱이 WebKit을 사용하여 포함된 HTML5 비디오를 재생하는 경우 AV Foundation 프레임워크에 앱을 연결해야 합니다. 앱 샌드박스는 CoreMedia가 이러한 비디오를 재생하지 못하도록 방지합니다.

필요한 앱 샌드박스 권한 적용

앱 샌드박스에서 실행하려는 Xamarin.Mac 애플리케이션에 대한 자격을 편집하고 앱 샌드박싱 사용 검사 상자를 검사 합니다.

앱의 기능에 따라 OS 기능 또는 리소스에 액세스하기 위해 다른 자격을 사용하도록 설정해야 할 수 있습니다. 앱 샌드박싱은 앱을 실행하는 데 필요한 최소한의 자격으로 요청하는 자격을 최소화할 때 가장 잘 작동하므로 임의로 자격을 사용하도록 설정합니다.

Xamarin.Mac 앱에 필요한 자격을 확인하려면 다음을 수행합니다.

  1. 앱 샌드박스를 사용하도록 설정하고 Xamarin.Mac 앱을 실행합니다.
  2. 앱의 기능을 실행합니다.
  3. 콘솔 앱(사용 가능)을 /Applications/Utilities열고 모든 메시지 로그에서 위반을 sandboxd 습니다.
  4. sandboxd 위반에 대해 다른 파일 시스템 위치 대신 앱 컨테이너를 사용하여 문제를 해결하거나 앱 샌드박스 자격을 적용하여 제한된 OS 기능에 액세스할 수 있도록 합니다.
  5. 모든 Xamarin.Mac 앱 기능을 다시 실행하고 테스트합니다.
  6. 모든 sandboxd 위반이 해결될 때까지 반복합니다.

XPC를 사용하여 권한 분리 추가

앱 샌드박스용 Xamarin.Mac 앱을 개발할 때 권한 및 액세스 측면에서 앱의 동작을 살펴본 다음, 고위험 작업을 자체 XPC 서비스로 분리하는 것이 좋습니다.

자세한 내용은 Apple의 XPC 서비스 및 디먼 및 서비스 프로그래밍 가이드를 참조하세요.

마이그레이션 전략 구현

이전에 샌드박스되지 않은 새 샌드박스 버전의 Xamarin.Mac 애플리케이션을 릴리스하는 경우 현재 사용자에게 원활한 업그레이드 경로가 있는지 확인해야 합니다.

컨테이너 마이그레이션 매니페스트를 구현하는 방법에 대한 자세한 내용은 Apple의 앱을 샌드박스 로 마이그레이션 설명서를 참조하세요.

요약

이 문서에서는 Xamarin.Mac 애플리케이션 샌드박싱에 대해 자세히 살펴보았습니다. 먼저 앱 샌드박스의 기본 사항을 표시하는 Xamarin.Mac 앱을 만들었습니다. 다음으로 샌드박스 위반을 해결하는 방법을 보여 줍니다. 그런 다음 앱 샌드박스를 자세히 살펴봤고 마지막으로 앱 샌드박스용 Xamarin.Mac 앱을 디자인하는 것을 살펴보았습니다.