Сейчас существует прорва механизмов изоляции приложений — от песочниц до виртуальных машин. Целей их применения тоже множество, но так или иначе всё сводится к тому что нужно ограничить доступ приложений к тем или иным ресурсам вычислительного устройства.
Ниже я хочу описать почти золотую середину в лице утилиты 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-уязвимостями — решать вам.
На этом считаю что написанного выше для ознакомления достаточно ::)