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

Анатомия интерфейса snappy.


Эта третья статья про интерфейсы snappy, в которой настоятельно рекомендуется сначала прочесть предыдущие статьи для понимания и тогда легче понять интерфейсы изнутри.

Статья подразумевает от вас знания основ программирования, так что если не понятны куски кода, то пропускайте их. Будет рассмотрена работа интерфейса, но заметьте, мы не будем делать новый интерфейс с нуля, а только подготовим почву для будущих статей.

Интерфейс интерфейса

С точки зрения snappy, Interface это немного кода с конкретными API. В терминах языка go это interface (обратите внимание с маленькой буквы i). Если вы знакомы с другими языками программирования, то это просто способ описать класс со специфичным набором методов.

В go описываем так:

type Interface interface {
    ...
}

Это читается так. Interface - объект со следующими методами.

Имя интерфейса

На самом базовом уровне каждый интерфейс имеет имя.

type Interface interface {
    Name() string
    ...
}

Вы можете вызвать метод Name и получить имя интерфейса. Имя интерфейса должно быть актуальным, поэтому другие разработчики должны выбирать хорошие, описательные имена, которые в последствии не изменить.

Проверка plug и slot

Два метода используются для проверки правильности определения plug и slot.

type Interface interface {
    ...
    SanitizePlug(plug *Plug) error
    SanitizeSlot(slot *Slot) error
    ...
} 

Помните, что plug и slot могут содержать произвольные атрибуты. К примеру, конкретный интерфейс позволяет доступ к GPIO портам (pin) и с помощью атрибутов описываются конкретные порты. Как автор интерфейса вы должны проверить корректность порта - его число, разумность значения и т.д.

Оба метода принимают объект для проверки и возвращают ошибку, если объект не корректен. Если вам не нужна проверка, то просто верните nil и продолжайте работу.

Интерфейсы и сниппеты

Обладая правильными plug и slot, главное что делает интерфейс - влияет на различные системы безопасности. Это реализуется 4 методами.

Прежде чем начать, стоить отметить такой факт. Когда говорят об системе безопасности, то подразумевают систему мандатного доступа AppArmor и фильтры seccomp. Подробнее система безопасности будет раскрыта в следующих статьях. Сейчас нужно знать, что они часть всей системы.

По умолчанию, все программы обрабатываются с точки зрения безопасности одинаково и нет уникального для конкретного snap. Интерфейсы позволяют передать дополнительную информацию конкретной части системы безопасности, чтобы конкретное приложение могло делать больше дозволенного. Эта дополнительная информация обменивается в виде сниппетов. Сниппеты - это биты нетипизированных данных, блобы, последовательность байтов. На практике почти все сниппеты это текст, который легко читать и понимать.

Интерфейсы могут выдавать сниппеты на каждое из следующих 4 случаев:

  • 1) Сам по себе факт наличия plug у интерфейса.
  • 2) Факт наличия конкретного plug, соединённого с конкретным slot.
  • 3) Сам по себе факт наличия slot у интерфейса.
  • 4) Факт наличия конкретного слота, соединённого с конкретным plug.

Приложения могут получить дополнительные разрешения, просто обладая plug или slot. Приложения могут получать дополнительное разрешение, сделав подключение между plug и slot.

Обычно большинство разрешений связаны с ситуацией когда plug соединяется со slot. Приложения с помощью plug могут общаться со специфичным сокетом, DBus объектом или устройством в системе. Все такие разрешения будут выражены через сниппеты, описанных выше в пунктах 1 и 2.

Для приложений, обеспечивающие сервисами другие snap (такие как bluez, network-manager, pulseaudio, mir, X11), сам факт наличия слота выдаёт разрешение на создание службы (настройка сети, управления GPU и т.д.). Такие программы будут использовать механизм, описанный выше в пункте 3.

Содержимое сниппета для snappy непрозрачно. Snappy просто собирает их вместе, компонует и передаёт дальше для обработки бэкэндам по безопасности. В итоге снаппеты станут различными конфигурационными файлами.

Как выглядит описание метода?

type Interface interface {
    ...
    PermanentPlugSnippet(plug *Plug, securitySystem SecuritySystem) ([]byte, error)
    ConnectedPlugSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    PermanentSlotSnippet(slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    ConnectedSlotSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    ...
}

Обратите внимание, что каждый метод получает имя системы безопасности в качестве аргумента. Можно повлиять на все подсистемы безопасности, если это требуется для корректной работы.

Подключение интерфейсов автоматически

Интерфейс может сказать, что хочет соединить plug со slot при определённых условиях. Это делается через метод

type Interface interface {
    ...
    AutoConnect() bool
}

Функция была разработана, чтобы позволить системе snappy автоматически соединять plug из snap пакетов со слотами операционной системы, если удовлетворяются требования интерфейса. Snap пакет ОС предоставляет много слотов типа network, network-bind и т.д. Чтобы сделать жизнь пользователя проще, snap может автоматически сделать многое сам, не заставляя пользователя указывать это явно.

Обратите внимание, что разработчики Canonical хотят остаться консервативными в вопросе автоматического подключения. Эмпирическое правило к автоподключению такое: не должно быть риска безопасности, то есть интерфейс не даёт излишних возможностей.

Вся картинка

Весь код интерфейса с документацией можно глянуть по адресу type Interface. Самое главное что нужно понять из данной статьи, что интерфейсы - это код, проверяющий plug и slot и выдающий сниппеты безопасности. Как сниппеты выглядят и как их использовать в следующей статье.

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

Дата последней правки: 2023-12-27 14:38:39

RSS vasilisc.com   


Разделы

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