Colocando em área restrita um aplicativo Xamarin.Mac
Este artigo aborda a área restrita de um aplicativo Xamarin.Mac para versão na App Store. Ele abrange todos os elementos que entram na área restrita, como diretórios de contêiner, direitos, permissões determinadas pelo usuário, separação de privilégios e imposição de kernel.
Visão geral
Ao trabalhar com C# e .NET em um aplicativo Xamarin.Mac, você tem a mesma capacidade de colocar um aplicativo em área restrita que faz ao trabalhar com Objective-C ou Swift.
Neste artigo, abordaremos as noções básicas de como trabalhar com área restrita em um aplicativo Xamarin.Mac e todos os elementos que entram na área restrita: diretórios de contêiner, direitos, permissões determinadas pelo usuário, separação de privilégios e imposição de kernel. É altamente recomendável que você trabalhe primeiro no artigo Olá, Mac , especificamente nas seções Introdução ao Xcode e ao Construtor de Interfaces e Saídas e Ações , pois ele aborda os principais conceitos e técnicas que usaremos neste artigo.
Talvez você queira dar uma olhada na seção Expondo classes/métodos C# a Objective-Cdo documento Internos do Xamarin.Mac também, ele explica os Register
atributos e Export
usados para conectar suas classes C# a Objective-C objetos e elementos de interface do usuário.
Sobre a área restrita do aplicativo
O App Sandbox fornece uma forte defesa contra danos que podem ser causados por um aplicativo malicioso sendo executado em um Mac, limitando o acesso que um aplicativo tem aos recursos do sistema.
Um aplicativo não protegido tem todos os direitos do usuário que está executando o aplicativo e pode acessar ou fazer qualquer coisa que o usuário possa. Se o aplicativo contiver falhas de segurança (ou qualquer estrutura que esteja usando), um hacker poderá explorar esses pontos fracos e usar o aplicativo para assumir o controle do Mac em que está sendo executado.
Ao limitar o acesso aos recursos por aplicativo, um aplicativo em área restrita fornece uma linha de defesa contra roubo, corrupção ou intenção maliciosa por parte de um aplicativo em execução na máquina do usuário.
O App Sandbox é uma tecnologia de controle de acesso integrada ao macOS (imposta no nível do kernel) que fornece uma estratégia dupla:
- O App Sandbox permite que o desenvolvedor descreva como um aplicativo interagirá com o sistema operacional e, dessa forma, recebe apenas os direitos de acesso necessários para realizar o trabalho e nada mais.
- O App Sandbox permite que o usuário conceda mais acesso ao sistema por meio das caixas de diálogo Abrir e Salvar, operações de arrastar e soltar e outras interações comuns do usuário.
Preparando-se para implementar a área restrita do aplicativo
Os elementos da área restrita do aplicativo que serão discutidos em detalhes no artigo são os seguintes:
- Diretórios de contêiner
- Qualificações
- Permissões determinadas pelo usuário
- Separação de privilégios
- Aplicação do kernel
Depois de entender esses detalhes, você poderá criar um plano para adotar a Área Restrita do Aplicativo em seu aplicativo Xamarin.Mac.
Primeiro, você precisará determinar se seu aplicativo é um bom candidato para sandbox (a maioria dos aplicativos é). Em seguida, você precisará resolver quaisquer incompatibilidades de API e determinar quais elementos da Área Restrita do Aplicativo serão necessários. Por fim, analise o uso da Separação de Privilégios para maximizar o nível de defesa do seu aplicativo.
Ao adotar o App Sandbox, alguns locais do sistema de arquivos que seu aplicativo usa serão diferentes. Particularmente, seu aplicativo terá um Diretório de Contêiner que será usado para arquivos de suporte a aplicativos, bancos de dados, caches e quaisquer outros arquivos que não sejam documentos do usuário. O macOS e o Xcode fornecem suporte para migrar esses tipos de arquivos de seus locais herdados para o contêiner.
Início rápido de sandboxing
Nesta seção, criaremos um aplicativo Xamarin.Mac simples que usa um Modo de Exibição da Web (que requer uma conexão de rede restrita em área restrita, a menos que especificamente solicitado) como um exemplo de introdução à Área Restrita do Aplicativo.
Verificaremos se o aplicativo está realmente em área restrita e aprenderemos como solucionar problemas e resolver erros comuns da Área Restrita do Aplicativo.
Criando o projeto Xamarin.Mac
Vamos fazer o seguinte para criar nosso projeto de exemplo:
Inicie o Visual Studio para Mac e clique no link Nova Solução.. .
Na caixa de diálogo Novo projeto, selecione Mac>App>Cocoa App:
Clique no botão Avançar , digite
MacSandbox
o nome do projeto e clique no botão Criar :No Painel de Soluções, clique duas vezes no arquivo Main.storyboard para abri-lo para edição no Xcode:
Arraste um Modo de Exibição da Web para a Janela, dimensione-o para preencher a área de conteúdo e defina-o para aumentar e diminuir com a janela:
Crie uma saída para a visualização da Web chamada
webView
:Retorne ao Visual Studio para Mac e clique duas vezes no arquivo ViewController.cs no Painel de Soluções para abri-lo para edição.
Adicione a seguinte instrução using:
using WebKit;
Faça com que o
ViewDidLoad
método seja semelhante ao seguinte:public override void AwakeFromNib () { base.AwakeFromNib (); webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com"))); }
Salve suas alterações.
Execute seu aplicativo e certifique-se de que o site da Apple seja exibido na janela da seguinte maneira:
Assinando e provisionando o aplicativo
Antes de podermos habilitar a Área Restrita do Aplicativo, primeiro precisamos provisionar e assinar nosso aplicativo Xamarin.Mac.
Vamos fazer o seguinte:
Faça login no Portal do Desenvolvedor da Apple:
Selecione Certificados, Identificadores e Perfis:
Em Aplicativos para Mac, selecione Identificadores:
Crie uma nova ID para o aplicativo:
Em Perfis de Provisionamento, selecione Desenvolvimento:
Crie um novo perfil e selecione Desenvolvimento de aplicativos para Mac:
Selecione o ID do aplicativo que criamos acima:
Selecione os desenvolvedores para este perfil:
Selecione os computadores para este perfil:
Dê um nome ao perfil:
Clique no botão Concluído.
Importante
Em alguns casos, talvez seja necessário baixar o novo Perfil de Provisionamento diretamente do Portal do Desenvolvedor da Apple e clicar duas vezes nele para instalar. Talvez você também precise parar e reiniciar o Visual Studio para Mac antes que ele possa acessar o novo perfil.
Em seguida, precisamos carregar a nova ID do Aplicativo e o Perfil no computador de desenvolvimento. Vamos fazer o seguinte:
Inicie o Xcode e selecione Preferências no menu Xcode :
Clique no botão Exibir detalhes... :
Clique no botão Atualizar (no canto inferior esquerdo).
Clique no botão Concluído .
Em seguida, precisamos selecionar a nova ID do Aplicativo e o Perfil de Provisionamento em nosso projeto Xamarin.Mac. Vamos fazer o seguinte:
No Painel de Soluções, clique duas vezes no arquivo Info.plist para abri-lo para edição.
Certifique-se de que o identificador do pacote corresponda ao nosso ID do aplicativo que criamos acima (exemplo:
com.appracatappra.MacSandbox
):Em seguida, clique duas vezes no arquivo Entitlements.plist e verifique se o Repositório de Chave-Valor do iCloud e os Contêineres do iCloud correspondem ao ID do aplicativo que criamos acima (exemplo:
com.appracatappra.MacSandbox
):Salve suas alterações.
No Painel de Soluções, clique duas vezes no arquivo de projeto para abrir suas Opções de edição:
Selecione Assinatura do Mac e, em seguida, marque Assinar o pacote de aplicativos e Assinar o pacote do instalador. Em Perfil de provisionamento, selecione o que criamos acima:
Clique no botão Concluído.
Importante
Talvez seja necessário sair e reiniciar o Visual Studio para Mac para que ele reconheça a nova ID do Aplicativo e o Perfil de Provisionamento que foram instalados pelo Xcode.
Solução de problemas de provisionamento
Neste ponto, você deve tentar executar o aplicativo e certificar-se de que tudo esteja assinado e provisionado corretamente. Se o aplicativo ainda funcionar como antes, tudo estará bem. Em caso de falha, você pode obter uma caixa de diálogo como a seguinte:
Aqui estão as causas mais comuns de problemas de provisionamento e assinatura:
- A ID do pacote de aplicativos não corresponde à ID do aplicativo do perfil selecionado.
- A ID do desenvolvedor não corresponde à ID do desenvolvedor do perfil selecionado.
- O UUID do Mac que está sendo testado não está registrado como parte do perfil selecionado.
No caso de um problema, corrija o problema no Portal do Desenvolvedor da Apple, atualize os perfis no Xcode e faça um build limpo no Visual Studio para Mac.
Ativar a área restrita do aplicativo
Você habilita o App Sandbox marcando uma caixa de seleção nas opções de seus projetos. Faça o seguinte:
No Painel de Soluções, clique duas vezes no arquivo Entitlements.plist para abri-lo para edição.
Marque Ativar direitos e Ativar sandbox de aplicativos:
Salve suas alterações.
Neste ponto, você habilitou a Área Restrita do Aplicativo, mas não forneceu o acesso de rede necessário para a Exibição da Web. Se você executar o aplicativo agora, deverá obter uma janela em branco:
Verificando se o aplicativo está em área restrita
Além do comportamento de bloqueio de recursos, há três maneiras principais de saber se um aplicativo Xamarin.Mac foi colocado em área restrita com êxito:
No Finder, verifique o
~/Library/Containers/
conteúdo da pasta - Se o aplicativo estiver em sandbox, haverá uma pasta com o nome do identificador de pacote do seu aplicativo (exemplo:com.appracatappra.MacSandbox
):O sistema vê o aplicativo como área restrita no Monitor de Atividade:
- Inicie o Monitor de Atividade (em
/Applications/Utilities
). - Escolha View Columns (Exibir>colunas) e certifique-se de que o item de menu Sandbox esteja marcado.
- Certifique-se de que a coluna Sandbox seja
Yes
lida para seu aplicativo:
- Inicie o Monitor de Atividade (em
Verifique se o binário do aplicativo está em sandbox:
- Inicie o aplicativo Terminal.
- Navegue até o diretório de aplicativos
bin
. - Emita este comando:
codesign -dvvv --entitlements :- executable_path
(ondeexecutable_path
está o caminho para seu aplicativo):
Depurando um aplicativo em área restrita
O depurador se conecta a aplicativos Xamarin.Mac por meio de TCP, o que significa que, por padrão, quando você habilita a área restrita, ele não consegue se conectar ao aplicativo, portanto, se você tentar executar o aplicativo sem as permissões adequadas habilitadas, receberá um erro "Não é possível conectar-se ao depurador".
A permissão Permitir Conexões de Rede de Saída (Cliente) é a necessária para o depurador, habilitar essa permitirá a depuração normalmente. Como você não pode depurar sem ele, atualizamos o CompileEntitlements
destino para msbuild
adicionar automaticamente essa permissão aos direitos de qualquer aplicativo que esteja em área restrita apenas para builds de depuração. As compilações de versão devem usar os direitos especificados no arquivo de direitos, sem modificações.
Resolvendo uma violação do App Sandbox
Uma violação de área restrita do aplicativo ocorrerá se um aplicativo Xamarin.Mac em área restrita tentar acessar um recurso que não foi explicitamente permitido. Por exemplo, nossa Web View não pode mais exibir o site da Apple.
A fonte mais comum de violações da área restrita do aplicativo ocorre quando as configurações de direito especificadas no Visual Studio para Mac não correspondem aos requisitos do aplicativo. Novamente, de volta ao nosso exemplo, os direitos de conexão de rede ausentes que impedem que o Modo de Exibição da Web funcione.
Descobrindo violações do App Sandbox
Se você suspeitar que uma violação da área restrita do aplicativo está ocorrendo em seu aplicativo Xamarin.Mac, a maneira mais rápida de descobrir o problema é usando o aplicativo Console .
Faça o seguinte:
Compile o aplicativo em questão e execute-o no Visual Studio para Mac.
Abra o aplicativo Console (de
/Applications/Utilties/
).Selecione Todas as mensagens na barra lateral e digite
sandbox
na pesquisa:
Para nosso aplicativo de exemplo acima, você pode ver que o Kernal está bloqueando o network-outbound
tráfego por causa do App Sandbox, já que não solicitamos esse direito.
Corrigindo violações do App Sandbox com direitos
Agora que vimos como encontrar violações de sandbox de aplicativos, vamos ver como elas podem ser resolvidas ajustando os direitos do nosso aplicativo.
Faça o seguinte:
No Painel de Soluções, clique duas vezes no arquivo Entitlements.plist para abri-lo para edição.
Na seção Direitos, marque a caixa de seleção Permitir conexões de rede de saída (cliente):
Salve as alterações no aplicativo.
Se fizermos o acima para nosso aplicativo de exemplo e, em seguida, compilá-lo e executá-lo, o conteúdo da Web agora será exibido conforme o esperado.
O App Sandbox em detalhes
Os mecanismos de controle de acesso fornecidos pelo App Sandbox são poucos e fáceis de entender. No entanto, a maneira como a Área Restrita do Aplicativo será adotada por cada aplicativo é exclusiva e baseada nos requisitos do aplicativo.
Dado o seu melhor esforço para proteger seu aplicativo Xamarin.Mac de ser explorado por código mal-intencionado, é necessário haver apenas uma única vulnerabilidade no aplicativo (ou em uma das bibliotecas ou estruturas que ele consome) para obter o controle das interações do aplicativo com o sistema.
O App Sandbox foi projetado para evitar a aquisição (ou limitar os danos que ela pode causar), permitindo que você especifique as interações pretendidas do aplicativo com o sistema. O sistema concederá acesso apenas ao recurso que seu aplicativo requer para realizar seu trabalho e nada mais.
Ao projetar para a Área Restrita do Aplicativo, você está projetando para o pior cenário. Se o aplicativo for comprometido por código mal-intencionado, ele estará limitado a acessar apenas os arquivos e recursos na área restrita do aplicativo.
Direitos e acesso a recursos do sistema
Como vimos acima, um aplicativo Xamarin.Mac que não foi colocado em área restrita recebe todos os direitos e acesso do usuário que está executando o aplicativo. Se comprometido por código malicioso, um aplicativo não protegido pode atuar como um agente para comportamento hostil, com um amplo potencial de causar danos.
Ao habilitar a Área Restrita do Aplicativo, você remove todos, exceto um conjunto mínimo de privilégios, que você habilita novamente somente quando necessário usando os direitos do aplicativo Xamarin.Mac.
Você modifica os recursos de área restrita do aplicativo editando seu arquivo Entitlements.plist e verificando ou selecionando os direitos necessários nas caixas suspensas dos editores:
Diretórios de contêiner e acesso ao sistema de arquivos
Quando seu aplicativo Xamarin.Mac adota a Área Restrita do Aplicativo, ele tem acesso aos seguintes locais:
- O Diretório de Contêiner de Aplicativo – na primeira execução, o sistema operacional cria um Diretório de Contêiner especial para onde vão todos os seus recursos, que somente ele pode acessar. O aplicativo terá acesso total de leitura/gravação a esse diretório.
- Diretórios de Contêiner de Grupo de Aplicativos – seu aplicativo pode receber acesso a um ou mais Contêineres de Grupo compartilhados entre aplicativos no mesmo grupo.
- Arquivos especificados pelo usuário - Seu aplicativo obtém automaticamente acesso a arquivos que são explicitamente abertos ou arrastados e soltos no aplicativo pelo usuário.
- Itens relacionados - Com os direitos apropriados, seu aplicativo pode ter acesso a um arquivo com o mesmo nome, mas com uma extensão diferente. Por exemplo, um documento que foi salvo como um
.txt
arquivo e um.pdf
arquivo . - Diretórios temporários, diretórios de ferramentas de linha de comando e locais legíveis por mundo específicos – seu aplicativo tem vários graus de acesso a arquivos em outros locais bem definidos, conforme especificado pelo sistema.
O diretório do contêiner do aplicativo
O Diretório de Contêiner de Aplicativos de um aplicativo Xamarin.Mac tem as seguintes características:
- Ele está em um local oculto no diretório inicial do usuário (geralmente
~Library/Containers
) e pode ser acessado com aNSHomeDirectory
função (veja abaixo) em seu aplicativo. Como ele está no diretório inicial, cada usuário receberá seu próprio contêiner para o aplicativo. - O aplicativo tem acesso irrestrito de leitura/gravação ao Diretório de Contêiner e a todos os seus subdiretórios e arquivos dentro dele.
- A maioria das APIs de localização de caminho do macOS é relativa ao contêiner do aplicativo. Por exemplo, o contêiner terá sua própria Biblioteca (acessada via
NSLibraryDirectory
), Subdiretórios de Suporte a Aplicativos e Preferências . - O macOS estabelece e impõe a conexão entre um aplicativo e seu contêiner por meio da assinatura de código. Mesmo que outro aplicativo tente falsificar o aplicativo usando seu Identificador de Pacote, ele não poderá acessar o Contêiner devido à assinatura de código.
- O contêiner não é para arquivos gerados pelo usuário. Em vez disso, é para arquivos que seu aplicativo usa, como bancos de dados, caches ou outros tipos específicos de dados.
- Para tipos de aplicativos de caixa de sapatos (como o aplicativo Foto da Apple), o conteúdo do usuário irá para o Contêiner.
Importante
Infelizmente, o Xamarin.Mac ainda não tem 100% de cobertura de API (ao contrário do Xamarin.iOS), como resultado, a NSHomeDirectory
API não foi mapeada na versão atual do Xamarin.Mac.
Como solução temporária, você pode usar o seguinte código:
[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 ();
}
}
O diretório de contêiner do grupo de aplicativos
A partir do Mac macOS 10.7.5 (e superior), um aplicativo pode usar o com.apple.security.application-groups
direito de acessar um contêiner compartilhado comum a todos os aplicativos do grupo. Você pode usar esse contêiner compartilhado para conteúdo não voltado para o usuário, como banco de dados ou outros tipos de arquivos de suporte (como caches).
Os contêineres de grupo são adicionados automaticamente ao contêiner de sandbox de cada aplicativo (se fizerem parte de um grupo) e são armazenados em ~/Library/Group Containers/<application-group-id>
. A ID do Grupo deve começar com sua ID da Equipe de Desenvolvimento e um ponto, por exemplo:
<team-id>.com.company.<group-name>
Para obter mais informações, consulte Adicionando um aplicativo a um grupo de aplicativos na referência de chave de direito.
Acesso ao Powerbox e ao sistema de arquivos fora do contêiner do aplicativo
Um aplicativo Xamarin.Mac em área restrita pode acessar locais do sistema de arquivos fora de seu contêiner das seguintes maneiras:
- Na direção específica do usuário (por meio de Abrir e Salvar Diálogos ou outros métodos, como arrastar e soltar).
- Usando direitos para locais específicos do sistema de arquivos (como
/bin
ou/usr/lib
). - Quando o local do sistema de arquivos está em determinados diretórios que são legíveis por todos (como Compartilhamento).
O Powerbox é a tecnologia de segurança do macOS que interage com o usuário para expandir os direitos de acesso a arquivos do aplicativo Xamarin.Mac em área restrita. O Powerbox não tem API, mas é ativado de forma transparente quando o aplicativo chama um NSOpenPanel
ou NSSavePanel
. O acesso ao Powerbox é habilitado por meio dos Direitos que você definiu para seu aplicativo Xamarin.Mac.
Quando um aplicativo em área restrita exibe uma caixa de diálogo Abrir ou Salvar, a janela é apresentada pelo Powerbox (e não pelo AppKit) e, portanto, tem acesso a qualquer arquivo ou diretório ao qual o usuário tenha acesso.
Quando um usuário seleciona um arquivo ou diretório na caixa de diálogo Abrir ou Salvar (ou arrasta para o ícone do aplicativo), o Powerbox adiciona o caminho associado à área restrita do aplicativo.
Além disso, o sistema permite automaticamente o seguinte para um aplicativo em área restrita:
- Conexão a um método de entrada do sistema.
- Chame serviços selecionados pelo usuário no menu Serviços (somente para serviços marcados como seguros para aplicativos de área restrita pelo provedor de serviços).
- Abrir arquivos escolhidos pelo usuário no menu Abrir recentes .
- Use Copiar & Colar entre outros aplicativos.
- Leia arquivos dos seguintes locais legíveis por todos:
/bin
/sbin
/usr/bin
/usr/lib
/usr/sbin
/usr/share
/System
- Leia e grave arquivos nos diretórios criados pelo
NSTemporaryDirectory
.
Por padrão, os arquivos abertos ou salvos por um aplicativo Xamarin.Mac em área restrita permanecem acessíveis até que o aplicativo seja encerrado (a menos que o arquivo ainda esteja aberto quando o aplicativo for encerrado). Os arquivos abertos serão restaurados automaticamente para a sandbox do aplicativo por meio do recurso macOS Resume na próxima vez que o aplicativo for iniciado.
Para fornecer persistência a arquivos localizados fora do contêiner de um aplicativo Xamarin.Mac, use indicadores com escopo de segurança (veja abaixo).
Itens relacionados
O App Sandbox permite que um aplicativo acesse itens relacionados que têm o mesmo nome de arquivo, mas extensões diferentes. O recurso tem duas partes: a) uma lista de extensões relacionadas no arquivo do Info.plst
aplicativo, b) código para informar à sandbox o que o aplicativo fará com esses arquivos.
Existem dois cenários em que isso faz sentido:
- O aplicativo precisa ser capaz de salvar uma versão diferente do arquivo (com uma nova extensão). Por exemplo, exportar um
.txt
arquivo para um.pdf
arquivo. Para lidar com essa situação, você deve usar aNSFileCoordinator
para acessar o arquivo. Você chamará oWillMove(fromURL, toURL)
método primeiro, moverá o arquivo para a nova extensão e chamaráItemMoved(fromURL, toURL)
. - O aplicativo precisa abrir um arquivo principal com uma extensão e vários arquivos de suporte com extensões diferentes. Por exemplo, um arquivo de filme e legenda. Use um
NSFilePresenter
para obter acesso ao arquivo secundário. Forneça o arquivo principal para aPrimaryPresentedItemURL
propriedade e o arquivo secundário para aPresentedItemURL
propriedade. Quando o arquivo principal for aberto, chame oAddFilePresenter
NSFileCoordinator
método da classe para registrar o arquivo secundário.
Em ambos os cenários, o arquivo Info.plist do aplicativo deve declarar os tipos de documento que o aplicativo pode abrir. Para qualquer tipo de arquivo, adicione o NSIsRelatedItemType
(com um valor de YES
) à sua entrada na CFBundleDocumentTypes
matriz.
Abrir e salvar o comportamento da caixa de diálogo com aplicativos em área restrita
Os seguintes limites são colocados no NSOpenPanel
e NSSavePanel
ao chamá-los de um aplicativo Xamarin.Mac em área restrita:
- Você não pode invocar programaticamente o botão OK .
- Você não pode alterar programaticamente a seleção de um usuário em um
NSOpenSavePanelDelegate
arquivo .
Além disso, as seguintes modificações de herança estão em vigor:
- Aplicativo -
NSOpenPanel
sem área restritaNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel
Indicadores com escopo de segurança e acesso persistente a recursos
Conforme mencionado acima, um aplicativo Xamarin.Mac em área restrita pode acessar um arquivo ou recurso fora de seu contêiner por meio da interação direta do usuário (conforme fornecido pelo PowerBox). No entanto, o acesso a esses recursos não persiste automaticamente entre inicializações de aplicativos ou reinicializações do sistema.
Usando indicadores com escopo de segurança, um aplicativo Xamarin.Mac em área restrita pode preservar a intenção do usuário e manter o acesso a determinados recursos após a reinicialização de um aplicativo.
Tipos de indicadores com escopo de segurança
Ao trabalhar com marcadores com escopo de segurança e acesso persistente a recursos, há dois casos de uso sistine:
Um indicador no escopo do aplicativo fornece acesso persistente a um arquivo ou pasta especificado pelo usuário.
Por exemplo, se o aplicativo Xamarin.Mac em área restrita permitir o uso para abrir um documento externo para edição (usando um
NSOpenPanel
), o aplicativo poderá criar um indicador no escopo do aplicativo para que ele possa acessar o mesmo arquivo novamente no futuro.Um indicador com escopo de documento fornece a um documento específico acesso persistente a um subarquivo.
Por exemplo, um aplicativo de edição de vídeo que cria um arquivo de projeto que tem acesso a imagens, videoclipes e arquivos de som individuais que serão posteriormente combinados em um único filme.
Quando o usuário importa um arquivo de recurso para o projeto (por meio de um NSOpenPanel
), o aplicativo cria um Indicador com Escopo de Documento para o item armazenado no projeto, para que o arquivo esteja sempre acessível ao aplicativo.
Um indicador no escopo do documento pode ser resolvido por qualquer aplicativo que possa abrir os dados do indicador e o próprio documento. Isso suporta portabilidade, permitindo que o usuário envie os arquivos de projeto para outro usuário e faça com que todos os favoritos funcionem para eles também.
Importante
Um Indicador com escopo de documento só pode apontar para um único arquivo e não para uma pasta e esse arquivo não pode estar em um local usado pelo sistema (como /private
ou /Library
).
Usando indicadores com escopo de segurança
O uso de qualquer tipo de indicador com escopo de segurança exige que você execute as seguintes etapas:
- Defina os Direitos apropriados no aplicativo Xamarin.Mac que precisa usar indicadores com escopo de segurança – Para indicadores no escopo do aplicativo, defina a
com.apple.security.files.bookmarks.app-scope
chave de direito comotrue
. Para Indicadores com escopo de documento, defina acom.apple.security.files.bookmarks.document-scope
chave de direito comotrue
. - Criar um indicador com escopo de segurança – você fará isso para qualquer arquivo ou pasta ao qual o usuário tenha fornecido acesso (por exemplo
NSOpenPanel
) ao qual o aplicativo precisará de acesso persistente. Use opublic virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)
NSUrl
método da classe para criar o indicador. - Resolver o indicador com escopo de segurança – quando o aplicativo precisar acessar o recurso novamente (por exemplo, após a reinicialização), ele precisará resolver o indicador para uma URL com escopo de segurança. Use o
public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)
NSUrl
método da classe para resolver o indicador. - Notifique explicitamente o sistema que você deseja acessar o arquivo da URL com escopo de segurança - Esta etapa precisa ser feita imediatamente após obter a URL com escopo de segurança acima ou, quando você quiser recuperar o acesso ao recurso depois de ter renunciado ao acesso a ele. Chame o
StartAccessingSecurityScopedResource ()
NSUrl
método da classe para começar a acessar uma URL com escopo de segurança. - Notifique explicitamente o sistema de que você terminou de acessar o arquivo da URL com escopo de segurança – assim que possível, você deve informar o sistema quando o aplicativo não precisar mais de acesso ao arquivo (por exemplo, se o usuário o fechar). Chame o
StopAccessingSecurityScopedResource ()
NSUrl
método da classe para parar de acessar uma URL com escopo de segurança.
Depois de abrir mão do acesso a um recurso, você precisará retornar à etapa 4 novamente para restabelecer o acesso. Se o aplicativo Xamarin.Mac for reiniciado, você deverá retornar à etapa 3 e resolver novamente o indicador.
Importante
A falha ao liberar o acesso aos recursos de URL com escopo de segurança fará com que um aplicativo Xamarin.Mac vaze recursos do kernel. Como resultado, o aplicativo não poderá mais adicionar locais do sistema de arquivos ao seu contêiner até que seja reiniciado.
A área restrita do aplicativo e a assinatura de código
Depois de habilitar a Área Restrita do Aplicativo e habilitar os requisitos específicos para seu aplicativo Xamarin.Mac (por meio de Direitos), você deve assinar o código do projeto para que a área restrita entre em vigor. Você deve executar a assinatura de código porque os direitos necessários para o App Sandboxing estão vinculados à assinatura do aplicativo.
O macOS impõe um link entre o contêiner de um aplicativo e sua assinatura de código, dessa forma, nenhum outro aplicativo pode acessar esse contêiner, mesmo que esteja falsificando o ID do pacote de aplicativos. Esse mecanismo funciona da seguinte maneira:
- Quando o sistema cria o contêiner do aplicativo, ele define uma lista de controle de acesso (ACL) nesse contêiner. A entrada inicial de controle de acesso na lista contém o DR (Requisito Designado ) do aplicativo, que descreve como as versões futuras do aplicativo podem ser reconhecidas (quando ele tiver sido atualizado).
- Cada vez que um aplicativo com o mesmo ID de pacote é iniciado, o sistema verifica se a assinatura de código do aplicativo corresponde aos requisitos designados especificados em uma das entradas na ACL do contêiner. Se o sistema não encontrar uma correspondência, ele impedirá que o aplicativo seja iniciado.
A assinatura de código funciona das seguintes maneiras:
- Antes de criar o projeto Xamarin.Mac, obtenha um Certificado de Desenvolvimento, um Certificado de Distribuição e um Certificado de ID de Desenvolvedor do Portal do Desenvolvedor da Apple.
- Quando a Mac App Store distribui o aplicativo Xamarin.Mac, ele é assinado com uma assinatura de código da Apple.
Ao testar e depurar, você usará uma versão do aplicativo Xamarin.Mac que você assinou (que será usada para criar o Contêiner de Aplicativo). Posteriormente, se você quiser testar ou instalar a versão da Apple App Store, ela será assinada com a assinatura da Apple e não será iniciada (já que não tem a mesma assinatura de código que o App Container original). Nessa situação, você receberá um relatório de falha semelhante ao seguinte:
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Para corrigir isso, você precisará ajustar a entrada da ACL para apontar para a versão assinada pela Apple do aplicativo.
Para obter mais informações sobre como criar e baixar os Perfis de Provisionamento necessários para Sandboxing, consulte a seção Assinando e Provisionando o Aplicativo acima.
Ajustando a entrada da ACL
Para permitir que a versão assinada pela Apple do aplicativo Xamarin.Mac seja executada, faça o seguinte:
- Abra o aplicativo Terminal (em
/Applications/Utilities
). - Abra uma janela do Finder para a versão assinada pela Apple do aplicativo Xamarin.Mac.
- Digite
asctl container acl add -file
na janela Terminal. - Arraste o ícone do aplicativo Xamarin.Mac da janela do Finder e solte-o na janela Terminal.
- O caminho completo para o arquivo será adicionado ao comando no Terminal.
- Pressione Enter para executar o comando.
A ACL do contêiner agora contém os requisitos de código designados para ambas as versões do aplicativo Xamarin.Mac e o macOS agora permitirá que qualquer uma das versões seja executada.
Exibir uma lista de requisitos de código do ACL
Você pode exibir uma lista dos requisitos de código na ACL de um contêiner fazendo o seguinte:
- Abra o aplicativo Terminal (em
/Applications/Utilities
). - Digite
asctl container acl list -bundle <container-name>
. - Pressione Enter para executar o comando.
Geralmente, <container-name>
é o Identificador de Pacote para o aplicativo Xamarin.Mac.
Criando um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo
Há um fluxo de trabalho comum que deve ser seguido ao criar um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo. Dito isso, as especificidades da implementação de sandboxing em um aplicativo serão exclusivas para a funcionalidade do aplicativo em questão.
Seis etapas para adotar o App Sandbox
A criação de um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo normalmente consiste nas seguintes etapas:
- Determine se o aplicativo é adequado para sandbox.
- Projete uma estratégia de desenvolvimento e distribuição.
- Resolva quaisquer incompatibilidades de API.
- Aplique os Direitos de Área Restrita do Aplicativo necessários ao projeto Xamarin.Mac.
- Adicione separação de privilégios usando XPC.
- Implemente uma estratégia de migração.
Importante
Você deve não apenas colocar em sandbox o executável principal em seu pacote de aplicativos, mas também todos os aplicativos ou ferramentas auxiliares incluídos nesse pacote. Isso é necessário para qualquer aplicativo distribuído da Mac App Store e, se possível, deve ser feito para qualquer outra forma de distribuição de aplicativos.
Para obter uma lista de todos os binários executáveis no pacote de um aplicativo Xamarin.Mac, digite o seguinte comando no Terminal:
find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"
Onde [Your-App-Bundle]
está o nome e o caminho para o pacote do aplicativo.
Determinar se um aplicativo Xamarin.Mac é adequado para área restrita
A maioria dos aplicativos Xamarin.Mac é totalmente compatível com a Área Restrita do Aplicativo e, portanto, adequada para área restrita. Se o aplicativo exigir um comportamento que a Área Restrita do Aplicativo não permite, você deverá considerar uma abordagem alternativa.
Se o seu aplicativo exigir um dos seguintes comportamentos, ele será incompatível com o App Sandbox:
- Serviços de Autorização - Com a Área Restrita do Aplicativo, você não pode trabalhar com as funções descritas na Referência C dos Serviços de Autorização.
- APIs de acessibilidade – você não pode colocar aplicativos assistivos em sandbox, como leitores de tela ou aplicativos que controlam outros aplicativos.
- Enviar eventos da Apple para aplicativos arbitrários - Se o aplicativo exigir o envio de eventos da Apple para um aplicativo desconhecido e arbitrário, ele não poderá ser colocado em área restrita. Para uma lista conhecida de aplicativos chamados, o aplicativo ainda pode ser colocado em área restrita e os Direitos precisarão incluir a lista de aplicativos chamados.
- Enviar dicionários de informações do usuário em notificações distribuídas para outras tarefas - Com a área restrita do aplicativo, você não pode incluir um
userInfo
dicionário ao postar em umNSDistributedNotificationCenter
objeto para enviar mensagens a outras tarefas. - Carregar extensões de kernel - O carregamento de extensões de kernel é proibido pela área restrita do aplicativo.
- Simulando a entrada do usuário em caixas de diálogo Abrir e Salvar - A manipulação programática de caixas de diálogo Abrir ou Salvar para simular ou alterar a entrada do usuário é proibida pela Área Restrita do Aplicativo.
- Acessando ou definindo preferências em outros aplicativos - Manipular as configurações de outros aplicativos é proibido pelo App Sandbox.
- Definindo configurações de rede - A manipulação de configurações de rede é proibida pela área restrita do aplicativo.
- Encerrando outros aplicativos - O App Sandbox proíbe o uso
NSRunningApplication
para encerrar outros aplicativos.
Resolvendo incompatibilidades de API
Ao criar um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo, você pode encontrar incompatibilidades com o uso de algumas APIs do macOS.
Aqui estão alguns problemas comuns e coisas que você pode fazer para resolvê-los:
- Abrir, salvar e rastrear documentos - Se você estiver gerenciando documentos usando qualquer tecnologia diferente
NSDocument
do , deverá alternar para ela devido ao suporte integrado para o App Sandbox.NSDocument
funciona automaticamente com o PowerBox e fornece suporte para manter documentos dentro de sua sandbox se o usuário os mover no Finder. - Reter o acesso aos recursos do sistema de arquivos – se o aplicativo Xamarin.Mac depender do acesso persistente a recursos fora de seu contêiner, use indicadores com escopo de segurança para manter o acesso.
- Criar um item de logon para um aplicativo - Com o App Sandbox, você não pode criar um item de logon usando
LSSharedFileList
nem manipular o estado dos serviços de inicialização usandoLSRegisterURL
. Use aSMLoginItemSetEnabled
função conforme descrito na documentação Adicionando itens de login da Apples usando a estrutura de gerenciamento de serviços. - Acessando dados do usuário - Se você estiver usando funções POSIX, como
getpwuid
obter o diretório inicial do usuário dos serviços de diretório, considere o uso de símbolos Cocoa ou Core Foundation, comoNSHomeDirectory
. - Acessando as preferências de outros aplicativos – como a área restrita do aplicativo direciona as APIs de localização de caminho para o contêiner do aplicativo, a modificação das preferências ocorre dentro desse contêiner e o acesso às preferências de outros aplicativos não é permitido.
- Usando vídeo inserido HTML5 em exibições da Web – se o aplicativo Xamarin.Mac usar o WebKit para reproduzir vídeos HTML5 inseridos, você também deverá vincular o aplicativo à estrutura do AV Foundation. A área restrita do aplicativo impedirá que a CoreMedia reproduza esses vídeos de outra forma.
Aplicando os direitos necessários do App Sandbox
Você precisará editar os Direitos de qualquer aplicativo Xamarin.Mac que deseja executar na Área Restrita do Aplicativo e marcar a caixa de seleção Habilitar Área Restrita do Aplicativo.
Com base na funcionalidade do aplicativo, talvez seja necessário habilitar outros direitos para acessar recursos ou recursos do sistema operacional. O App Sandboxing funciona melhor quando você minimiza os direitos solicitados ao mínimo necessário para executar seu aplicativo, portanto, ative os direitos aleatoriamente.
Para determinar quais direitos um aplicativo Xamarin.Mac exige, faça o seguinte:
- Habilite a Área Restrita do Aplicativo e execute o aplicativo Xamarin.Mac.
- Percorra os recursos do aplicativo.
- Abra o aplicativo Console (disponível em
/Applications/Utilities
) e procuresandboxd
violações no registro de Todas as mensagens . - Para cada
sandboxd
violação, resolva o problema usando o contêiner do aplicativo em vez de outros locais do sistema de arquivos ou aplique os Direitos de Área Restrita do Aplicativo para habilitar o acesso a recursos restritos do sistema operacional. - Execute novamente e teste todos os recursos do aplicativo Xamarin.Mac novamente.
- Repita até que todas as
sandboxd
violações tenham sido resolvidas.
Adicionar separação de privilégios usando XPC
Ao desenvolver um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo, examine os comportamentos do aplicativo em termos de privilégios e acesso e, em seguida, considere separar as operações de alto risco em seus próprios serviços XPC.
Para obter mais informações, consulte o Guia de Criação de Serviços e Daemons e Programação de Serviços XPC da Apple.
Implementar uma estratégia de migração
Se você estiver lançando uma nova versão em área restrita de um aplicativo Xamarin.Mac que não foi colocado em área restrita anteriormente, precisará garantir que os usuários atuais tenham um caminho de atualização suave.
Para obter detalhes sobre como implementar um manifesto de migração de contêiner, leia a documentação Migrando um aplicativo para uma área restrita da Apple.
Resumo
Este artigo examinou detalhadamente a área restrita de um aplicativo Xamarin.Mac. Primeiro, criamos um aplicativo Xamarin.Mac simples para mostrar as noções básicas da Área Restrita do Aplicativo. Em seguida, mostramos como resolver violações de sandbox. Em seguida, examinamos detalhadamente a Área Restrita do Aplicativo e, por fim, examinamos o design de um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo.