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

Соединения.


Это вторая статья, в которой более подробно раскрывается такая часть Snappy как интерфейсы.

В первой статье интерфейсы затронуты были чуть-чуть. На примере пакета snap для текстового браузера links мы рассмотрели как с помощью plug типа network дать доступ к сети. Мы воспользовались механизмом автоматического соединения при установке пакета и убедились, что это работает.

В данной статье сфокусируемся на соединениях (connections). Соединения - это просто запись (plug, slot), где plug - конкретный plug в конкретном snap пакете и слот - конкретный слот в конкретном snap пакете (обычно в другом).

До того как начать освоение соединений, давайте изучим plug и slot ещё раз и чуток поглубже.

Plug и slot

Plug и slot имеют имя, как и имя интерфейса. Пример, что до сих пор был приведён, многое укутывал туманом, так как имена plug и интерфейса совпадали. Если упрощение убрать в сторону, то обнажится реальное положение дел.

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

Давайте сфокусируем внимание только на нужном:

apps:
    links:
        command: links
        plugs: [network, network-bind]

Это сокращённая форма. Snappy активно использует упрощение для красивого и читабельного отображения. Это всё хорошо пока вы понимаете что происходит и что это означает.

Давайте глянем развёрнутую форму.

apps:
    links:
        command: links
        plugs: [network, network-bind]
plugs:
    network:
        interface: network
    network-bind:
        interface: network-bind

Заметьте что имя plug не зависит от имени интерфейса. Для удобства, когда имя plug совпадает с именем интерфейса, то его можно опустить. Ещё удобство-упрощение состоит в том, что если plug не содержит ещё атрибутов, то нам сходит с рук описание plugs: [network, network-bind] в разделе apps. То же самое относится и к слотам. Каждый раз когда что-то относится к plug, вы смело можете относить и к слотам, так что далее к этому вопросу возвращаться не будем.

Резюмируем:

  • Plug и slot являются объектами с несколькими атрибутами.
  • Имя однозначно идентифицирует plug или слот в конкретном пакете snap.
  • Имя интерфейса описывает plug/slot.

Обратите внимание, что имя plug и slot может иметь почти произвольное имя от создателя snap пакета, то имена интерфейсов определены snappy самим. Вы не можете создать новый интерфейс, придумав новое имя для него. Как создавать интерфейсы будет рассказано в новых статьях.

Соединения

Уф, давайте вернёмся к соединениям. Соединение создаётся между plug и slot одного и того же типа интерфейса. Для примера snappy не даст соединиться между plug типа unity7 и слотом типа network. Snappy такого не позволит. В устройствах из мира IoT легко ожидать слоты с именами далёкими от типа интерфейса, которые они предоставляют. Например, user-button, led5 или gpio-12.

Snappy поддерживает внутреннюю структуру по имени "состояние" (state), позволяя регистрировать соединения при их установлении. Когда вы перезагружаете некое устройство, то состояние используется для перезагрузки соединений. Прямо сейчас это мало интересно, но позже планируется добавить хуки (hooks) и всё станет намного интереснее. Например, при перезагрузке часть деталей конкретных plug и slot могут стать другими. Представьте гипотетический пакет snap программы cheese, которая работает с физической USB камерой, но из-за работы USB enumeration некоторые атрибуты слота, которые предоставляют камеру, могут изменить представление. К примеру, конкретное устройство, к которому cheese имеет доступ, может иметь другой путь в файловой системе.

Когда устанавливаются соединения, то различные системы в модели безопасности snappy должны быть проинформированы. Каждая из них использует информацию о слотах, plug, приложениях и соединениях, чтобы решить через набор правил и профилей - разрешить или запретить. Про профиля будет описано позже, сейчас важно запомнить одно - профиля специфичны для конкретного приложения. Конкретный snap пакет обладает различными профилями безопасности для каждого приложения, основываясь на том, какие plug и slot связаны с ним.

Связывание plug и slot

Как выглядит связывание (binding)? Представим что наш links эволюционировал до менеджера закладок и стартует отдельно от самого links. Предположим, что мы решили для безопасности не давать менеджеру доступ к сети, как дано самому links.

Реализуем задумку в snapcraft.yaml:

...
apps:
    links:
        command: links
        plugs: [network, network-bind]
    bookmarks:
        command: links-bookmark-editor (fake)...
apps:
    links:
        command: links
    bookmarks:
        command: links-bookmark-editor (fake)
plugs:
    network:
        interface: network
    network-bind:
        interface: network-bind
...

Заметьте, что links обладает plug, а программа links-bookmark-editor - нет! Если plug или slot объявлен в snap пакете без ассоциации с каким-либо ПО из пакета, то будет подразумеваться неявная связь со всеми программами из пакета. Если plug и slot указаны конкретно для одного или нескольких программ (как в примере), то связь будет для этих программ и только.

Сравните с:

...
apps:
    links:
        command: links
    bookmarks:
        command: links-bookmark-editor (fake)
plugs:
    network:
        interface: network
    network-bind:
        interface: network-bind
...

Здесь network и network-bind не соотнесены к какому-либо ПО явно и значит что неявно применены ко всем. Помните эту тонкую разницу, которая важна для эффективной безопасности.

Работа с соединениями

Snappy позволяет пользователю изменить в командной строке текущие соединения-связи - snap connect и snap disconnect. Обе команды понимают --help. В snap 2.0.2 нужно указывать в полной развёрнутой схеме - snap connect snap:plug snap:slot и другие варианты не работают.

Для примера, мы поставили links из его snap пакета и хотим лишить его сети, отключая соединение-связь.
sudo snap disconnect links:network ubuntu-core:network
sudo snap disconnect links:network-bind ubuntu-core:network-bind

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

Если теперь запустить команду snap interfaces, то получите примерно такой вывод:

Slot                 Plug
:network             -
:network-bind        -
-                    links:network
-                    links:network-bind

Наглядно видно, что plug и slot разъединены. Восстановить связь можно так:
sudo snap connect links:network ubuntu-core:network
sudo snap connect links:network-bind ubuntu-core:network-bind

Вот и всё на сегодня. В следующий раз мы рассмотрим систему безопасности и как происходит в них взаимодействие с интерфейсами. Это позволит нам понять как создать свой интерфейс, которого ещё нет.

Оглавление цикла статей про Snappy
Предыдущая статья Snappy, snapcraft и интерфейсы.
Следующая статья Анатомия интерфейса snappy.

Дата последней правки: 2016-05-22 20:35:54

RSS vasilisc.com   


Разделы

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