FireJail — краткое и ознакомительное практическое руководство

Posted on Пн 20 января 2025 in misc

Источник

Сейчас существует прорва механизмов изоляции приложений --- от песочниц до виртуальных машин. Целей их применения тоже множество, но так или иначе всё сводится к тому что нужно ограничить доступ приложений к тем или иным ресурсам вычислительного устройства.

Ниже я хочу описать почти золотую середину в лице утилиты firejail в виде практических советов по использованию в первую очередь для обычных пользователей и (возможно) разработчиков.

Итак, firejail --- это утилита для создания песочницы произвольных приложений запущенных на дистрибутивах Linux. Она использует встроенные механизмы изоляции процессов и контроля системных вызовов в ядре Linux версии выше 3.0. За подробностями вы можете обратиться в man firejail.

Что может эта утилита?

  • запускать приложения из chroot окружения без необходимости sudo или su (с ограничениями);
  • изолировать сеть;
  • изолировать звук;
  • изолировать графику;
  • изолировать аппаратное ускорение графики;
  • ограничивать доступ к файловой системе по заданным правилам;
  • ограничивать доступ к исполняемым файлам по заданным правилам;
  • создавать приватный самоуничтожающийся домашний каталог для работы приложения;
  • использовать приватный домашний каталог для постоянной в нём работы приложения;
  • запрещать приложению делать системные вызовы на ваш выбор;
  • запрещать приложениям использовать повышение привилегий;
  • принуждать приложения работать в пространстве пользователя;
  • ограничивать процессорное время и доступ к ядрам CPU;
  • запрещать использовать системную шину D-BUS;
  • ...
  • и многое, многое другое.

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

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

Запуск произвольной программы, например playonlinux, происходит так: firejail playonlinux

В ответ в терминале будет виден лог:

Reading profile /etc/firejail/playonlinux.profile
Reading profile /etc/firejail/allow-perl.inc
Reading profile /etc/firejail/allow-python2.inc
Reading profile /etc/firejail/allow-python3.inc
Reading profile /etc/firejail/wine.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-devel.inc
Reading profile /etc/firejail/disable-interpreters.inc
Reading profile /etc/firejail/disable-programs.inc
Reading profile /etc/firejail/whitelist-var-common.inc
Warning: networking feature is disabled in Firejail configuration file
Parent pid 150639, child pid 150640

из которого становится понятно, что есть некие профили и это действительно так: в каталоге /etc/firejail надодится свыше тысячи заранее подготовленных профилей, разнообразных программ. Цель проста: дать доступ приложениям только к тому, что действительно им нужно.

Значит ли это что каждое приложение нужно запускать через терминал или вручную исправлять desktop-файлы? Нет! firejail может легко интегрироваться в систему и применять профили к приложения которые он знает. Для этого нужно выполнить:

  • sudo firecfg; Будет произведена подстановка симлинков в /usr/local/bin; теперь если вы запустите firefox или сhromium, они будут запущены с профилями, ограничивающими их доступ к файловой системе, командной оболочке и прочему тому, к чему доступа таким приложениям обычно не нужно. Тем самым увеличивается общая безопасность системы от потенциальных уязвимостей этих программ.

  • firecfg --fix без sudo исправит ваши desktop-файлы в каталоге ~/.local/share/applications автоматически.

  • firecfg --fix-sound исправит проблемы с некоторыми программами, которые запираются в песочнице по части звука.

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

  • sudo firecfg --clean и оно сбросит все созданные симлинки, как в системном, так и домашнем каталоге;

Кратко о профилях

Вас не устраивает готовый профиль для приложения. Например firefox

cp /etc/firejail/firefox.profile ~/.config/firejail/
edit ~/.config/firejail/firefox.profile

Далее редактируете так как вам нужно, или же вы можете создать пустой файл ~/.config/firejail/firefox.profile И подключить внешний профиль (по сути любой который вам нужен)

include /etc/firejail/firefox.profile
#допустим в дополнение к ограничениям основного профиля
#отключим доступ к 3d акселерации и звуку (бесполезный, но пример)
no3d
nosound

Вам хочется создать новый профиль для приложения

firejail --build appname #вывод шаблона профиля для приложения на стандартный вывод
#или
firejail --build=appname.profile appname #вывод шаблона в файл

Будет сгенерирован профиль с которым программа будет работать. Останется лишь отредактировать его под свои нужды, внеся те или иные ограничения, и разместить файл в ~/.config/firejail/, и всё. Полезно, что firejail умеет сам распознавать программы для которых у него есть профиль, например, если вы запустите

firejail wine ./app.exe

то firejail автоматически подключит профиль /etc/firejail/wine.profile. При этом вы можете в командной строке дополнить ограничения опциями в дополнение к тому, что есть в профиле программы. К примеру отключим ещё и сеть.

firejail --net=none wine ./app.exe

То, что firejail автоматически подгружает профиль не значит, что вы не можете его выбрать сами. Если вы считаете, что настройки ограничений одной программы подходят и вашей, то просто укажите иной профиль, например:

firejail --profile=playonlinux wine ./appname

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

Возможно вы создадите свой профиль для любых программ, «огороженный по самое не балуй». Всё зависит от ваших нужд. Важно помнить что firejail знает далеко не все программы в мире и для неизвестных будет использован профиль default.

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

  • Если Вам не хочется возится с профилями и нужно просто иногда запустить подозрительную программу или посмотреть, как программа ведёт себя в случае отсутствия или наличия тех или иных системных возможностей если вы, например, разработчик --- отлично, firejail замечательно для этого подходит.

Ниже я приведу список типичных задач, которые наверняка возникают у обычных пользователей, так как эта статья в первую очередь для них.

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

  • Это делается с помощью опции --private
firejail --private chromium

Для программы будет создан временный и пустой домашний каталог, программа будет иметь доступ к корню файловой системы, но для неё ваш /home/$USER будет пуст, и она запустится будто в первый раз. После закрытия программы временный каталог будет уничтожен.


Примечание к --private: Некоторые программы, в частности chromium, и всё, что основано на нём, будучи запущенными с ключом --private , заперты во временном домашнем каталоге, но если в таких программах открыть диалог выбора файлов, то он покажет всё что есть в системе. Я до сих пор не знаю, нормальное ли это поведение, ведь c firefox такого нет. Но исследуя профили можно понять, что опция запуска --dbus-user=filter или параметр профиля dbus-user filter решают эту проблему. Да, диалог выбора файла это внешний процесс, но он также должен быть, по-моему, заперт, если задан ключ --private, это недопустимо, на мой взгляд. И это стоит иметь в виду. Недовольство положением дел запечатлено в этом багрепорте Можно вовсе отключить dbus используя опцию --nodbus


Я запустил через firejail программу в фоне, как её закрыть?

  • запустите firejail --top выберите PID (число в начале) --top может ничего не показать, если приложение неактивно
  • или запустите firejail --list выберите PID (число в начале) предпочтительный вариант, просто выводит список всех песочниц
  • остановите приложение firejail --shutdown=PID Но советую поступать иным путём и давать запущенным процессам имена.
firejail --name=myserver ./server

Если нужно завершить процесс просто выполните

firejail --shutdown=myserver

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

Я запустил программу в песочнице firejail, как запустить ещё одну в той же песочнице?

  • Используйте --join=имя_или_пид Тут пригодятся имена особенно, PID процесса помнить неудобно, а узнавать лень. К примеру такая ситуация, у нас запущена программа в wine в «бутылке» и нам надо не прерывая программу вызвать winecfg.

Уже запущенная программа:

firejail --name=coolgame --net=none --private=~/cool_game wine ./cool_game.exe

Запустим winecfg в уже созданной песочнице

firejail --join=coolgame winecfg

Есть момент, если вы нажмёте ctrl+c в терминале где запущена программа ./cool_game.exe, приглашение ввода $ с мигающим курсором не появится так как в песочнице остался процесс winecfg. Если всё же закрыть окно терминала с игрой то закроется и winecfg, так как родительная песочница будет уничтожена. Подключаться к уже работающей песочнице удобно и полезно по многим причинам, не прерывая основной процесс. Не запускать и не дублировать опции для запуска нового приложения и прочее.

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

  • Это тоже делает опция --private, но с указанием каталога --private=you_fake_home_dir --- это удобно, по множеству причин, скрыть от программы ваши файлы, не замусоривать ваш домашний каталог, создать рабочее окружение для конкретной программы и прочее прочее. Будто вы запускаете приложение от нового пользователя в его домашнем каталоге. Или вы хотите иметь к примеру браузер, но в нескольких вариациях настройки. К примеру.
mkdir firefox_develop #плагины для разработки, аккаунты для разработки
mkdir firefox_relax #социальные сети, отдых и развлечения
mkdir firefox_test #эксперименты с браузером, тестовые расширения, прочее

firejail --dbus-user=none --private=~/firefox_develop firefox
firejail --dbus-user=none --private=~/firefox_relax firefox
firejail --dbus-user=none --private=~/firefox_test firefox

И снова вы видите опцию --dbus-user, но уже с параметром none здесь это нужно для того чтобы прервать dbus-сообщение от нового процесса. Иначе firefox просто откроет новое окно/вкладку, узнав что его запускают когда он уже запущен, это также касается и других приложений, например nautilus из gnome или nemo из cinnamon. Если один экземпляр уже запущен, то новый будет запущен уже не в песочнице, а просто запущен форк текущего процесса. Другим же приложениям, которые просто запускают новый самостоятельный процесс без изысков, эта опция ненужна.

Опция --private=dir отлично подходит для игроков использующих например wine и позволяет создавать своего рода «бутылку» и отлично подходит в качестве замены playonlinux или же дополняет его, лично я использую последнее. К сожалению, о таких нюансах нужно помнить. Вернее о том что программы могут общаться друг с другом через посредника в лице системной шины межпроцессного взаимодействия dbus.

Я хочу, чтобы программа не имела доступа к моему экрану. Или не имела доступа к графическому серверу вовсе.

  • Это делает опция --x11
  • без параметров или с именем сервера --x11=server_name см. firejail --help | grep 'x11 Это полезно если, например, ваша недоверенная программа нуждается в интернете, и вы ей это позволили, но вы беспокоитесь, что программа может делать снимки экрана и отсылать их странным личностям. К примеру попробуем сделать снимок экрана сами.
firejail --nodbus --x11 gnome-screenshot

В вашем домашнем каталоге появится чёрный снимок экрана. А не снимок вашего рабочего стола. И опять dbus в нашем случае мы просто полностью блокируем dbus для приложения. см firejail --help | grep dbus Иначе будет реально получен снимок экрана рабочего стола :D

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

  • Для этого есть опция --whitelist=файл_или_каталог К примеру, запустим файловый менеджер nemo с доступом к каталогу test и файлу file.txt
firejail --nodbus --whitelist=~/testfile.txt --whitelist=~/test nemo

В открывшемся окне файлового менеджера будет каталог и файл. Всё, что будет записано в файл и создано в каталоге, будет сохранено, всё иное после завершения программы будет уничтожено. Это полезно если вы хотите обработать программой файл или каталог, но сопутствующий работе программы мусор вам не нужен (к примеру ещё одна запись в вашем ~/.config).

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

  • за это отвечает опция --private-home=список,фалов,каталогов через запятую Опция отчасти подобна --whitelist но она создаёт временный домашний каталог в tmpfs и копирует указанные файлы/каталоги туда, так что программа получает к ним полный доступ, но оригинальные файлы остаются нетронуты. Особенно подчеркну, файлы копируются запуск займёт время и оперативную память. Это полезно если вы хотите обработать файлы чем-то, но не уверены в успехе и боитесь повредить оригиналы. Ещё раз внимание, у этой опции неконфигурируемое (на данный момент) ограничение в 500MB. Скопируется всё что влезет в эти рамки, и песочница с программой будет запущена несмотря на то, что не всё скопировалось! Явная недоработка. Больше похоже на костыль чем возможность. Надеюсь доведут до ума и добавят опцию указания лимита на копирование. Но если очень надо можете исправить вот тут и пересобрать. К примеру есть ряд фото для обработки и хочется поэкспериментировать.
firejail --private-home=~/клёвые_картинки,~/фотки_с_моря,~/йя.jpg gimp

Я хочу дать программе доступ ко всем файлам, но подменить один из каталогов на пустой.

  • Для этого есть опция --tmpfs=dir каталог должен принадлежать пользователю! Суть проста, указанный каталог будет подменён на такой же, но пустой, созданный в tmpfs после работы программы, активность программы в этих каталогах будет уничтожена. Например:
ls .vim #в каталоге есть файлы
autoload bundle css.vim doc indent plugin session sessions UltiSnips view
firejail --noprofile --tmpfs=.vim bash #отключим профиль по умолчанию иначе нас просто не пустит в каталог '.vim'
Parent pid 343835, child pid 343836
Child process initialized in 22.60 ms
ls .vim #для этого 'bash' процесса каталог пуст
touch .vim/testfile # и каталог доступен для записи
ls .vim
testfile
exit

Parent is shutting down, bye...
ls .vim #после выхода всё на своих местах и следов деятельности нет
autoload bundle css.vim doc indent plugin session sessions UltiSnips view

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

Я хочу автоматически ~~грохнуть~~ завершить приложение через определённое время

  • Опция --timeout=часы:минуты:секунды сделает это для вас. Простейший пример установим sleep на час, а завершим за 5 секунд.
firejail --timeout=0:0:5 sleep 3600
...
#после 5ти секунд
...
Parent is shutting down, bye...

Но тут есть опять нюансы с некоторыми приложениями, пусть будет ещё раз упомянуто, если это поможет избежать проблем. Попробуем запустить терминал tilix и тоже закрыть его через 5 секунд.

firejail --timeout=0:0:5 tilix

firejail ничего про tilix не знает и будет использовать default.profile который достаточно строг и приведёт к сообщению /usr/bin/tilix: Отказано в доступе. Что же, приложению мы доверяем, поэтому просто отключим профили

firejail --noprofile --timeout=0:0:5 tilix

Запустилось! Ждём 5 секунд и ничего... Окно терминала продолжает висеть. Да, я снова напомню про dbus: нужно не давать общаться по шине dbus с такми же приложениям. А их в экосистеме GTK (и не только) много. Впрочем, если бы других терминалов tilix запущено не было, то окно бы закрылось. Ну и теперь.

firejail --noprofile --nodbus --timeout=0:0:5 tilix

Окно терминала будет открыто и через 5 секунд закрыто. Всё работает, как это применять? Ну думаю вы сами придумаете случаи когда вам нужно запускать приложения только на определённое время.

Учитывая подобные нюансы, вернусь к упоминанию профилей. Идея занести всё в файл профиля с коллекцией определённых параметров под разные ваши нужны уже не кажется такой плохой поэтому если у вас часто возникают случаи запуска приложений с множеством параметров (часто одинаковых), то есть смысл занести всё это в файл ~/.config/firejail/paranoia.profile, имя тут произвольное и внести туда часто используемые параметры и использовать firejail --profile=paranoya appname как способ короткой записи множества ключей. Конечно никто не отменяет скриптов или функций в ~/.bashrc но уверяю: иметь коллекцию профилей для разных ситуаций очень удобно, понимание этого приходит когда выявляются общие шаблоны работы с приложениями. Хотя для редкого использования от случая к случаю всё это конечно излишества. Едем дальше.

Мне нужно запустить скрипт в специфическом шелле или без него, напрямую

  • опция --shell=/полный/путь/исполняемый_файл делает это Будет выполнено как fish -c "~/fish_scripts/app.sh"
firejain --shell=/bin/fish ~/fish_scripts/app.sh

Будет выполнено напрямую без использования командных оболочек

firejail --shell=none appname

А как мне подставить или подменить переменные окружения?

  • устанавливает переменную окружения опция --env=
  • уделяет переменную окружения опция --rmenv=
firejail --rmenv=DISPLAY appname #удалить
firejail --env=DISPLAY= appname #затереть
firejail --env=DISPLAY=:1 appname #подменить

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

Как дать доступ к файлу и каталогу только на чтение?

  • --read-only=файл_или_каталог Например, откроем файловый менеджер с домашним каталогов в режиме «только чтение»:
firejail --read-only=/home/$USER --nodbus nemo

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

  • firejail много пишет о своём запуске, как это убрать
  • --quiet полезно если надо получить вывод программы, а не кучу отладки от firejail Особенно важно когда нам надо получить полезный вывод программы в файл без мусора.
firejail --quiet ls > list.txt

Я запустил программу с опцией --private, как мне передать файл в песочницу?

  • опция --put даёт возможность скопировать файл в запущенную песочницу

Как обезопасится от форк-бомбы? Или просто ограничить количество порождённых процессов?

  • --rlimit-nproc=максимальное_число_процессов Напишем форк-бомбу
#include <unistd.h>
#include <stdio.h>

int main()
{
 int count = 1;
 while(count++)
 {
  fork();
  printf("%d\n",count);
 }
}

скомпилируем и запустим

gcc main.c -o bomb
firejail --rlimit-nproc=1 ./bomb

Оно конечно начнёт загружать все ядра, но не на полную и не застопорит систему. ctrl+c завершит все процессы.

Я хочу дать программе только несколько ядер процессора

  • --cpu=ядро,ядро,ядро через запятую указываем номера ядер Продолжая тему с форк-бомбой, давайте умерим её аппетиты по ядрам. Дадим бомбе два ядра первое 0 и третье 2 0,1,2 -> 1,2,3
firejail --rlimit-nproc=1 --cpu=0,2 ./bomb

Также полезно использовать для отладки программ в работе с разным количеством ядер.

Я хочу дать программе только определённое количество процессорного времени

  • --rlimi-cpu=секунды Наша форк-бомба ограничена на форки, имеет доступ к паре ядер, давайте теперь дадим ей 5 секунд процессорного времени, и если она не успеет завершится, процесс будет убит.
firejail --rlimit-nproc=1 --cpu=0,2 --rlimit-cpu=5 ./bomb

Не успевши разогнаться, программа быстро израсходовала вычислительное время и была убита. Процессорное время в секундах, например 5, не значит что программа будет работать 5 секунд, это значит, что процессор в сумме потратит на программу не более 5 секунд своего времени. Например программа программа yes с временем процесса в одну секунду работала почти три.

time firejail --rlimit-cpu=1 yes
...
real 0m2,618s
user 0m0,025s
sys  0m1,061s

Эта квота программе. Успела отработать --- молодец! Не успела? Будешь убита.

Как работать с chroot?

  • очень просто и удобно с опцией --chroot=каталог Если вы развернули chroot окружение через debootstrap или подобное. Например у меня есть каталог ~/wine_games внутри есть пользователь gamer и я хочу запустить firefox установленный в chroot.
firejail --noprofile --env=HOME=/home/gamer --chroot=~/wine_games firefox

или запустить командную оболочку fish которая отсутствует у меня в основной системе

firejail --noprofile --env=HOME=/home/gamer --chroot=~/wine_games fish

Для входа в chroot окружение нам не нужны sudo или su --- логин произведётся автоматически под пользователя с ID 1000, /proc /dev и прочее будут уже смонтированы и настроены. Ничего делать не нужно.

Я хочу запустить программу на другом IP и DNS и ещё задать интерфейс сетевой и MTU поменять

  • Легко!
firejail --dns=8.8.8.8 --ip=192.168.0.111 --net=etn1 --mtu=1492 appname

Тоже очень удобная возможность, помимо описанного можно подключиться к bridge, уcтановить параметры ipv6, подключиться к сети другой песочницы через --join-network=имя_или_пид, производить мониторинг сети через --netstats песочницы. И не только! Подмена сети для приложения, тестирование ваших сетевых программ, создание изолированной сети для экспериментов. Очень полезно. Как говорилось выше --net=none просто отключает сеть.

  • В дополнение к этому коллекция опций типа --protocol= позволит вам фильтровать протоколы взаимодействия:
    • unix;
    • inet;
    • inet6;
    • netlink;
    • packet;
    • bluetooth;
    • и другие

Так же можно узнать какие протоколы передачи данных использует программа через --debug-protocols

Заключение

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

  • --no3d отключить аппаратное ускорение графики
  • --noexec=файл_или_каталог запретить исполнение файла или содержимого каталога
  • --nosound отключить звук
  • --nonewprivs запретить повышение привилегий
  • --noroot только пользовательские процессы
  • --oom=от -1000 до 1000 задать параметр OOM ядра для конкретного приложения
  • --private-bin=bash,wine,ls,pwd,иное запустить программу с ограниченным списком других программ для запуска

И ещё куча всего включая наиважнейшую коллекцию параметров --seccomp https://ru.wikipedia.org/wiki/Seccomp по фильтрации системных вызов.

Будучи вызвана без параметров, опция --seccomp включает фильтры по умолчанию. Дополнительные параметры и расширенные варианты этой опции позволят сделать точную настройку допустимых системных вызовов. Рекомендую включать всегда Описывать частные случаи думаю излишне нужно явно изучить эту возможность из man firejail.

Аналогичная ситуация и с параметрами разряда --caps это разграничение прав root на уровне ядра, позволяет включать и выключать возможности доступа суперпользователя. Без параметров выключает некоторые критические возможности. Полный список тут. Расширенные версии параметра --caps отвечают за пропуск/отбрасывание/блокирование возможностей. рекомендую включать всегда особенно для приложений которым не нужны root привилегии --caps.drop=all. Опять же подробности лучше выяснить в man firejail

Так что для сторонних приложений желательно всегда включать эти опции. Типичный случай запуска игры в wine где xyzgame.exe находится в каталоге dir_for_game wine и заперта в нём.

firejail --name=xyzgame --seccomp --caps.drop=all --net=none --nice=1 --nodbus --private=~/dir_for_game wine ./xyzgame.exe

Это ещё далеко не параноидальный запуск. Но базовые ограничения на месте:

  • нет сети;
  • ваши файлы спрятаны;
  • вся деятельность убрана в отдельный каталог;
  • нет доступа к тому к чему в принципе не должно быть;

Также я не упомянул про работу с su и sudo. Да, firejail позволяет регулировать доступы права для root например, для запуска вебсервера или системного демона и ограничения его доступа к определённому каталогу/файлу/файлам и прочему.

Тут опасен сам пользователь, причём косвенно, когда вы часто работаете с firejail у вас в голове часто будет мысль мол, «сейчас я под firejail с вот такими настройками я могу себе позволить это и это не боясь что-то повредить» но иногда эти мысли расходятся с реальностью, вы забыли запустить firejail в интерактивной сессии или перепутали окно эмулятора терминала и думая что вы в песочнице позволили себе вольности. Помните, эта психологическая удочка может сильно крючки под ногти загнать. Да, вы в песочнице, а может, нет! Проверьте, перед опасными действиями! Избегайте опасных действий по мере возможности. Песочница отключает только отдельные части огромного множества, а не делает вашу систему неуязвимой от своих же рук. Будте бдительны.

Ознакомьтесь с этим и всем иным в:

  • firejail --help;
  • man firejail;

Сопутствующие утилиты:

  • firecfg;
  • firemon;

Графические утилиты:

  • firetools;
  • firejail-ui;

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


Несмотря на все песнопения в сторону firejail, это не серебряная пуля. Есть альтернативы, например, Bubblewrap который ещё и более безопасен сам по себе архитектурно. Есть и иные проекты. Просто firejail, несмотря на свою крохотность, подходит и для обычных пользователей, и для администраторов, и для разработчиков. Вкупе с простыми ключами запуска «на результат» есть и огромная куча тонких настроек для более искушённых людей. За этими широкими возможностями скрывается одно «НО»! Несмотря на то, что утилита является песочницей для повышения безопасности системы в целом, она является SUID https://ru.wikipedia.org/wiki/Suid Это значит, что ошибка в самом firejail может дорого стоить. Нельзя не упомянуть про прошлые CVE Девять серьёзных уязвимостей в Firejail

Утилита действительно удобна:

  • простым пользователям она даёт простые ключи запуска для самых «горячих» вариантов использования;
  • более продвинутым выдаётся весь спектр гибких инструментов. Причём первым можно на вторых внимания не обращать, обезопасить свои файлы и ограничить сеть, и экран в 90% случаев достаточно.

Использовать ли миниатюрную утилиту практически без зависимостей с ворохом возможностей и потенциальными SUID-уязвимостями --- решать вам. На этом считаю что написанного выше для ознакомления достаточно ::)