Bubblewrap: изоляция приложений

Представьте, что вам нужно запустить некоторый процесс Linux в изолированной среде. Так, чтобы он не смог нанести вред системе, на которой запускается. Какие инструменты мы используем в таких случаях? Первое, что приходит в голову, это технологии виртуализации или контейнеризации. Но что, если нам нужно что-то более легковесное и простое в использовании? На самом деле, такой инструмент есть — это утилита командной строки Bubblewrap, один из проектов сообщества Containers (знаменито авторством таких инструментов, как Podman, Buildah, Skopeo и др.).

Bubblewrap: изоляция приложений

Когда может быть полезен:

  • Невысокие требования к изоляции процесса и системы.
  • Недопустимы накладные расходы как у более сложных средств изоляции.
  • Тестирование (поведения) программы в разных условиях эксплуатации.
  • Запуск программ/скриптов/кода, полученных из ненадежных источников.
  • Лимитирование расхода ресурсов для отдельно взятого процесса.
  • Изменение структуры файловой системы для запускаемого процесса.
  • Разработка изолированных сред типа Flatpack.

Установка:

apt-get install bubblewrap

Использование:

bwrap --ro-bind / / echo 'Hello, Bubblewrap!'

В приведенном примере команда echo выполнится в изолированной среде, в которой структура файловой системы один к одному повторяет структуру host-машины, однако файлы в ней будут доступны только для чтения ("--ro-bind", read-only bind). Поэтому следующая команда:

bwrap --ro-bind / / sh -c 'echo Hello, Bubblewrap! > /tmp/out.txt'

выдаст ошибку:

На самом деле bwrap имеет кучу настроек, используя которые можно ограничить очень многие аспекты запускаемого процесса, включая использование ресурсов системы и даже вызов указанных системных функций. Чтобы быстрей сориентироваться, как ей пользоваться, можно посмотреть примеры изоляции некоторых популярных программ.

Таким образом, используя аргументы командной строки, вы сами определяете уровень изоляции запускаемого процесса. При этом под капотом Bubblewrap использует стандартные средства Linux, которые не требуют повышения привилегий пользователя: chroot, clone, seccomp, cgroups, landlock.

Основные плюсы:

  • Не требуются root-привилегии.
  • Изолирует работу только одного процесса.
  • Может использоваться для изоляции приложений с графическим UI.
  • Предоставляет большой спектр настроек лимитирования.
  • Простая установка и использование.
  • Низкие накладные расходы на изоляцию.

Основной минус — это то, что ограничение на ресурсы системы устанавливаются только с использованием cgroup. Это значит, что для полноценной работы bwrap в Docker/Kubernetes-контейнере последний придется запустить в privileged-режиме или лучше с указанием в capabilities привилегии SYS_ADMIN.

P.s. Если вам интересна данная тематика, присоединяйтесь к моей новостной ленте в Telegram или здесь. Буду рад поделиться опытом. ;-)

Начать дискуссию