Изоляция в Linux: настраиваем песочницу с Bubblewrap (bwrap)

Введение

Утилита Bubblewrap (bwrap) представляет собой легковесный, но чрезвычайно гибкий инструмент для изоляции пользовательских сред в Linux. В отличие от тяжеловесных систем контейнеризации, она позволяет обычному непривилегированному пользователю разграничивать доступ к файловой системе, сетевому стеку и процессам без необходимости повышать права до root. В этой статье мы разберем практические сценарии применения bwrap на базе Ubuntu 24.04, познакомимся с базовыми флагами изоляции и наглядно изучим фундаментальные механизмы работы пространств имен (namespaces).

1. Развертывание Bubblewrap и запуск базового изолированного шелла

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

Установка bubblewrap в Ubuntu через менеджер apt

По своей сути bwrap запускает указанную команду внутри свежесозданного набора пространств имен ядра Linux, не требуя при этом привилегий суперпользователя. Чтобы создать минимальное изолированное окружение, администратор или скрипт монтирует лишь строго определенные системные директории хоста в режиме «только для чтения».
⚙️ [Ключевые параметры запуска]

--ro-bind : пробрасывает файл или директорию хоста в песочницу исключительно для чтения (Read-Only).
--bind : подключает ресурс хоста с правами как на чтение, так и на запись.
--dev : инициализирует стандартное виртуальное дерево устройств (/dev) внутри изолированной среды.
--proc : монтирует псевдофайловую систему процессов (/proc), привязанную к новому пространству PID.
--tmpfs : разворачивает временную файловую систему в оперативной памяти, недоступную за пределами сессии.
--unshare-all : полностью отсекает песочницу от хоста по всем типам пространств имен (User, IPC, PID, Network, UTS, Cgroup).
--symlink : формирует внутри песочницы символическую ссылку на заданный целевой путь.

Запуск тестовой команды в изолированной среде bwrap

2. Защита файлов хоста с помощью монтирования в режиме Read-Only

Для наглядной проверки ограничений файловой системы создадим на основной машине тестовый каталог /tmp/bwrap-test и сохраним в нем простой файл:

Подготовка тестового каталога и файла на хосте

Подключим созданную папку внутрь окружения по пути /test, задействовав директиву --ro-bind. Прочитав содержимое файла из песочницы, убеждаемся, что исходная строка Original Content считывается без каких-либо затруднений:

Чтение проброшенного файла через флаг –ro-bind

Теперь проверим барьер безопасности и попытаемся перезаписать /test/data.txt прямо из изолированного шелла. Так как точка монтирования зафиксирована параметром --ro-bind, операция записи немедленно блокируется ядром, о чем свидетельствует статус ошибки и вывод сообщения Write protected successfully. Файлы на хосте остаются в полной неприкосновенности.

Блокировка модификации файлов в режиме только для чтения

3. Разграничение пространств имен процессов и сети

Используя комбинацию ключей --unshare-pid и --proc /proc, мы изолируем таблицу процессов. В результате команда ps внутри песочницы видит исключительно локальное дерево: все фоновые службы и демоны хоста скрыты, а управление начинается с виртуального PID 1 для процессов bwrap, sh и ps:

Изоляция таблицы процессов с опциями –unshare-pid и –proc

Флаг --unshare-net изолирует сетевой стек: ядро формирует чистое сетевое пространство, не унаследовавшее интерфейсы хоста. В таком режиме изолированное приложение полностью отрезано от локальных и глобальных сетей — у него отсутствует даже активный интерфейс петли (lo), что исключает любые входящие и исходящие соединения:

Проверка сетевой изоляции с флагом –unshare-net

4. Создание эфемерного рабочего пространства на базе tmpfs

Для задач, требующих временной записи промежуточных данных, отлично подходит опция --tmpfs /tmp. Она монтирует энергозависимый диск в оперативной памяти по указанному пути. Внутри сессии можно свободно создавать, модифицировать и читать файлы — например, лог-файл /tmp/sandbox.log:

Запись данных во временную файловую систему tmpfs

Главное преимущество такого подхода проявляется в момент завершения работы контейнера. Заглянув в каталог /tmp на основном сервере, мы видим, что файл /tmp/sandbox.log бесследно исчез вместе с контекстом песочницы, подтверждая вывод Host filesystem remained completely untouched:

Проверка отсутствия временных файлов на хосте после завершения работы

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