La magia detrás de las interfaces instantáneas

Ubuntu junio 5, 2021

Los snaps son confinado, aplicaciones autónomas, diseñadas pensando en la portabilidad y la seguridad. De forma predeterminada, las instantáneas estrictamente confinadas se ejecutan de forma aislada, con un acceso mínimo a los recursos del sistema. Por ejemplo, no pueden acceder al hogar, la red, el audio ni la pantalla. Para que sus instantáneas sean utilizables, los desarrolladores y editores pueden declarar un conjunto de interfaces, que permiten un acceso granular por recurso al sistema subyacente de forma segura y controlada.

En el artículo de hoy, queremos hablar un poco más sobre la mecánica detrás de la interfaz. ¿Qué sucede cuando un desarrollador declara un complemento de interfaz en snapcraft.yaml y cuando ese complemento se instala en la máquina de un usuario?

Declaración

Las interfaces constan de dos componentes: ranuras y enchufes. La ranura de una interfaz es un proveedor de funcionalidad (y acceso) a un recurso del sistema. El conector de una interfaz es un componente de un complemento integrado, que luego puede conectarse a la ranura correspondiente y, por lo tanto, obtener acceso al recurso subyacente. Se pueden conectar varios enchufes a una ranura específica, por ejemplo: varios enchufes con el enchufe de casa puede conectarse al ranura de inicio, y así obtener acceso al directorio de inicio del usuario.

Por razones de seguridad, algunas interfaces se pueden conectar automáticamente: en la instalación instantánea en la máquina de un cliente, los enchufes declarados podrán conectarse a las ranuras sin ninguna intervención manual. En otros escenarios, esto no será posible de forma predeterminada. El usuario deberá conectar manualmente su complemento o solicitar una anulación al equipo de Snap Store. En algunos casos, esta funcionalidad puede otorgarse, especialmente si es parte de la funcionalidad necesaria de la aplicación. Los ejemplos típicos serían el control de la red o las capacidades de grabación de audio.

En algunos casos, las instantáneas le notificarán que se requiere una conexión específica. En otros, deberá determinarlo usted mismo, tal vez si encuentra un problema de funcionalidad. También puede optar por conectar o desconectar interfaces manualmente como mejor le parezca, pero tenga en cuenta que esto puede alterar el comportamiento esperado de la aplicación.

snap connections vlc
Interface               Plug                        Slot                     Notes
audio-playback          vlc:audio-playback          :audio-playback          -
audio-record            vlc:audio-record            -                        -
avahi-control           vlc:avahi-control           -                        -
camera                  vlc:camera                  -                        -
desktop                 vlc:desktop                 :desktop                 -
desktop-legacy          vlc:desktop-legacy          :desktop-legacy          -
dvb                     vlc:dvb                     -                        -
home                    vlc:home                    :home                    -
jack1                   vlc:jack1                   -                        -
mount-observe           vlc:mount-observe           -                        -
mpris                   -                           vlc:mpris                -
network                 vlc:network                 :network                 -   

En el fragmento anterior, el reproductor multimedia VLC tiene acceso a una amplia gama de recursos típicos necesarios para su funcionalidad. Sin embargo, la cámara no se conecta automáticamente. Por ejemplo, si necesita VLC para capturar una streaming de video usando el dispositivo de la cámara, necesitará que esta interfaz esté conectada.

sudo snap connect vlc:camera

Ahora, en un archivo snapcraft.yaml típico, una declaración de sección de enchufe puede verse así:

apps:
  segfexample:
    command: segfexample
    plugs:
    - home
    - network

Si está interesado en una descripción general más amplia de interfaces y casos de uso específicos, ya lo hemos cubierto en detalle en un entrada en el blog hace un tiempo.

Instalación

Durante la instalación, si instala un complemento en la línea de comandos y presta atención a la salida en la ventana de su terminal, es posible que vea una serie de mensajes del servicio snapd sobre montajes, conexiones, etc. La instalación del complemento incluye dos pasos principales:

  • Desembalaje del complemento (un archivo Squashfs comprimido).
  • Configuración de los perfiles de seguridad.

Una vez que el complemento está instalado, puede inspeccionar la configuración del sistema. Los perfiles de Snapd AppArmor se almacenan en:

/var/lib/snapd/apparmor/profiles

Dependiendo de la complejidad de su complemento, puede haber uno o más perfiles, por ejemplo:

-rw-r--r-- 1 root root  4706 Jun  3 12:32 snap-update-ns.segfexample
-rw-r--r-- 1 root root 23379 Jun  3 12:32 snap.segfexample.segfexample

Siempre que tenga los permisos adecuados, ahora puede abrir estos perfiles en un editor de texto y examinar el contenido. Necesita familiarizarse con la sintaxis de AppArmor, pero, en esencia, verá las capacidades declaradas en su sección de complemento snapcraft.yaml enumeradas y expandidas aquí


# Description: Can access the network as a client.
#include <abstractions/nameservice>
/run/systemd/resolve/stub-resolv.conf rk,
/etc/mdns.allow r,     # not yet included in the mdns abstraction
network netlink dgram, # not yet included in the nameservice abstraction
...

Código fuente

Si deseas saber más sobre cómo funciona una interfaz en particular, también puede consultar la fuente de snapd en GitHub. Por ejemplo, el casa interfaz. El código declara las especificaciones de la ranura, incluidos los atributos de lectura y conexión automática, y los detalles del perfil de AppArmor que se aplicarán en la instalación. En este ejemplo, el perfil permite acceso de lectura / escritura a todos los archivos en el directorio de inicio del usuario, excepto la ruta de la aplicación instantánea y los directorios ocultos de nivel superior, permite la creación de nuevos archivos, permite el acceso a montajes GVFS para archivos propiedad del usuario y no permite las escrituras en el compartimiento subdirectorio.


const homeBaseDeclarationSlots = `
  home:
    allow-installation:
      slot-snap-type:
        - core
    deny-connection:
      plug-attributes:
        read: all
    deny-auto-connection:
      -
        on-classic: false
      -
        plug-attributes:
          read: all
`
...

Resumen

Las interfaces Snap pueden parecer un poco confusas al principio, especialmente porque su comportamiento difiere del modelo clásico de Linux. Sin embargo, pueden resultar útiles para asegurarse de que las aplicaciones solo utilicen los recursos del sistema necesarios. Esto puede mejorar tanto la seguridad como la previsibilidad y minimizar el problema a largo plazo en el sistema.

Si deseas comprender exactamente qué sucederá cuando declare un complemento en su snapcraft.yaml, puede verificar el código fuente de snapd y / o los perfiles de AppArmor para el complemento instalado para obtener una visión más clara de la implementación específica del confinamiento de seguridad. lógica. Con suerte, este artículo simplifica las cosas y revela el “truco de mago”. Háganos saber si tiene alguna pregunta o sugerencia sobre este tema uniéndose al foro de Snapcraft.

Foto por nota thanun en Unsplash.