Авторские статьи

Snappy, snapcraft и интерфейсы.


Рано или поздно, но такая отличная технология Snappy придёт на десктопы со своими инструментами. Многих людей любые новшества, как говорят психологи, выбивает из зоны комфорта и они противятся нововведениям, апеллируя с старому, золотому веку, где трава была зеленее, а небо голубее. Snappy уже по своему дизайну намного безопаснее, чем традиционная компоновка большинства Linux систем, за счёт работы абсолютно всех под присмотром системы мандатного доступа AppArmor. Сейчас в вашей домашней папке могут "рыться" все ваши программы, им позволяют права доступа (discretionary access control, DAC). В строгом мире Snappy рулит Mandatory access control (MAC). Разработчик Zygmunt Krynicki из команды Canonical Hardware Certification опубликовал статью, которая на примере текстового браузера links раскрывает внутренние механизмы Snappy.

Это первая статья из цикла, в которой фокусируется внимание на интерфейсах (interfaces) snappy. Интерфейсы являются неотъемлемой частью Snappy, представляя собой механизм, который позволяет snap выйти за пределы своего строгого пространства, заданного по умолчанию, и позволить взаимодействовать с другими частями системы: другими snap, с сетью, с десктопом и т.д.

Прежде чем начать, нужно разъяснить некоторую терминологию. Дело в том, что во время разработки и развития snappy до текущей 2.0 версии применялись различные термины для устоявшегося сейчас понятия интерфейсы (interfaces). Если вы будете читать какие-либо старые материалы, то данный момент может вас только лишний раз запутать. Итак,

  • Snap. Новый формат пакета, который может хранить одно или несколько приложений (app).
  • App. Работоспособное, запускаемое ПО. Это может быть программа командной строки, десктопное ПО или приложения, работающие в фоне, известные как демоны или сервисы.
  • Interface. Механизм с помощью которого 2 snap могут взаимодействовать друг с другом. Тип взаимодействия определяется с помощью имени интерфейса. Интерфейсы могут позволить snap общаться, обмениваться конкретными ресурсами или получать доступ к конкретному оборудованию.
  • Plug. Неотъемлемая часть интерфейса. Plug может подсоединиться к slot. Большинство snap определяют один или несколько plug.
  • Slot. Slot являются частью интерфейса и могут что-то предоставлять (producer) или обеспечивать (provider). Plug соединяются со слотами. Большинство слотов идёт прямиком от операционной системы и многие snap не добавляют какие-либо слоты.

Не смущайтесь, если interface/plug/slot пока вызывает не понимание. На примере текстового браузера links, который мы упакуем в snap, будет показана работа всех частей.

Сначала приведём содержимое всего snapcraft.yaml для данного snap:

name: links
version: 2.12-1
summary: Web browser running in text mode
description: |
    Links is a text mode WWW browser, similar to Lynx. It displays tables,
    frames, downloads on background, uses HTTP/1.1 keepalive connections.
apps:
    links:
        command: links
        plugs: [network, network-bind]
parts:
    links:
        plugin: nil
        stage-packages:
            - links

Если вы не знакомы с инструментом snapcraft, то посетите snapcraft.io. Даже если вы до этого не использовали snapcraft, вышеописанный контент главного файла многое говорит за себя. Пакет snap по имени links содержит одно приложение links, которое можно запустить командой links. Пакет snap содержит только одну часть (links), которая использует nil плагин (ничего не делать) для размещения debian пакета links в каталог stage.

Всё что делается в данный момент - это размещение исполняемого файла links в пакет snap. Компиляция не требуется!

В Убунту, Дебиан и во множестве других дистрибутивах, приложения стартуют с правами запустившего их пользователя и обладают привилегиями данного пользователя. Другими словами, любое приложение имеет полный и неограниченный доступ к вашим персональным данным. К фото. К истории браузера. Сохранённым паролям. Ключам ssh и gpg. Каждое приложение из сторонних репозиториев типа PPA может получить доступ к вашему ядру и другим приложениям. Вот здесь и рождается ответственность за свои действия. Некоторые люди принципиально используют только официальные репозитория в надежде, что пакеты там проверены и не содержат "неприятного" кода.

Давайте дальше. Зачем использовать 2 plug в нашем примере? Всё из-за того, что в мире Snappy софт из snap не имеет неограниченного доступа к оборудованию и персональным данным. Приложения работают в песочницах и не имеют по умолчанию доступа к сети и к другим файлам. Чтобы дать links доступ в Интернет мы используем snappy интерфейсы. Итак, что это за интерфейсы? Интерфейс network позволяет приложениям получить доступ в сеть, как клиенту. Естественно, что текстовый браузер links должен обладать таким правом, чтобы выполнять свою работу. Интерфейс network-bind позволяет программам доступ в сеть как сервер. Зачем это links? Это из-за необходимости привязаться (bind) к локальному сетевому интерфейсу. Можно пропатчить links, но не сейчас. Поэтому сегодня мы даём plugs: [network, network-bind].

У интерфейса есть 2 стороны: с одной plug, а с другой slot. Plug - это потребитель. Slot - поставщик. Кто предоставляет network и network-bind? Операционная система. Ubuntu-core, в виде snap пакета, имеет слот типа network. Когда пакет-snap links устанавливается в системе, то plug network автоматически подсоединяется к слоту network, который предоставил ubuntu-core. То же самое и с network-bind.

Проверить так ли это можно командой snap interfaces, которая отразит все plug, slot и их соединения.
snap interfaces

Slot                 Plug
:firewall-control    -
:home                -
:locale-control      -
:log-observe         -
:mount-observe       -
:network             links
:network-bind        links
:network-control     -
:network-observe     -
:opengl              -
:snapd-control       -
:system-observe      -
:timeserver-control  -
:timezone-control    -
:unity7              -
:x11                 -

Что вывод сей чудный нам готовит? Две колонки, в одной слоты, в другой plug. В общем случае, каждый plug и slot отражается как snap:plug или snap:slot, но как видно в выводе существует ряд сокращений, убирающие повторы для наглядности. Колонка slot не отражает имя ubuntu-core. Колонка plug не отражает имя plug, если оно совпадает с именем интерфейса, а просто пишет имя пакета (links).

Если сокращение было бы выключено, то вывод выглядел примерно так:
snap interfaces

Slot                            Plug
ubuntu-core:network             links:network
ubuntu-core:network-bind        links:network-bind

Вы можете установить данный snap в качестве примера, обладая актуальной Ubuntu 16.04 на архитектуре 64 бита, sudo snap install links. После этого запускайте links и бродите по Интернету, рассматривая его глазами поисковых роботов.

В следующей статье будут рассмотрены соединения (connections). Как можно из разъединить, соединить и что произойдёт, если вы так сделаете.


От себя хочется добавить, что в десктопной Убунту 16.04 мне не удалось запустить links, установленный через snap. Была поставлена ubuntu-core и сам links, но запуск команды links выводил
failed to create user data directory. errmsg: Too many levels of symbolic links
Snappy дали попробовать в традиционной Убунту.

P.S Мне помог Zygmunt Krynicki и объяснил, что проблема из-за того что моя /home - ссылка на другой раздел на другом диске. Если ваш /home стандартен, то всё ок! Дело в том, что AppArmor смотрит истинное расположение и игнорирует символические ссылки. Как выход мне посоветовали заюзать bind-mount. Извиняюсь, если кого ввёл в заблуждение. Осваиваю новые технологии, могу ошибаться

Оглавление цикла статей про Snappy
Следующая статья Соединения.

Дата последней правки: 2023-12-27 16:46:45

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта