О firejail
Firejail представляет собой готовый для использования инструмент запуска приложений внутри изолированной среды. Для этого «из коробки» она содержит более тысячи готовых профилей для изоляции приложений и позволяет создавать свои собственные профили. Работает на операционных системах на основе ядра Linux.
Для создания изолированных окружений firejail использует такие механизмы ядра Linux, как namespaces, cgroups и seccomp, рассмотренные в статье «Обзор механизмов организации изолированных окружений в Linux».
Типовым применением firejail является создание изолированных сред для запуска потенциально уязвимых сетевых приложений. Например, когда веб-браузер, работающий в изолированном окружении, используется для открытия сайта с вредоносным программным обеспечением, изолированное окружение предотвращает распространение действия вредоносного программного обеспечения на всю систему. Кроме веб-браузеров, firejail может использоваться для запуска клиентов электронной почты, мессенджеров и других сетевых приложений.
Установка firejail и firetools
Кроме собственно firejail, которая, как правило, содержится в одноименном пакете, интерес представляет пакет firetools, содержащий написанный с использованием библиотеки Qt5 графический интерфейс для управления firetools и его настройки.
В зависимости от используемого вами дистрибутива Linux команда установки будет выглядеть примерно так:
# apt install firejail firetools
или так
# dnf install firejail firetools
После этого можно переходить к изучению и использованию firejail.
Профили приложений
Профиль определяет параметры изоляции приложения, а именно: правила и ограничения на файловой системе, фильтрацию системных вызовов, изоляцию пространств имен и ограничения использования ресурсов, которые будут применяться к запускаемому в песочнице приложению. Подробнее про доступные в профиле ограничения можно посмотреть на man-странице:
$ man 5 firejail-profile
По умолчанию песочница firejail использует хостовую файловую систему, то есть не производит chroot-изацию приложения в отдельном каталоге, как это было рассмотрено в этой статье. Вместо этого chroot создается поверх хостовой системы путем указания в профиле путевых имен, которые должны быть недоступны (blacklist) или доступны только в режиме чтения (read-only).
Также в профиле возможно создание приватных веток файловой системы, которые полностью очищаются после завершения работы приложения (private). Чаще всего приватизируется домашний каталог пользователя, при этом все изменения, которые произвело приложение в процессе работы, исчезнут после завершения песочницы.
Общесистемный каталог с профилями приложений находится по пути /etc/firejail. Посмотрим, сколько профилей приложений поставляется «из коробки»:
# ls /etc/firejail/*.profile | wc -l
1209
Кроме общесистемных профилей, пользователь может описывать свои собственные профили приложений. Для их размещения предназначен каталог:
~/.config/firejail
Для изоляции одного и того же приложения можно использовать несколько разных профилей в зависимости от задачи, а также единый профиль на несколько приложений. Если при запуске приложения не удается найти профиль для его изоляции, используется профиль по умолчанию. Если запуск производится обычным пользователем, то это файл:
/etc/firejail/default.profile
Если запуск песочницы выполняется суперпользователем, то используется:
/etc/firejail/server.profile
Эти профили содержат базовые ограничения и правила безопасности, но без специфики конкретных приложений.
Firejail является SUID-утилитой. Для того чтобы разрешить обычному пользователю выполнять запуск приложений посредством нее, пользователя надо включить в список разрешенных пользователей:
/etc/firejail/firejail.users
По умолчанию запуск разрешен только суперпользователю.
Ручной запуск приложения в песочнице firejail
Пользователь может вручную запустить свое приложение в песочнице:
$ firejail <program>
В этом случае указанное приложение будет изолировано на основании профиля, который может находиться по следующим путям:
~/.config/firejail/<program>.profile
/etc/firejail/<program>.profile
Если профиль не найден по указанным путям, будет использован профиль приложения по умолчанию.
Можно явно указать, с каким профилем должно быть запущено приложение, указав имя профиля, которое также должно находиться по указанным выше путям. Как вариант, можно указать полный путь к профилю:
$ firejail --profile=profile_name <program>
$ firejail --profile=/etc/profile/filename.profile <program>
Для того чтобы посмотреть список запущенных в настоящий момент песочниц и процессы в них, можно воспользоваться командами:
# firejail --list
# firejail --tree
Ручной запуск приложений в песочнице firejail предоставляет максимальную гибкость, так как параметры изоляции, отсутствующие в профиле приложения, можно дополнять через параметры командной строки. Например:
$ firejail --seccomp --private <program>
В этом случае при запуске включается фильтр системных вызовов (настраивается) и включается приватный режим, при котором все файлы, созданные приложением, удаляются после завершения его работы.
Но при ручном запуске вопрос использования или неиспользования песочниц firejail и и параметров изоляции остается на усмотрение пользователей.
Автоматический запуск приложений в песочнице
Автоматический режим навязывает заданным пользователям запуск определенных приложений посредством firejail.
Список приложений, для которых (при наличии их в системе) firejail будет использоваться автоматически, можно задать в файле:
/etc/firejail/firecfg.config
Для настройки автоматического запуска через командную строку приложений из этого списка через изоляцию необходимо набрать команду:
# firecfg
Эта команда создает символические ссылки в каталоге /usr/local/bin на исполняемый файл firejail, что обеспечивает запуск соответствующих приложений через него.
Для того чтобы данный метод запуска работал, необходимо, чтобы в пользовательском окружении переменная PATH содержала каталог /usr/local/bin до других каталогов поиска исполняемых файлов. Выполнить соответствующие корректировки под пользователем можно следующей установкой переменной:
PATH=/usr/local/bin:$PATH
Очистка созданных символических ссылок производится командой:
# firecfg --clean
Для того чтобы приложения при запуске через меню также запускались в песочнице, необходимо под пользователем выполнить команду:
$ firecfg --fix
Эта команда просматривает desktop-файлы приложений в каталоге:
/usr/share/applications/*.desktop
И если находит там приложения, требующие изоляции (/etc/firejail/firecfg.config), то корректирует путь к исполняемому файлу и складывает исправленные desktop-файлы в директорию:
~/.local/share/applications/
Таким образом, приложения, запускаемые через меню графических сред, также будут запускаться в изолированном окружении на основе профиля приложения.
В этой статье мы рассмотрели основы использования firejail для запуска приложения в песочнице. В следующей статье рассмотрим процесс создания и адаптации профиля приложения под свои задачи.