Compartir vía


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.

Un ejemplo de la aplicación en ejecución

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:

  1. 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.
  2. 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:

  1. Inicie Visual Studio para Mac y haga clic en el vínculo Nueva solución.

  2. En el cuadro de diálogo Nuevo proyecto, seleccione Mac>App>Cocoa App:

    Creación de una aplicación de Cocoa

  3. Haga clic en el botón Siguiente, escriba MacSandbox para el nombre del proyecto y haga clic en el botón Crear:

    Escribir el nombre de la aplicación

  4. En el Panel de solución, haga doble clic en el archivo Main.storyboard para abrirlo para su edición en Xcode:

    Edición del guion gráfico principal

  5. 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:

    Adición de una vista web

  6. Cree una salida para la vista web denominada webView:

    Creación de una nueva salida

  7. 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.

  8. Agregue la siguiente instrucción mediante: using WebKit;

  9. 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")));
    }
    
  10. 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:

Mostrar una ejecución de aplicación de ejemplo

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:

  1. Inicie sesión en el Portal para desarrolladores de Apple:

    Inicio de sesión en el Portal para desarrolladores de Apple

  2. Seleccione Certificados, identificadores y perfiles:

    Selección de certificados, identificadores y perfiles

  3. En Aplicaciones de Mac, seleccione Identificadores:

    Selección de identificadores

  4. Cree un identificador para la aplicación:

    Creación de un nuevo identificador de aplicación

  5. En Perfiles de aprovisionamiento, seleccione Desarrollo:

    Selección del desarrollo

  6. Cree un nuevo perfil y seleccione Desarrollo de aplicaciones para Mac:

    Creación de un perfil

  7. Seleccione el identificador de aplicación que hemos creado anteriormente:

    Selección del identificador de aplicación

  8. Seleccione los desarrolladores para este perfil:

    Adición de desarrolladores

  9. Seleccione los equipos de este perfil:

    Selección de los equipos permitidos

  10. Asigne un nombre al perfil:

    Asignar un nombre al perfil

  11. 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:

  1. Inicie Xcode y seleccione Preferencias en el menú Xcode :

    Edición de cuentas en Xcode

  2. Haga clic en el botón Ver detalles…:

    Hacer clic en el botón Ver detalles

  3. Haga clic en el botón Actualizar (en la esquina inferior izquierda).

  4. 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:

  1. En el Panel de solución, haga doble clic en el archivo Info.plist para abrirlo para su edición.

  2. Asegúrese de que el identificador de agrupación coincide con el identificador de aplicación que hemos creado anteriormente (ejemplo: com.appracatappra.MacSandbox):

    Edición del identificador de agrupación

  3. 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):

    Edición del archivo Entitlements.plist

  4. Guarde los cambios.

  5. En el Panel de solución, haga doble clic en el archivo del proyecto para abrir sus opciones para editar:

    Editar las opciones de la solución

  6. 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:

    Establecimiento del perfil de aprovisionamiento

  7. 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:

Cuadro de diálogo de problema de aprovisionamiento de ejemplo

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:

  1. En el Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.

  2. Compruebe tanto Habilitar derechos y Habilitar espacio aislado de aplicaciones:

    Edición de derechos y habilitación del espacio aislado

  3. 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:

Mostrar el acceso web que se está bloqueando

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:

  1. 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):

    Apertura de la agrupación de la aplicación

  2. 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:

    Comprobación de la aplicación en el Monitor de actividad

  3. Compruebe que el binario de la aplicación está en espacio aislado:

    • Inicie la aplicación Terminal.
    • Vaya al directorio binde aplicaciones.
    • Emita este comando: codesign -dvvv --entitlements :- executable_path (donde executable_path es la ruta de acceso a la aplicación):

    Comprobación de la aplicación en la línea de comandos

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".

Establecimiento de las opciones necesarias

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:

  1. Compile la aplicación en cuestión y ejecútelo desde Visual Studio para Mac.

  2. Abra la aplicación Consola (desde /Applications/Utilties/).

  3. Seleccione Todos los mensajes en la barra lateral y escriba sandboxen la búsqueda:

    Ejemplo de un problema de espacio aislado en la consola

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:

  1. En el Panel de solución, haga doble clic en el archivo Entitlements.plist para abrirlo para su edición.

  2. En la sección Derechos, active la casilla Permitir conexiones de red salientes (cliente):

    Edición de los derechos

  3. 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:

Edición de los derechos

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 la NSHomeDirectoryfunció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 deNSLibraryDirectory), 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).

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:

  1. 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 para NSFileCoordinator acceder al archivo. Primero llamará al WillMove(fromURL, toURL) método, moverá el archivo a la nueva extensión y, a continuación, llamará a ItemMoved(fromURL, toURL).
  2. 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 la PrimaryPresentedItemURL propiedad y al archivo secundario a la PresentedItemURL propiedad. Cuando se abra el archivo principal, llame al AddFilePresenter método de la NSFileCoordinator 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 aislado 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 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:

  1. 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 en true. En Marcadores con ámbito de documento, establezca la com.apple.security.files.bookmarks.document-scope clave de derecho en true.
  2. 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 el public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error) método de la NSUrl clase para crear el marcador.
  3. 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 la NSUrl clase para resolver el marcador.
  4. 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 la NSUrl clase para empezar a acceder a una dirección URL con ámbito de seguridad.
  5. 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 la NSUrl 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:

  1. 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).
  2. 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:

  1. 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.
  2. 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:

  1. Abra la aplicación Terminal (en /Applications/Utilities).
  2. Abra una ventana de Finder en la versión firmada de Apple de la aplicación Xamarin.Mac.
  3. Escriba asctl container acl add -file en la ventana Terminal.
  4. Arrastre el icono de la aplicación de Xamarin.Mac desde la ventana Finder y colóquelo en la ventana Terminal.
  5. La ruta de acceso completa al archivo se agregará al comando en Terminal.
  6. 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:

  1. Abra la aplicación Terminal (en /Applications/Utilities).
  2. Escriba asctl container acl list -bundle <container-name>.
  3. 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:

  1. Determine si la aplicación es adecuada para el espacio aislado.
  2. Diseñar una estrategia de desarrollo y distribución.
  3. Resuelva las incompatibilidades de la API.
  4. Aplique los derechos de espacio aislado de aplicaciones necesarios al proyecto de Xamarin.Mac.
  5. Agregue la separación de privilegios mediante XPC.
  6. 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 un NSDistributedNotificationCenter 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 mediante LSRegisterURL. Use la SMLoginItemSetEnabled 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 como NSHomeDirectory.
  • 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:

  1. Habilite la aplicación Sandbox y ejecute la aplicación Xamarin.Mac.
  2. Ejecute las características de la aplicación.
  3. Abra la aplicación Consola (disponible en /Applications/Utilities) y busque sandboxd infracciones en el registro Todos los mensajes.
  4. 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.
  5. Vuelva a ejecutar y probar de nuevo todas las características de la aplicación de Xamarin.Mac.
  6. 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.