January 27

Firejail: простая изоляция приложений в Linux

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

Даже если приложение не имеет root-доступа, при должной сноровке оно получает полный доступ к данным пользователя: домашнему каталогу, SSH-ключам, конфигурациям, токенам браузера. Для большинства атак этого более чем достаточно.

Отсюда возникает идея sandbox-подхода: запускать потенциально опасные приложения в ограниченной среде, где их возможности строго контролируются. Firejail — один из самых простых и практичных инструментов для реализации этого подхода в Linux.

Что такое Firejail и какую проблему он решает

Firejail — это утилита для изоляции отдельных приложений в пользовательском пространстве Linux. Она запускает программу в песочнице (sandbox), ограничивая её доступ к файловой системе, сети, системным вызовам и привилегиям ядра.

Важно сразу обозначить границы. Firejail это:

  • не виртуальная машина;
  • не контейнер в стиле Docker или LXC;
  • не система обязательного контроля доступа уровня SELinux.

Ее основная задача — быстро и без создания сложной инфраструктуры уменьшить ущерб в случае компрометации конкретного приложения.

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

Как Firejail работает под капотом

Firejail использует стандартные механизмы изоляции, встроенные в ядро Linux.

Основа изоляции — namespaces (пространства имён). Когда вы запускаете приложение через Firejail, оно получает собственное изолированное представление о системе. Например, в namespace процессов (PID) Firefox будет видеть только себя и свои дочерние процессы, а не все процессы в системе. Mount namespace позволяет создать отдельное дерево монтирования — именно здесь Firejail использует tmpfs и bind-монтирование для изоляции файловой системы. Network namespace даёт изолированный сетевой стек.

Seccomp-BPF отвечает за фильтрацию системных вызовов. Каждое обращение приложения к ядру проверяется: если вызов разрешён профилем — он выполняется, если нет — процесс завершается. Это позволяет заблокировать потенциально опасные операции, вроде загрузки модулей ядра или создания устройств, оставив только те вызовы, которые действительно нужны для работы.

Capabilities дополнительно ограничивают возможности процесса. Даже непривилегированные приложения обладают определёнными capabilities — например, возможностью изменять приоритет своих задач или устанавливать соединения. Firejail может убрать эти привилегии, сделав процесс ещё более ограниченным.

Изоляция файловой системы строится внутри mount namespace. Firejail создаёт временную файловую систему (tmpfs) поверх домашнего каталога, затем выборочно пробрасывает в неё только разрешённые директории через bind-монтирование. В результате приложение физически не видит ~/.ssh или другие приватные данные — в его окружении их просто не существует.

Механизмы whitelist и blacklist позволяют точно контролировать доступ: можно разрешить только конкретные каталоги (более безопасный подход) или запретить отдельные директории, оставив доступ ко всему остальному (более удобный вариант).

Практические примеры использования

Первые шаги

Первым делом необходимо поставить Firejail, если он не был установлен ранее.

su -
apt-get install firejail
exit

Лучше всего начать с простого эксперимента — запустить стандартную оболочку в песочнице без применения готовых профилей.

firejail --noprofile bash

Вы окажетесь в новом окружении, но уже изолированном. Попробуйте выполнить несколько команд:

ps aux
ls ~
Вызов firejail --noprofile bash

По умолчанию изоляция минимальная. Видно, что в этой оболочке не доступны процессы основной системы благодаря PID namespace: приложение получает собственное дерево процессов, начинающееся с PID 1.

Далее попробуем полностью отключить сеть. Для этого можно воспользоваться опцией --net=none:

curl google.com # работает
firejail --noprofile --net=none bash
curl google.com # не сработает
Вызов firejail --noprofile --net=none bash

Сетевой интерфейс внутри песочницы есть (обычно только loopback), но доступа к внешней сети нет. Это полезно для работы с недоверенными файлами или приложениями, которым сеть не нужна.

Теперь попробуем ограничить файловую систему. Выполним:

firejail --noprofile --private bash
ls ~
echo "test" > ~/file.txt
cat ~/file.txt
exit
cat ~/file.txt
Вызов firejail --private --net=none bash

Опция --private создаёт временный tmpfs, который уничтожается после завершения процесса. Реальный домашний каталог остаётся нетронутым.

Далее попробуем разрешить только каталог Загрузки:

firejail --noprofile --whitelist=~/Загрузки bash
ls ~
ls ~/.ssh
Вызов firejail --noprofile --whitelist=~/Загрузки bash

Указание директорий через whitelist — наиболее безопасный подход. Приложение видит только явно разрешённые каталоги. Всё остальное физически недоступно.

Ещё можно использовать --blacklist :

firejail --noprofile --blacklist=~/.ssh bash
ls ~/.ssh
ls ~
Вызов firejail --noprofile --blacklist=~/.ssh bash

Blacklist удобнее, когда нужно скрыть несколько критичных директорий, оставив доступ к остальным.

Опции можно комбинировать:

firejail --noprofile \
  --private \
  --net=none \
  --whitelist=~/Загрузки \
  --seccomp \
  bash ./untrusted_script.sh

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

firejail --noprofile \
  --whitelist=~/Загрузки \
  --blacklist=~/.ssh \
  firefox  

Это работает, но каждый раз набирать несколько команд неудобно. Тут на помощь приходят профили.

Создание собственных профилей

Вместо того чтобы каждый раз указывать все опции, можно создать профиль — файл конфигурации с нужными настройками.

mkdir -p ~/.config/firejail
mcedit ~/.config/firejail/secure-shell.profile

Содержимое профиля:

private
blacklist ~/.ssh
net none
seccomp

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

firejail --profile=~/.config/firejail/secure-shell.profile bash
Ограничение через профиль

Написать свой Firejail-профиль — непростая задача, особенно для сложных графических приложений, но есть способы облегчить ее:

Можно скопировать /usr/share/doc/firejail/profile.template и измененить его.

Также можно сгенерировать файл профиля автоматически с использованием firejail --build. Подробнее о написании своих профилей можно узнать в документации.

Использование готовых профилей

Один из главных плюсов Firejail перед аналогичными инструментами — наличие готовых профилей для сотен популярных приложений. Профили находятся в /etc/firejail/ и покрывают браузеры, мессенджеры, медиаплееры, офисные пакеты, торрент-клиенты, IDE и многое другое.

Рассмотрим пример:

firejail chromium

Эта команда использует /etc/firejail/chromium.profile, который уже содержит настройки, проверенные разработчиками Firejail: разрешённые каталоги, необходимые системные вызовы, доступ к GPU и звуку.

Можно переопределить отдельные настройки профиля:

firejail --net=none chromium # отключить сеть поверх профиля

Помимо этого, стандартные профили включают импортирование локальных переопределений из ~/.config/firejail/<profile-name>.local. Это позволяет на уровне пользователя сохранить переопределения профиля.

GUI для Firejail

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

firetools

К сожалению, не работает в операционных системах ALT. См. https://bugzilla.altlinux.org/45710

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

Кадр из Firetools Demo (https://odysee.com/@netblue30:9/firetools:6)
Кадр из Firetools Demo (https://odysee.com/@netblue30:9/firetools:6)

firejail-ui

Одна из частей firejail-tools, позволяет через GUI настроить песочницу и запустить программу.

firejail-ui (выбор приложения)
firejail-ui (настройка песочницы)

tuner-firejail (в разработке)

Началась разработка плагина для «Тюнера» для управления Firejail-профилями.

На данный момент плагин локально модифицирует профили и позволяет:

  • включать и отключать опции, описанные в специальном формате fjopts;
  • открывать локальный профиль для ручного редактирования;
  • сбрасывать локальные изменения профиля.
Главная страница tuner-firejail
Страница редактирования профиля

Преимущества Firejail перед другими популярными инструментами

Firejail и Flatpak / Snap

Flatpak и Snap обеспечивают изоляцию за счёт собственной инфраструктуры упаковки и запуска приложений. Программа должна быть специально подготовлена для работы в этой среде, а уровень доступа к ресурсам определяется на уровне пакета и порталов. Firejail принципиально отличается тем, что работает с обычными исполняемыми файлами, установленными традиционным способом. Он позволяет изолировать приложение без его пересборки и без зависимости от конкретной экосистемы доставки.

Firejail и bubblewrap

bubblewrap — это низкоуровневая утилита, которая используется Flatpak в качестве одного из базовых механизмов изоляции. По сути, она предоставляет прямой доступ к Linux namespaces и mount-изоляции, не предлагая собственной модели конфигурации или готовых ограничений.

В отличие от Firejail, bubblewrap не имеет готовых профилей и не ориентирован на самостоятельное использование конечным пользователем. Каждый sandbox в нём собирается вручную: необходимо явно описывать файловую систему, точки монтирования и разрешённые ресурсы. Firejail использует те же механизмы ядра, но добавляет поверх них систему профилей и набор типовых ограничений, что делает его пригодным для регулярного запуска реальных пользовательских приложений.

Статья по сравнению Firejail и bubblewrap.

Firejail и системы MAC (AppArmor, SELinux)

AppArmor и SELinux предназначены для системного обязательного контроля доступа и требуют централизованного управления политиками. Они эффективны для защиты сервисов и демонов, но плохо подходят для изоляции произвольных пользовательских приложений. Firejail не меняет глобальную модель безопасности системы и применяется локально, в момент запуска процесса. За счёт этого он может использоваться без вовлечения администратора и без риска нарушить работу всей системы.

Firejail и контейнеры (Docker, Podman, LXC и т.д.)

Контейнеры обеспечивают более строгую изоляцию, но ориентированы прежде всего на серверные сценарии. Их использование для десктопных приложений связано с дополнительной сложностью и нарушением привычного пользовательского окружения. Firejail сохраняет интеграцию с графической средой, ограничивая при этом доступ приложения к данным и ресурсам. Для пользовательских программ это часто оказывается более разумным компромиссом, чем полноценная контейнеризация.

Ограничения Firejail

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

В частности, существуют проблемы с открытием внешних ссылок из приложений, работающих в sandbox'е:

Для решения этой проблемы в приложениях для Aides был выбран такой хак:

env XDG_CURRENT_DESKTOP= 
env DE=flatpak

Это заставит xdg-open открывать ссылки с помощью xdg-desktop-portal.

Кроме того, атомарные (immutable) системы, такие как Fedora Silverblue и ALT Atomic, не поддерживаются Firejail:

Эти ограничения следует учитывать при использовании Firejail.

Насколько это реально повышает безопасность

Firejail эффективно снижает последствия эксплуатации уязвимостей в пользовательских приложениях, запуска вредоносного кода через документы или веб-контент и ошибок в стороннем ПО.

Однако он не защищает:

  • от уязвимостей в самом ядре;
  • от атак, уже работающих с правами пользователя;
  • от утечек данных, которые разрешены профилем.

Firejail не является «серебряной пулей». Это дополнительный уровень защиты, который работает только в сочетании с обновлениями системы, здравым смыслом и базовой гигиеной безопасности. Firejail имеет как свои преимущества, так и недостатки.

Важно учитывать, что Firejail устанавливается как исполняемый файл с SUID, то есть на этапе настройки песочницы он выполняется с правами root. Это техническая необходимость: без привилегий невозможно корректно настроить пространства имён и ограничения доступа. После инициализации повышенные права сбрасываются, и само приложение работает уже в непривилегированном режиме.

Как и у любого SUID-компонента, у Firejail в прошлом находили уязвимости, включая локальное повышение привилегий. Эти проблемы исправлялись по мере обнаружения, но сам факт их существования означает, что использование Firejail — это осознанный компромисс: он снижает риски, связанные с уязвимыми пользовательскими приложениями, но требует доверия к самому Firejail и своевременных обновлений.

В реальных пользовательских сценариях этот компромисс обычно оправдан, однако Firejail не стоит рассматривать как инструмент для защиты от целенаправленной локальной атаки.

Выводы

Firejail — это простой и практичный способ сделать вашу Linux-систему немного безопаснее. Его главный плюс в том, что не нужно ничего перестраивать: установили, запустили приложение через Firejail — и оно уже работает в песочнице.

Особенно полезен Firejail для изоляции проприетарного ПО, исходный код которого нельзя проверить. Мессенджеры, которые могут производить сомнительные операции с вашими данными, недоверенные исполняемые файлы или закрытые клиенты сервисов — всё это разумно запускать в ограниченной среде. По крайней мере, даже если что-то пойдёт не так, доступ к вашим SSH-ключам или личным документам будет заблокирован.

Однако важно понимать: никакая песочница не спасёт от осознанного запуска вредоносного кода. Если вы сами скачали и запустили подозрительный скрипт или программу из непроверенного источника, Firejail лишь ограничит масштаб возможного ущерба, но не гарантирует полную защиту. Безопасность начинается с ваших собственных решений: не запускать что попало, проверять источники, обновлять систему, следовать базовым правилам цифровой гигиены.

Не стоит воспринимать Firejail как панацею. Это не волшебная защита от всех угроз, а дополнительная страховка. Он не спасёт от уязвимостей в ядре и не заменит здравый смысл. Да, сам Firejail, как SUID-программа, тоже имел уязвимости, но в реальности для обычного пользователя преимущества от изоляции непроверенного приложения перевешивают эти риски.

В итоге: Firejail не сделает вашу систему неуязвимой, но существенно ограничит последствия, если что-то всё-таки пойдёт не так. Главное помнить: ответственность за безопасность всегда лежит на вас самих, а Firejail лишь поможет минимизировать риски от ваших повседневных действий.