Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Сборка приложения для запуска в изолированном окружении xdg-app - часть 4

Оригинал: Building an xdg-app - part 4
Автор: Alexander Larsson
Дата публикации: 23 февраля 2016 г.
Перевод: А. Панин
Дата перевода: 19 апреля 2016 г.

В первой статье серии создали простейшее приложение, которое могло исполняться в изолированном окружении. Все что оно делало - это выводило приветствие с помощью потока стандартного вывода. Подобные приложения очень просто адаптируются для работы в изолированных окружениях. Фактически, мы не устанавливали каких-либо прав доступа для нашего приложения, следовательно, оно практически не имело доступа к системным ресурсам.

Основные функции изолированного окружения:

  • Предотвращение доступа к файлам системы за исключением файлов окружения исполнения, файлов приложения, а также файлов из директории ~/.var/app/org.test.Hello с возможностью записи лишь в последнюю директорию.
  • Создание уникальной директории для хранения временных файлов /tmp для каждого экземпляра приложения.
  • Предотвращение использования битов setuid.
  • Группировка процессов в рамках групп cgroup, из которых они не могут выйти. Это позволяет сопоставлять приложения и процессы без возможности сокрытия последних. (Также это очень важно для сохранения настроек каждого из приложений, о чем будет сказано позднее.)
  • Предотвращение доступа к сетевому стеку.
  • Предотвращение доступа к любым файлам устройств (за исключением таких специальных файлов устройств, как /dev/null и некоторых других).
  • Предотвращение взаимодействия с любыми процессами, запущенными за пределами изолированного окружения.
  • Загрузка правил seccomp с целью ограничения номенклатуры системных вызовов, которые могут осуществляться приложением. Например, с помощью данных правил приложению можно запретить работать с нестандартными сетевыми сокетами или осуществлять перехват системных вызовов других процессов.
  • Ограничение доступа к шине сессии DBus: приложение должно иметь возможность зарегистрировать свой интерфейс, но не должно иметь возможности взаимодействия с другими приложениями.
  • Ограничение доступа к системным ресурсами и службам, таким, как сервер оконной системы X, системная шина DBus или сервер PulseAudio.

Разумеется, с помощью подобного изолированного окружения проще всего защитить программу "Hello World", ведь она не выполняет каких-либо сложных операций. На данный момент уже существуют описания механизмов (и их экспериментальные реализации), которые позволят приложениям безопасно покидать пределы изолированного окружения (посредством так называемых порталов). Однако, они еще не достаточно стабильны и не могут использоваться. По этой причине в текущее время рекомендуется снижать уровень защиты изолированного окружения для того, чтобы приложения могли корректно выполнять свои функции.

У нас уже был подобный опыт во второй статье серии, когда мы использовали следующую команду для предоставления приложению доступа к сокету сервера оконной системы X и к сетевому стеку:

$ xdg-app build-finish appdir2 --socket=x11 --share=network --command=gnome-dictionary

Данные аргументы преобразуются в следующие параметры в файле метаданных приложения:

[Application] 
name=org.gnome.Dictionary 
runtime=org.gnome.Platform/x86_64/3.20 
sdk=org.gnome.Sdk/x86_64/3.20 
command=gnome-dictionary 

[Context] 
shared=network; 
sockets=x11;

Так как мы не предоставили приложению доступа к файловой системе с помощью специального параметра приведенного выше файла метаданных, оно не сможет видеть ваши файлы. В этом несложно убедиться с помощью аналогичной команды:

$ xdg-app run --command=ls org.gnome.Dictionary ~/ 
<ничего>

При этом с помощью файла метаданных приложения устанавливаются лишь права доступа, используемые по умолчанию. Вы можете изменить их несколькими различными способами. Во-первых, команда xdg-app run принимает такие аргументы, как и команда xdg-app build-finish, позволяющая добавить информацию о правах доступа приложения в его файл метаданных. Например, при запуске приложения с помощью следующей команды ему будет видимо содержимое вашей домашней директории:

$ xdg-app run --filesystem=home --command=ls org.gnome.Dictionary ~/ 
<содержимое домашней директории...>

Кроме того, вы можете изменить установленные по умолчанию права доступа приложения:

$ xdg-app --user override --filesystem=home org.gnome.Dictionary 
$ xdg-app run --command=ls org.gnome.Dictionary ~/ 
<содержимое домашней директории...>

Эти права также могут быть изменены для отдельного экземпляра приложения в момент его запуска:

$ xdg-app run --nofilesystem=home --command=ls org.gnome.Dictionary ~/ 
<ничего>

На самом деле существует не так много параметров управления правами доступа приложения, запускаемого в изолированном окружении. По этой причине я приведу некоторые полезные примеры их использования. (Обратите внимание на то, что все эти параметры имеют и отрицательные версии, например, параметр --unshare является отрицательной версией параметра --share).

Для предоставления приложению доступа к некоторым из ваших файлов может использоваться один из следующих параметров:

--filesystem=host    # Все файлы 
--filesystem=home    # Файлы из домашней директории 
--filesystem=home:ro # Файлы из домашней директории в режиме только для чтения 
--filesystem=/some/dir --filesystem=~/other/dir # Файлы из заданных директорий 
--filesystem=xdg-download # Файлы из директории загрузок стандарта XDG 
--nofilesystem=...   # Запрет доступа к файлам из обозначенных директорий

Для предоставления приложению доступа к серверу оконной системы X11 может использоваться комбинация из следующих параметров:

--socket=x11 --share=ipc

Примечание: параметр --share=ipc позволяет использовать в рамках изолированного окружения общесистемное пространство имен механизмов межпроцессного взаимодействия. Оно не является необходимым для работы с сервером оконной системы X, но без него не будет работать расширение сервера, использующее разделяемую память, что негативно скажется на производительности оконной системы.

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

--device=dri

Для предоставления приложению возможности отображения окон с использованием протокола Wayland может использоваться следующий параметр:

--socket=wayland

Для предоставления приложению возможности вывода звука с помощью сервера PulseAudio может использоваться следующий параметр:

--socket=pulseaudio

Для предоставления приложению доступа к сетевому стеку может использоваться следующий параметр:

--share=network

Примечание: предоставление доступа к сетевому стеку автоматически означает предоставление доступа ко всем системным службам, принимающим соединения с помощью абстрактных сокетов домена UNIX (ввиду метода использования пространств имен этих сокетов), причем доступ к этим службам будет невозможно ограничить с помощью прав доступа. К сожалению, эта проблема затрагивает многие службы, например, сервер оконной системы X и шину сессии DBus которые по умолчанию принимают соединения с помощью абстрактных сокетов домена UNIX. В безопасных дистрибутивах соответствующие службы должны быть переведены на использование обычных сетевых сокетов.

Для предоставления приложению возможности взаимодействия с заданной службой посредством шины сессии DBus может использоваться следующий параметр:

--talk-name=org.freedesktop.secrets

Для предоставления приложению возможности взаимодействия с заданной службой посредством системной шины DBus может использоваться следующий параметр:

--system-talk-name=org.freedesktop.GeoClue2

Для предоставления приложению неограниченного доступа к шинам DBus может использоваться комбинация из следующих параметров:

--socket=system-bus --socket=session-bus

На этом на сегодня все. В следующей статье мы рассмотрим способы распространения вашего приложения.