Espacio aislado de una aplicación de Xamarin.Mac
En este artículo se describe el espacio aislado de una aplicación de Xamarin.Mac para su lanzamiento en App Store. Abarca todos los elementos que entran en espacio aislado, como directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y cumplimiento del kernel.
Información general
Al trabajar con C# y .NET en una aplicación de Xamarin.Mac, tiene la misma capacidad de espacio aislado de una aplicación que al trabajar con Objective-C o Swift.
En este artículo, trataremos los conceptos básicos de trabajar con espacio aislado en una aplicación de Xamarin.Mac y todos los elementos que entran en espacio aislado: directorios de contenedor, derechos, permisos determinados por el usuario, separación de privilegios y cumplimiento del kernel. Se recomienda encarecidamente trabajar primero en el artículo Hello, Mac , específicamente en las secciones Introducción a Xcode y Generador de interfaces y Salidas y Acciones , ya que trata conceptos clave y técnicas que usaremos en este artículo.
Puede que quiera echar un vistazo a la sección Exponer clases o métodos de C# a Objective-C la sección del documento Xamarin.Mac Internals , también explica los Register
atributos y Export
que se usan para conectar las clases de C# a Objective-C objetos y elementos de la interfaz de usuario.
Acerca del espacio aislado de aplicaciones
El espacio aislado de aplicaciones proporciona una defensa fuerte contra daños que pueden deberse a que una aplicación malintencionada se ejecuta en un Equipo Mac limitando el acceso que una aplicación tiene a los recursos del sistema.
Una aplicación que no es de espacio aislado tiene los derechos completos del usuario que ejecuta la aplicación y puede acceder o hacer cualquier cosa que el usuario pueda. Si la aplicación contiene agujeros de seguridad (o cualquier marco que use), un hacker puede aprovechar esas debilidades y usar la aplicación para tomar el control del Equipo Mac en el que se ejecuta.
Al limitar el acceso a los recursos por aplicación, una aplicación de espacio aislado proporciona una línea de defensa contra el robo, daños o intenciones malintencionadas por parte de una aplicación que se ejecuta en el equipo del usuario.
El espacio aislado de aplicaciones es una tecnología de control de acceso integrada en macOS (aplicada en el nivel de kernel) que proporciona una estrategia bidireccional:
- El espacio aislado de aplicaciones permite al desarrollador describir cómo interactuará una aplicación con el sistema operativo y, de este modo, solo se conceden los derechos de acceso necesarios para realizar el trabajo y ya no.
- El espacio aislado de aplicaciones permite al usuario conceder sin problemas más acceso al sistema a través de los cuadros de diálogo Abrir y Guardar, arrastrar y colocar operaciones y otras interacciones comunes del usuario.
Preparación para implementar el espacio aislado de aplicaciones
Los elementos del espacio aislado de aplicaciones que se tratarán con detalle en el artículo son los siguientes:
- Directorios de contenedor
- Derechos
- Permisos determinados por el usuario
- Separación de privilegios
- Cumplimiento del kernel
Después de comprender estos detalles, podrá crear un plan para adoptar el espacio aislado de aplicaciones en la aplicación Xamarin.Mac.
En primer lugar, deberá determinar si la aplicación es un buen candidato para el espacio aislado (la mayoría de las aplicaciones son). A continuación, deberá resolver cualquier incompatibilidad de API y determinar qué elementos del espacio aislado de la aplicación necesitará. Por último, examine el uso de la separación de privilegios para maximizar el nivel de defensa de la aplicación.
Al adoptar el espacio aislado de la aplicación, algunas ubicaciones del sistema de archivos que usa la aplicación serán diferentes. En particular, la aplicación tendrá un directorio de contenedor que se usará para archivos, bases de datos, memorias caché y cualquier otro archivo que no sea documentos de usuario. Tanto macOS como Xcode proporcionan compatibilidad para migrar este tipo de archivos desde sus ubicaciones heredadas al contenedor.
Inicio rápido de espacio aislado
En esta sección, crearemos una aplicación sencilla de Xamarin.Mac que use una vista web (que requiere una conexión de red restringida en espacio aislado a menos que se solicite específicamente) como ejemplo de introducción al espacio aislado de la aplicación.
Comprobaremos que la aplicación está realmente en espacio aislado y aprenderá a solucionar errores comunes del espacio aislado de aplicaciones.
Creación del proyecto de Xamarin.Mac
Vamos a hacer lo siguiente para crear nuestro proyecto de ejemplo:
Inicie Visual Studio para Mac y haga clic en el vínculo Nueva solución.
En el cuadro de diálogo Nuevo proyecto, seleccione Mac>App>Cocoa App:
Haga clic en el botón Siguiente , escriba
MacSandbox
para el nombre del proyecto y haga clic en el botón Crear :En el Panel de solución, haga doble clic en el archivo Main.storyboard para abrirlo para su edición en Xcode:
Arrastre una vista web a la ventana, establézcala para rellenar el área de contenido y establézcala para crecer y reducirla con la ventana:
Cree una salida para la vista web denominada
webView
:Vuelva a Visual Studio para Mac y haga doble clic en el archivo ViewController.cs del Panel de solución para abrirlo para su edición.
Agregue la siguiente instrucción using:
using WebKit;
Haga que el
ViewDidLoad
método tenga un aspecto similar al siguiente:public override void AwakeFromNib () { base.AwakeFromNib (); webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com"))); }
Guarde los cambios.
Ejecute la aplicación y asegúrese de que el sitio web de Apple se muestra en la ventana de la siguiente manera:
Firma y aprovisionamiento de la aplicación
Para poder habilitar el espacio aislado de aplicaciones, primero necesitamos aprovisionar y firmar nuestra aplicación de Xamarin.Mac.
Haga lo siguiente:
Inicie sesión en el Portal para desarrolladores de Apple:
Seleccione Certificados, identificadores y perfiles:
En Aplicaciones de Mac, seleccione Identificadores:
Cree un identificador para la aplicación:
En Perfiles de aprovisionamiento, seleccione Desarrollo:
Cree un nuevo perfil y seleccione Desarrollo de aplicaciones para Mac:
Seleccione el identificador de aplicación que hemos creado anteriormente:
Seleccione los desarrolladores para este perfil:
Seleccione los equipos de este perfil:
Asigne un nombre al perfil:
Haga clic en el botón Listo.
Importante
En algunos casos, es posible que tenga que descargar el nuevo perfil de aprovisionamiento desde el Portal para desarrolladores de Apple directamente y hacer doble clic en él para instalarlo. También es posible que tenga que detener y reiniciar Visual Studio para Mac antes de poder acceder al nuevo perfil.
A continuación, es necesario cargar el nuevo id. de aplicación y perfil en la máquina de desarrollo. Hagamos lo siguiente:
Inicie Xcode y seleccione Preferencias en el menú Xcode:
Haga clic en el botón Ver detalles... :
Haga clic en el botón Actualizar (en la esquina inferior izquierda).
Haga clic en el botón Listo .
A continuación, es necesario seleccionar el nuevo identificador de aplicación y el perfil de aprovisionamiento en nuestro proyecto de Xamarin.Mac. Hagamos lo siguiente:
En el Panel de solución, haga doble clic en el archivo Info.plist para abrirlo para su edición.
Asegúrese de que el identificador de agrupación coincide con el identificador de aplicación que hemos creado anteriormente (ejemplo:
com.appracatappra.MacSandbox
):A continuación, haga doble clic en el archivo Entitlements.plist y asegúrese de que nuestro almacén de clave-valor de iCloud y los contenedores de iCloud coinciden con nuestro identificador de aplicación que hemos creado anteriormente (ejemplo:
com.appracatappra.MacSandbox
):Guarde los cambios.
En el Panel de solución, haga doble clic en el archivo del proyecto para abrir sus opciones para editar:
Seleccione Firma de Mac y, a continuación, marque Firmar el paquete de aplicaciones y Firme el paquete del instalador. En Perfil de aprovisionamiento, seleccione el que hemos creado anteriormente:
Haga clic en el botón Listo.
Importante
Es posible que tenga que salir y reiniciar Visual Studio para Mac para que reconozca el nuevo identificador de aplicación y el perfil de aprovisionamiento instalado por Xcode.
Solución de problemas de aprovisionamiento
En este momento, debe intentar ejecutar la aplicación y asegurarse de que todo está firmado y aprovisionado correctamente. Si la aplicación sigue funcionando como antes, todo es bueno. En caso de error, puede obtener un cuadro de diálogo como el siguiente:
Estas son las causas más comunes de los problemas de aprovisionamiento y firma:
- El id. de agrupación de aplicaciones no coincide con el identificador de aplicación del perfil seleccionado.
- El identificador de desarrollador no coincide con el identificador de desarrollador del perfil seleccionado.
- El UUID del equipo Mac en el que se está probando no está registrado como parte del perfil seleccionado.
En el caso de un problema, corrija el problema en el Portal para desarrolladores de Apple, actualice los perfiles en Xcode y realice una compilación limpia en Visual Studio para Mac.
Habilitación del espacio aislado de la aplicación
Para habilitar el espacio aislado de aplicaciones, active una casilla en las opciones de los proyectos. Haga lo siguiente:
En el Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.
Active Enable Entitlements (Habilitar derechos) y Enable App Sandboxing (Habilitar espacios aislados de aplicaciones):
Guarde los cambios.
En este momento, ha habilitado el espacio aislado de aplicaciones, pero no ha proporcionado el acceso de red necesario para la vista web. Si ejecuta la aplicación ahora, debería obtener una ventana en blanco:
Comprobación de que la aplicación está en espacio aislado
Aparte del comportamiento de bloqueo de recursos, hay tres maneras principales de indicar si una aplicación de Xamarin.Mac se ha aislado correctamente:
En Finder, compruebe el contenido de la
~/Library/Containers/
carpeta : si la aplicación está en espacio aislado, habrá una carpeta denominada identificador de paquete de la aplicación (por ejemplo:com.appracatappra.MacSandbox
):El sistema ve la aplicación como espacio aislado en el Monitor de actividad:
- Inicie el Monitor de actividad (en
/Applications/Utilities
). - Elija Ver>columnas y asegúrese de que el elemento de menú Espacio aislado está activado.
- Asegúrese de que la columna Espacio aislado lee
Yes
para la aplicación:
- Inicie el Monitor de actividad (en
Compruebe que el binario de la aplicación está en espacio aislado:
- Inicie la aplicación Terminal.
- Vaya al directorio de aplicaciones
bin
. - Emita este comando:
codesign -dvvv --entitlements :- executable_path
(dondeexecutable_path
es la ruta de acceso a la aplicación):
Depuración de una aplicación de espacio aislado
El depurador se conecta a aplicaciones de Xamarin.Mac a través de TCP, lo que significa que, de forma predeterminada, al habilitar el espacio aislado, no se puede conectar a la aplicación, por lo que si intenta ejecutar la aplicación sin los permisos adecuados habilitados, aparece un error "No se puede conectar al depurador".
El permiso Allow Outgoing Network Conectar ions (Client) es el necesario para el depurador, lo que permite la depuración normalmente. Puesto que no se puede depurar sin él, hemos actualizado el CompileEntitlements
destino para msbuild
agregar automáticamente ese permiso a los derechos de cualquier aplicación que esté en espacio aislado solo para las compilaciones de depuración. Las compilaciones de versión deben usar los derechos especificados en el archivo de derechos, sin modificar.
Resolución de una infracción del espacio aislado de aplicaciones
Una infracción de espacio aislado de aplicaciones se produce si una aplicación de Xamarin.Mac de espacio aislado intentó acceder a un recurso que no se ha permitido explícitamente. Por ejemplo, nuestra vista web ya no puede mostrar el sitio web de Apple.
El origen más común de infracciones del espacio aislado de aplicaciones se produce cuando la configuración de derechos especificada en Visual Studio para Mac no coincide con los requisitos de la aplicación. De nuevo, en nuestro ejemplo, faltan derechos de red Conectar ion que impiden que la vista web funcione.
Detección de infracciones del espacio aislado de aplicaciones
Si sospecha que se está produciendo una infracción del espacio aislado de aplicaciones en la aplicación de Xamarin.Mac, la forma más rápida de detectar el problema es mediante la aplicación consola .
Haga lo siguiente:
Compile la aplicación en cuestión y ejecútelo desde Visual Studio para Mac.
Abra la aplicación Consola (desde
/Applications/Utilties/
).Seleccione Todos los mensajes en la barra lateral y escriba
sandbox
en la búsqueda:
Para nuestra aplicación de ejemplo anterior, puede ver que Kernal está bloqueando el network-outbound
tráfico debido al espacio aislado de la aplicación, ya que no hemos solicitado ese derecho.
Corrección de infracciones del espacio aislado de aplicaciones con derechos
Ahora que hemos visto cómo encontrar infracciones de espacio aislado de aplicaciones, veamos cómo se pueden resolver ajustando los derechos de la aplicación.
Haga lo siguiente:
En el Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.
En la sección Derechos, active la casilla Permitir red saliente Conectar ions (cliente):
Guarde los cambios en la aplicación.
Si hacemos lo anterior para nuestra aplicación de ejemplo, compile y ejecútelo, el contenido web se mostrará ahora según lo previsto.
Espacio aislado de aplicaciones en profundidad
Los mecanismos de control de acceso proporcionados por el espacio aislado de aplicaciones son pocos y fáciles de entender. Sin embargo, la manera en que cada aplicación adoptará el espacio aislado de aplicaciones es única y se basa en los requisitos de la aplicación.
Dado el mejor esfuerzo para proteger la aplicación de Xamarin.Mac de ser explotada por código malintencionado, solo es necesario que haya una única vulnerabilidad en la aplicación (o en una de las bibliotecas o marcos que consume) para obtener el control de las interacciones de la aplicación con el sistema.
El espacio aislado de aplicaciones se diseñó para evitar la adquisición (o limitar el daño que puede causar) al permitirle especificar las interacciones previstas de la aplicación con el sistema. El sistema solo concederá acceso al recurso que requiere la aplicación para realizar su trabajo y nada más.
Al diseñar para el espacio aislado de aplicaciones, está diseñando para un escenario peor. Si la aplicación se ve comprometida por código malintencionado, se limita a acceder solo a los archivos y recursos del espacio aislado de la aplicación.
Derechos y acceso a recursos del sistema
Como vimos anteriormente, se concede a una aplicación de Xamarin.Mac que no se ha aislado los derechos completos y el acceso del usuario que ejecuta la aplicación. Si está en peligro por código malintencionado, una aplicación no protegida puede actuar como agente para un comportamiento hostil, con una amplia gama de posibilidades para hacer daño.
Al habilitar el espacio aislado de la aplicación, se quitan todos los privilegios, pero un conjunto mínimo de privilegios, que después se vuelven a habilitar solo con los derechos de la aplicación de Xamarin.Mac.
Para modificar los recursos del espacio aislado de aplicaciones de la aplicación, edite su archivo Entitlements.plist y active o seleccione los derechos necesarios en los cuadros desplegables de editores:
Directorios de contenedor y acceso al sistema de archivos
Cuando la aplicación de Xamarin.Mac adopta el espacio aislado de aplicaciones, tiene acceso a las siguientes ubicaciones:
- El directorio contenedor de aplicaciones: en la primera ejecución, el sistema operativo crea un directorio de contenedor especial donde todos sus recursos van, a los que solo puede acceder. La aplicación tendrá acceso completo de lectura y escritura a este directorio.
- Directorios de contenedor del grupo de aplicaciones: se puede conceder acceso a la aplicación a uno o varios contenedores de grupo que se comparten entre las aplicaciones del mismo grupo.
- Archivos especificados por el usuario: la aplicación obtiene automáticamente acceso a los archivos que se abren o arrastran y quitan explícitamente en la aplicación por parte del usuario.
- Elementos relacionados: con los derechos adecuados, la aplicación puede tener acceso a un archivo con el mismo nombre, pero una extensión diferente. Por ejemplo, un documento que se ha guardado como un
.txt
archivo y un.pdf
. - Directorios temporales, directorios de herramientas de línea de comandos y ubicaciones específicas legibles en el mundo: la aplicación tiene distintos grados de acceso a los archivos en otras ubicaciones bien definidas según lo especificado por el sistema.
El directorio del contenedor de aplicaciones
Un directorio contenedor de aplicaciones de Xamarin.Mac tiene las siguientes características:
- Se encuentra en una ubicación oculta en el directorio Inicio del usuario (normalmente
~Library/Containers
) y se puede acceder a ella con la función (consulte a continuación) dentro de laNSHomeDirectory
aplicación. Dado que está en el directorio Inicio, cada usuario obtendrá su propio contenedor para la aplicación. - La aplicación tiene acceso de lectura y escritura sin restricciones al directorio contenedor y a todos sus subdirectorios y archivos dentro de ella.
- La mayoría de las API de búsqueda de rutas de macOS son relativas al contenedor de la aplicación. Por ejemplo, el contenedor tendrá su propia biblioteca (a la que se accede a través
NSLibraryDirectory
de ), subdirectorios compatibilidad de aplicaciones y preferencias . - macOS establece y aplica la conexión entre y la aplicación y su contenedor a través de la firma de código. Incluso es otra aplicación que intenta suplantar la aplicación mediante su identificador de agrupación, no podrá acceder al contenedor debido a la firma de código.
- El contenedor no es para los archivos generados por el usuario. En su lugar, es para los archivos que la aplicación usa, como bases de datos, memorias caché u otros tipos específicos de datos.
- En el caso de los tipos de zapatillas de aplicaciones (como la aplicación Photo de Apple), el contenido del usuario pasará al contenedor.
Importante
Desafortunadamente, Xamarin.Mac aún no tiene cobertura de API del 100 % (a diferencia de Xamarin.iOS), como resultado, la NSHomeDirectory
API no se ha asignado en la versión actual de Xamarin.Mac.
Como solución alternativa temporal, puede usar el código siguiente:
[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 ();
}
}
Directorio de contenedor del grupo de aplicaciones
A partir de Mac macOS 10.7.5 (y versiones posteriores), una aplicación puede usar el com.apple.security.application-groups
derecho de acceder a un contenedor compartido que es común a todas las aplicaciones del grupo. Puede usar este contenedor compartido para contenido no orientado al usuario, como la base de datos u otros tipos de archivos de soporte técnico (como cachés).
Los contenedores de grupo se agregan automáticamente al contenedor de espacio aislado de cada aplicación (si forman parte de un grupo) y se almacenan en ~/Library/Group Containers/<application-group-id>
. El identificador de grupo debe comenzar con el identificador del equipo de desarrollo y un período, por ejemplo:
<team-id>.com.company.<group-name>
Para obtener más información, consulte Agregar una aplicación a un grupo de aplicaciones en referencia de clave de derechos.
Acceso al sistema de archivos y Powerbox fuera del contenedor de aplicaciones
Una aplicación de Xamarin.Mac de espacio aislado puede acceder a ubicaciones del sistema de archivos fuera de su contenedor de las siguientes maneras:
- En la dirección específica del usuario (a través de Abrir y guardar diálogos u otros métodos como arrastrar y colocar).
- Mediante el uso de derechos para ubicaciones específicas del sistema de archivos (como
/bin
o/usr/lib
). - Cuando la ubicación del sistema de archivos está en determinados directorios que son legibles en el mundo (por ejemplo, compartir).
Powerbox es la tecnología de seguridad de macOS que interactúa con el usuario para expandir los derechos de acceso a archivos de la aplicación de Xamarin.Mac en espacio aislado. Powerbox no tiene ninguna API, pero se activa de forma transparente cuando la aplicación llama a o NSOpenPanel
NSSavePanel
. El acceso a Powerbox está habilitado a través de los derechos establecidos para la aplicación Xamarin.Mac.
Cuando una aplicación de espacio aislado muestra un cuadro de diálogo Abrir o Guardar, Powerbox (y no AppKit) presenta la ventana y, por tanto, tiene acceso a cualquier archivo o directorio al que el usuario tenga acceso.
Cuando un usuario selecciona un archivo o directorio en el cuadro de diálogo Abrir o Guardar (o arrastra al icono de la aplicación), Powerbox agrega la ruta de acceso asociada al espacio aislado de la aplicación.
Además, el sistema permite automáticamente lo siguiente a una aplicación de espacio aislado:
- Conectar a un método de entrada del sistema.
- Llame a los servicios seleccionados por el usuario en el menú Servicios (solo para los servicios marcados como seguros para las aplicaciones de espacio aislado por el proveedor de servicios).
- Abra los archivos que elija el usuario en el menú Abrir reciente .
- Use Copiar y pegar entre otras aplicaciones.
- Leer archivos de las siguientes ubicaciones legibles del mundo:
/bin
/sbin
/usr/bin
/usr/lib
/usr/sbin
/usr/share
/System
- Leer y escribir archivos en los directorios creados por
NSTemporaryDirectory
.
De forma predeterminada, los archivos abiertos o guardados por una aplicación de Xamarin.Mac en espacio aislado permanecen accesibles hasta que finaliza la aplicación (a menos que el archivo todavía esté abierto cuando se cierre la aplicación). Los archivos abiertos se restaurarán automáticamente en el espacio aislado de la aplicación a través de la característica reanudación de macOS la próxima vez que se inicie la aplicación.
Para proporcionar persistencia a los archivos ubicados fuera de un contenedor de la aplicación de Xamarin.Mac, use marcadores con ámbito de seguridad (consulte a continuación).
Elementos relacionados
El espacio aislado de aplicaciones permite a una aplicación acceder a los elementos relacionados que tienen el mismo nombre de archivo, pero extensiones diferentes. La característica tiene dos partes: a) una lista de extensiones relacionadas en el archivo de Info.plst
la aplicación, b) código para indicar al espacio aislado qué hará la aplicación con estos archivos.
Hay dos escenarios en los que esto tiene sentido:
- La aplicación debe poder guardar una versión diferente del archivo (con una nueva extensión). Por ejemplo, exportar un
.txt
archivo a un.pdf
archivo. Para controlar esta situación, debe usar paraNSFileCoordinator
acceder al archivo. Primero llamará alWillMove(fromURL, toURL)
método , moverá el archivo a la nueva extensión y, a continuación, llamará aItemMoved(fromURL, toURL)
. - La aplicación debe abrir un archivo principal con una extensión y varios archivos auxiliares con diferentes extensiones. Por ejemplo, un archivo Movie y un subtítulo. Use para
NSFilePresenter
obtener acceso al archivo secundario. Proporcione el archivo principal a laPrimaryPresentedItemURL
propiedad y al archivo secundario a laPresentedItemURL
propiedad . Cuando se abra el archivo principal, llame alAddFilePresenter
método de laNSFileCoordinator
clase para registrar el archivo secundario.
En ambos escenarios, el archivo Info.plist de la aplicación debe declarar los tipos de documento que la aplicación puede abrir. Para cualquier tipo de archivo, agregue NSIsRelatedItemType
(con un valor de YES
) a su entrada en la CFBundleDocumentTypes
matriz.
Comportamiento del cuadro de diálogo Abrir y guardar con aplicaciones de espacio aislado
Los límites siguientes se colocan en y NSOpenPanel
NSSavePanel
al llamarlos desde una aplicación de Xamarin.Mac de espacio aislado:
- No se puede invocar mediante programación el botón Aceptar .
- No se puede modificar mediante programación la selección de un usuario en .
NSOpenSavePanelDelegate
Además, se aplican las siguientes modificaciones de herencia:
- Aplicación sin espacio aislado -
NSOpenPanel
NSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel
Marcadores con ámbito de seguridad y acceso a recursos persistentes
Como se indicó anteriormente, una aplicación de Xamarin.Mac con espacio aislado puede acceder a un archivo o recurso fuera de su contenedor mediante la interacción directa del usuario (según lo proporcionado por PowerBox). Sin embargo, el acceso a estos recursos no se conserva automáticamente en los inicios de la aplicación ni en los reinicios del sistema.
Mediante el uso de marcadores con ámbito de seguridad, una aplicación de Xamarin.Mac de espacio aislado puede conservar la intención del usuario y mantener el acceso a recursos dados después de reiniciar una aplicación.
Tipos de marcador con ámbito de seguridad
Al trabajar con marcadores con ámbito de seguridad y acceso a recursos persistentes, hay dos casos de uso sistines:
Un marcador con ámbito de aplicación proporciona acceso persistente a un archivo o carpeta especificados por el usuario.
Por ejemplo, si la aplicación de Xamarin.Mac de espacio aislado permite abrir un documento externo para su edición (mediante un
NSOpenPanel
), la aplicación puede crear un marcador con ámbito de aplicación para que pueda acceder de nuevo al mismo archivo en el futuro.Un marcador con ámbito de documento proporciona un acceso persistente de documento específico a un subproceso.
Por ejemplo, una aplicación de edición de vídeo que crea un archivo de proyecto que tiene acceso a las imágenes individuales, clips de vídeo y archivos de sonido que se combinarán más adelante en una sola película.
Cuando el usuario importa un archivo de recursos en el proyecto (a través de ), NSOpenPanel
la aplicación crea un marcador con ámbito de documento para el elemento almacenado en el proyecto, de modo que el archivo siempre sea accesible para la aplicación.
Cualquier aplicación que pueda abrir los datos del marcador y el propio documento pueden resolver un marcador con ámbito de documento. Esto admite la portabilidad, lo que permite al usuario enviar los archivos del proyecto a otro usuario y hacer que todos los marcadores también funcionen para ellos.
Importante
Un marcador con ámbito de documento solo puede apuntar a un único archivo y no a una carpeta y ese archivo no puede estar en una ubicación usada por el sistema (como /private
o /Library
).
Uso de marcadores con ámbito de seguridad
El uso de cualquiera de los tipos de marcador con ámbito de seguridad requiere que realice los pasos siguientes:
- Establezca los derechos adecuados en la aplicación de Xamarin.Mac que necesita usar Marcadores con ámbito de seguridad: para marcadores con ámbito de aplicación, establezca la
com.apple.security.files.bookmarks.app-scope
clave de derecho entrue
. En Marcadores con ámbito de documento, establezca lacom.apple.security.files.bookmarks.document-scope
clave de derecho entrue
. - Crear un marcador con ámbito de seguridad: lo hará para cualquier archivo o carpeta al que el usuario haya proporcionado acceso (por
NSOpenPanel
ejemplo), a la que la aplicación necesitará acceso persistente. Use elpublic virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)
método de laNSUrl
clase para crear el marcador. - Resolver el marcador con ámbito de seguridad: cuando la aplicación necesite acceder al recurso de nuevo (por ejemplo, después del reinicio), tendrá que resolver el marcador en una dirección URL con ámbito de seguridad. Use el
public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)
método de laNSUrl
clase para resolver el marcador. - Notifique explícitamente al sistema que desea acceder al archivo desde la dirección URL con ámbito de seguridad: este paso debe realizarse inmediatamente después de obtener la dirección URL con ámbito de seguridad anterior o, cuando más adelante quiera recuperar el acceso al recurso después de haber renunciado al acceso a él. Llame al
StartAccessingSecurityScopedResource ()
método de laNSUrl
clase para empezar a acceder a una dirección URL con ámbito de seguridad. - Notifique explícitamente al sistema que ha terminado de acceder al archivo desde la dirección URL con ámbito de seguridad: lo antes posible, debe informar al sistema cuando la aplicación ya no necesite acceso al archivo (por ejemplo, si el usuario lo cierra). Llame al
StopAccessingSecurityScopedResource ()
método de laNSUrl
clase para dejar de acceder a una dirección URL con ámbito de seguridad.
Después de renunciar al acceso a un recurso, deberá volver al paso 4 para volver a establecer el acceso. Si se reinicia la aplicación Xamarin.Mac, debe volver al paso 3 y volver a resolver el marcador.
Importante
Si no se libera el acceso a los recursos de dirección URL con ámbito de seguridad, una aplicación de Xamarin.Mac perderá los recursos del kernel. Como resultado, la aplicación ya no podrá agregar ubicaciones del sistema de archivos a su contenedor hasta que se reinicie.
Espacio aislado de aplicaciones y firma de código
Después de habilitar el espacio aislado de aplicaciones y habilitar los requisitos específicos de la aplicación de Xamarin.Mac (a través de derechos), debe firmar el proyecto para que el espacio aislado surta efecto. Debe realizar la firma de código porque los derechos necesarios para el espacio aislado de aplicaciones están vinculados a la firma de la aplicación.
macOS aplica un vínculo entre el contenedor de una aplicación y su firma de código, de esta manera ninguna otra aplicación puede acceder a ese contenedor, incluso si suplanta el identificador de lote de aplicaciones. Este mecanismo funciona de la siguiente manera:
- Cuando el sistema crea el contenedor de la aplicación, establece una lista de control de acceso (ACL) en ese contenedor. La entrada de control de acceso inicial de la lista contiene el requisito designado (DR) de la aplicación, que describe cómo se pueden reconocer las versiones futuras de la aplicación (cuando se ha actualizado).
- Cada vez que se inicia una aplicación con el mismo identificador de agrupación, el sistema comprueba que la firma de código de la aplicación coincide con los requisitos designados especificados en una de las entradas de la ACL del contenedor. Si el sistema no encuentra una coincidencia, impide que la aplicación se inicie.
La firma de código funciona de las maneras siguientes:
- Antes de crear el proyecto de Xamarin.Mac, obtenga un certificado de desarrollo, un certificado de distribución y un certificado de identificador de desarrollador desde el Portal para desarrolladores de Apple.
- Cuando Mac App Store distribuye la aplicación Xamarin.Mac, se firma con una firma de código de Apple.
Al probar y depurar, usará una versión de la aplicación de Xamarin.Mac que firmó (que se usará para crear el contenedor de aplicaciones). Más adelante, si desea probar o instalar la versión desde apple App Store, se firmará con la firma de Apple y no se podrá iniciar (ya que no tiene la misma firma de código que el contenedor de aplicaciones original). En esta situación, obtendrá un informe de bloqueo similar al siguiente:
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Para corregirlo, deberá ajustar la entrada de ACL para que apunte a la versión firmada de Apple de la aplicación.
Para obtener más información sobre cómo crear y descargar los perfiles de aprovisionamiento necesarios para el espacio aislado, consulte la sección Firma y aprovisionamiento de la aplicación anterior.
Ajuste de la entrada de ACL
Para permitir que se ejecute la versión firmada de Apple de la aplicación Xamarin.Mac, haga lo siguiente:
- Abra la aplicación Terminal (en
/Applications/Utilities
). - Abra una ventana de Finder en la versión firmada de Apple de la aplicación Xamarin.Mac.
- Escriba
asctl container acl add -file
en la ventana Terminal. - Arrastre el icono de la aplicación de Xamarin.Mac desde la ventana Finder y colóquelo en la ventana Terminal.
- La ruta de acceso completa al archivo se agregará al comando en Terminal.
- Presione Entrar para ejecutar el comando.
La ACL del contenedor ahora contiene los requisitos de código designados para ambas versiones de la aplicación Xamarin.Mac y macOS ahora permitirá que se ejecute cualquiera de las versiones.
Mostrar una lista de requisitos de código de ACL
Puede ver una lista de los requisitos de código en la ACL de un contenedor haciendo lo siguiente:
- Abra la aplicación Terminal (en
/Applications/Utilities
). - Escriba
asctl container acl list -bundle <container-name>
. - Presione Entrar para ejecutar el comando.
<container-name>
normalmente es el identificador de agrupación de la aplicación Xamarin.Mac.
Diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones
Hay un flujo de trabajo común que debe seguirse al diseñar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones. Dicho esto, los detalles de la implementación de espacio aislado en una aplicación serán únicos para la funcionalidad de la aplicación determinada.
Seis pasos para adoptar el espacio aislado de aplicaciones
El diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones normalmente consta de los pasos siguientes:
- Determine si la aplicación es adecuada para el espacio aislado.
- Diseñar una estrategia de desarrollo y distribución.
- Resuelva las incompatibilidades de la API.
- Aplique los derechos de espacio aislado de aplicaciones necesarios al proyecto de Xamarin.Mac.
- Agregue la separación de privilegios mediante XPC.
- Implementar una estrategia de migración.
Importante
No solo debe espacio aislado del archivo ejecutable principal de la agrupación de aplicaciones, sino también todas las aplicaciones auxiliares o herramientas incluidas de ese conjunto. Esto es necesario para cualquier aplicación distribuida desde Mac App Store y, si es posible, debe realizarse para cualquier otra forma de distribución de aplicaciones.
Para obtener una lista de todos los archivos binarios ejecutables de una agrupación de aplicaciones de Xamarin.Mac, escriba el siguiente comando en Terminal:
find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"
Donde [Your-App-Bundle]
es el nombre y la ruta de acceso al paquete de la aplicación.
Determinar si una aplicación de Xamarin.Mac es adecuada para el espacio aislado
La mayoría de las aplicaciones de Xamarin.Mac son totalmente compatibles con el espacio aislado de aplicaciones y, por tanto, son adecuadas para el espacio aislado. Si la aplicación requiere un comportamiento que el espacio aislado de aplicaciones no permite, debe considerar un enfoque alternativo.
Si la aplicación requiere uno de los siguientes comportamientos, no es compatible con el espacio aislado de la aplicación:
- Servicios de autorización: con el espacio aislado de la aplicación, no puede trabajar con las funciones descritas en Referencia de C de servicios de autorización.
- API de accesibilidad: no se pueden usar aplicaciones de asistencia de espacio aislado, como lectores de pantalla o aplicaciones que controlan otras aplicaciones.
- Enviar eventos de Apple a aplicaciones arbitrarias: si la aplicación requiere el envío de eventos de Apple a una aplicación desconocida y arbitraria, no puede estar en espacio aislado. Para obtener una lista conocida de aplicaciones denominadas, la aplicación todavía puede estar en espacio aislado y los derechos deberán incluir la lista de aplicaciones llamada.
- Enviar diccionarios de información de usuario en notificaciones distribuidas a otras tareas : con el espacio aislado de la aplicación, no puede incluir un
userInfo
diccionario al publicar en unNSDistributedNotificationCenter
objeto para mensajería de otras tareas. - Cargar extensiones de kernel: la carga de extensiones de kernel está prohibida por el espacio aislado de la aplicación.
- Simulación de la entrada de usuario en cuadros de diálogo abrir y guardar: la manipulación mediante programación de diálogos Abrir o Guardar para simular o modificar la entrada del usuario está prohibida por el espacio aislado de la aplicación.
- Acceso o configuración de preferencias en otras aplicaciones : la manipulación de la configuración de otras aplicaciones está prohibida por el espacio aislado de la aplicación.
- Configurar Configuración de red: la manipulación de Configuración de red está prohibida por el espacio aislado de la aplicación.
- Terminación de otras aplicaciones : el espacio aislado de aplicaciones prohíbe el uso
NSRunningApplication
de para finalizar otras aplicaciones.
Resolución de incompatibilidades de API
Al diseñar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones, es posible que encuentre incompatibilidades con el uso de algunas API de macOS.
Estos son algunos problemas comunes y cosas que puede hacer para resolverlos:
- Abrir, guardar y realizar un seguimiento de documentos : si administra documentos con cualquier tecnología distinta
NSDocument
de , debe cambiar a él debido a la compatibilidad integrada con el espacio aislado de aplicaciones.NSDocument
funciona automáticamente con PowerBox y proporciona compatibilidad para mantener los documentos dentro del espacio aislado si el usuario los mueve en Finder. - Conservar el acceso a los recursos del sistema de archivos: si la aplicación Xamarin.Mac depende del acceso persistente a los recursos fuera de su contenedor, use marcadores con ámbito de seguridad para mantener el acceso.
- Crear un elemento de inicio de sesión para una aplicación : con el espacio aislado de la aplicación, no puede crear un elemento de inicio de sesión mediante
LSSharedFileList
ni puede manipular el estado de los servicios de inicio medianteLSRegisterURL
. Use laSMLoginItemSetEnabled
función tal y como se describe en Apples Adding Login Items Using the Service Management Framework documentation (Agregar elementos de inicio de sesión mediante la documentación de Service Management Framework ). - Acceso a datos de usuario: si usa funciones POSIX como
getpwuid
para obtener el directorio principal del usuario de los servicios de directorio, considere la posibilidad de usar símbolos de Cocoa o Core Foundation comoNSHomeDirectory
. - Acceso a las preferencias de otras aplicaciones : dado que el espacio aislado de aplicaciones dirige las API de búsqueda de rutas de acceso al contenedor de la aplicación, la modificación de las preferencias tiene lugar dentro de ese contenedor y el acceso a otras preferencias de aplicaciones en no permitidas.
- Usar vídeo insertado HTML5 en vistas web: si la aplicación de Xamarin.Mac usa WebKit para reproducir vídeos HTML5 incrustados, también debe vincular la aplicación con el marco de AV Foundation. El espacio aislado de la aplicación impedirá que CoreMedia reproduzca estos vídeos de otro modo.
Aplicación de derechos de espacio aislado de aplicaciones requeridos
Tendrá que editar los derechos de cualquier aplicación de Xamarin.Mac que quiera ejecutar en el espacio aislado de la aplicación y activar la casilla Habilitar espacio aislado de aplicaciones .
En función de la funcionalidad de la aplicación, es posible que tenga que habilitar otros derechos para acceder a las características o recursos del sistema operativo. El espacio aislado de aplicaciones funciona mejor cuando se minimizan los derechos que solicita al mínimo necesario para ejecutar la aplicación, por lo que solo se habilitan los derechos de forma aleatoria.
Para determinar qué derechos requiere una aplicación de Xamarin.Mac, haga lo siguiente:
- Habilite el espacio aislado de aplicaciones y ejecute la aplicación Xamarin.Mac.
- Ejecute las características de la aplicación.
- Abra la aplicación Consola (disponible en
/Applications/Utilities
) y busquesandboxd
infracciones en el registro Todos los mensajes . - Para cada
sandboxd
infracción, resuelva el problema mediante el uso del contenedor de aplicaciones en lugar de otras ubicaciones del sistema de archivos o aplique derechos de espacio aislado de aplicaciones para habilitar el acceso a características restringidas del sistema operativo. - Vuelva a ejecutar y probar de nuevo todas las características de la aplicación de Xamarin.Mac.
- Repita esta operación hasta que se hayan resuelto todas las
sandboxd
infracciones.
Adición de la separación de privilegios mediante XPC
Al desarrollar una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones, examine los comportamientos de la aplicación en términos de privilegios y acceso y, a continuación, considere la posibilidad de separar las operaciones de alto riesgo en sus propios servicios XPC.
Para obtener más información, consulte la Guía de programación de servicios y demonios y demonios y servicios de Apple.
Implementación de una estrategia de migración
Si va a publicar una nueva versión de espacio aislado de una aplicación de Xamarin.Mac que no estaba previamente en espacio aislado, deberá asegurarse de que los usuarios actuales tengan una ruta de actualización fluida.
Para más información sobre cómo implementar un manifiesto de migración de contenedores, lea la documentación Migración de una aplicación a un espacio aislado de Apple.
Resumen
En este artículo se ha tomado un vistazo detallado al espacio aislado de una aplicación de Xamarin.Mac. En primer lugar, creamos una aplicación de Xamarin.Mac para mostrar los conceptos básicos del espacio aislado de aplicaciones. A continuación, se muestra cómo resolver las infracciones del espacio aislado. A continuación, echamos un vistazo detallado al espacio aislado de aplicaciones y, por último, examinamos el diseño de una aplicación de Xamarin.Mac para el espacio aislado de aplicaciones.