Creación de un espacio aislado en una aplicación Xamarin.Mac
En este artículo, se describe la creación de espacio aislado en 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 e Interface Builder y Salidas y acciones, ya que trata conceptos clave y técnicas que usaremos en este artículo.
Es posible que quiera echar un vistazo a la Sección /exponer clases o métodos de C# a Objective-C del documento Xamarin.Mac Internals, también explica los atributos Register
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.
La aplicación Sandbox es una tecnología de control de acceso integrada en macOS (aplicada en el nivel de kernel) que proporciona una estrategia bidireccional:
- La aplicación Sandbox 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 no más.
- La aplicación Sandbox 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 aplicación Sandbox
Los elementos de aplicación Sandbox que se tratarán detalladamente 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 aplicación Sandbox 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 de aplicación Sandbox necesitará. Por último, examine el uso de la separación de Privilegios para maximizar el nivel de defensa de la aplicación.
Al adoptar la aplicación Sandbox, 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 a la aplicación Sandbox.
Comprobaremos que la aplicación está realmente en un espacio aislado y aprenderemos a solucionar los errores más comunes de aplicación Sandbox.
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 mediante:
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 la aplicación Sandbox, primero necesitamos aprovisionar y firmar nuestra aplicación de Xamarin.Mac.
Hagamos 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 Macy, 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 esta funcionando bien. 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. del paquete de aplicaciones no coincide con el ID de la 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 de la aplicación Sandbox
Para habilitar aplicación Sandbox, 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.
Compruebe tanto Habilitar derechos y Habilitar espacio aislado de aplicaciones:
Guarde los cambios.
En este momento, ha habilitado aplicación Sandbox, 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ú del espacio aislado está activado.
- Asegúrese de que la columna del 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
bin
de aplicaciones. - 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 las aplicaciones de Xamarin.Mac a través de TCP, lo que significa que, de manera predeterminada, cuando se habilita el espacio aislado, no puede conectarse a la aplicación, por lo que si intenta ejecutar la aplicación sin los permisos adecuados habilitados, obtendrá un error "No se puede conectar con el depurador".
El permiso Permitir conexiones de red salientes (cliente) es el necesario para el depurador, al habilitarlo permitirá depurar con normalidad. Dado que no se puede depurar sin él, hemos actualizado el destino CompileEntitlements
para msbuild
agregar automáticamente ese permiso a los derechos de cualquier aplicación que esté en un espacio aislado solo para 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 la aplicación Sandbox 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 de la aplicación Sandbox 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, vuelva a nuestro ejemplo, los derechos de conexión de red que faltan que impiden que la vista web funcione.
Detección de infracciones de la aplicación Sandbox
Si sospecha que se está produciendo una infracción de la aplicación Sandbox 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 la aplicación Sandbox, ya que no hemos solicitado ese derecho.
Corrección de infracciones de la aplicación Sandbox con derechos
Ahora que hemos visto cómo encontrar infracciones de la aplicación Sandbox, 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 conexiones de red salientes (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.
La aplicación Sandbox en profundidad
Los mecanismos de control de acceso proporcionados por la aplicación Sandbox son pocos y fáciles de entender. Sin embargo, la manera en que cada aplicación adoptará aplicación Sandbox 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 malo, 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.
La aplicación Sandbox 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 la aplicación Sandbox, está diseñando para un escenario peor. Si la aplicación se ve comprometida por un código dañino, se limita a acceder únicamente 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 el código dañino, 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 la aplicación Sandbox, 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 la aplicación Sandbox, 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 la aplicación Sandbox, 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 laNSHomeDirectory
función (consulte a continuación) dentro de la 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á sus propios subdirectorios Library (al que se accede a través de
NSLibraryDirectory
), Soporte de aplicaciones y Preferencias. - macOS establece y refuerza la conexión entre una aplicación y su contenedor mediante la firma de código. Incluso es otra aplicación que intenta suplantar la aplicación mediante su identificadorde 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 las aplicaciones de tipo shoebox (como la aplicación Fotos de Apple), el contenido del usuario irá 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 añaden automáticamente al Contenedor Sandbox 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 el documento de Apple Añadir una aplicación a un grupo de aplicaciones en Referencia de la clave de asignación 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 se encuentra en determinados directorios que son legibles por todo 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 NSOpenPanel
o 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:
- Conexión 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 mediante la función Reanudar 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
La aplicación Sandbox permite a una aplicación acceder a elementos relacionados que tienen el mismo nombre de archivo, pero diferentes extensiones. 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, una película y un archivo de subtítulos. Use un
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.plistde 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 aisladas
Los límites siguientes se colocan en NSOpenPanel
y 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 -
NSOpenPanel
sin espacio aisladoNSSavePanel``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 dadosdespués de reiniciar una aplicación.
Tipos de marcador con ámbito de seguridad
Cuando se trabaja con marcadores de seguridad y acceso persistente a recursos, hay dos casos de uso distintos:
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 un NSOpenPanel
), la aplicación crea un marcador de documento para el elemento almacenado en el proyecto, de modo que la aplicación siempre pueda acceder al archivo.
Un marcador de documento puede ser resuelto por cualquier aplicación que pueda abrir los datos del marcador y el propio 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 contiene ahora los requisitos de código designados para ambas versiones de la aplicación de Xamarin.Mac y macOS 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.
El <container-name>
suele ser el identificador de paquete de la aplicación de Xamarin.Mac.
Diseño de una aplicación de Xamarin.Mac para la aplicación Sandbox
Hay un flujo de trabajo común que debe seguirse al diseñar una aplicación de Xamarin.Mac para la aplicación Sandbox. 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 la aplicación Sandbox
El diseño de una aplicación de Xamarin.Mac para la aplicación Sandbox, 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 sólo debes poner en espacio aislado el ejecutable principal de tu paquete de aplicaciones, sino también todas las aplicaciones o herramientas de ayuda incluidas en ese paquete. 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 la aplicación Sandbox y, por tanto, son adecuadas para el espacio aislado. Si la aplicación requiere un comportamiento que la aplicación Sandbox no permite, debe considerar un enfoque alternativo.
Si la aplicación requiere uno de los siguientes comportamientos, no es compatible con la aplicación Sandbox:
- Servicios de autorización: con la aplicación Sandbox, 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 la aplicación Sandbox, 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 la aplicación Sandbox.
- 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 la aplicación Sandbox.
- Acceso o configuración de preferencias en otras aplicaciones: la manipulación de la configuración de otras aplicaciones está prohibida por la aplicación Sandbox.
- Configuración de los ajustes de red: la manipulación de la configuración de red está prohibida por la aplicación Sandbox.
- Terminación de otras aplicaciones: la aplicación Sandbox prohíbe el uso de
NSRunningApplication
para finalizar otras aplicaciones.
Resolución de incompatibilidades de API
Al diseñar una aplicación de Xamarin.Mac para la aplicación Sandbox, 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 de
NSDocument
, debe cambiar a él debido a la compatibilidad integrada con la aplicación Sandbox.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 la aplicación Sandbox, 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 Agregar elementos de inicio de sesión mediante la documentación de la administración de servicios de 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 la aplicación Sandbox 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. La aplicación Sandbox impedirá que CoreMedia reproduzca estos vídeos de otro modo.
Aplicación de derechos requeridos de la aplicación Sandbox
Tendrá que editar los derechos de cualquier aplicación de Xamarin.Mac que quiera ejecutar en la aplicación Sandbox y activar la casilla Habilitar la aplicación Sandbox.
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 la aplicación Sandbox 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 la aplicación Sandbox 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
sandboxd
se hayan resuelto todas las infracciones.
Añadir separación de privilegios mediante XPC
Cuando desarrolle una aplicación de Xamarin.Mac para las aplicaciones Sandbox, observe los comportamientos de la aplicación en términos de privilegios y acceso, y considere la posibilidad de separar las operaciones de alto riesgo en sus propios servicios XPC.
Para más información, consulte la Guía de programación de servicios y daemons XPC 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 se encontraba 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 la aplicación Sandbox 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 de la aplicación Sandbox. A continuación, se muestra cómo resolver las infracciones del espacio aislado. A continuación, echamos un vistazo detallado la aplicación Sandbox y, por último, examinamos el diseño de una aplicación de Xamarin.Mac para la aplicación Sandbox.