LINUX.ORG.RU

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

 , , , ,

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

40

3

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

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

★★★★★

Проверено: maxcom ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 28)

Годно. Нужно. Использую firejail для запуска всего не-опенсорсного (99.9% из этого — игры. Также стим. Для каждой игры — свой хомяк). Плюс иногда «запираю» и кое-что опенсорсное (например несколько копий браузера с разным «домашним каталогом» для каждого. Иногда это также удобно не только с т.з. безопасности, а тупо чтобы запереть что-то в определённом домашнем каталоге, чтобы оно не загадило всё вокруг, например, или чтобы разные копии программы не конфликтовали за файлы в хомяке между собой (например разные конфиги для программ, не позволяющих это задать самостоятельно) и т.п.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Для каждой игры — свой хомяк

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

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

Именно.

LINUX-ORG-RU ★★★★★
() автор топика

Первая полезная статья на лоре. Схоронил в закладки.

ox55ff ★★★★★
()

Отличная статья. Пользоваться я этим, конечно же, не буду, так как предпочитаю bubblewrap.

Некоторые опечатки:

само уничтожающийся

самоуничтожающийся

когда вы часто работаете с firejail

Полный список тут[ТОЧКА] Расширенные версии

подключится к bridge[ЗАПЯТАЯ] установить параметры ipv6[ЗАПЯТАЯ] подключится к сети другой песочницы через –join-network=имя_или_пид[ЗАПЯТАЯ] производить мониторинг сети через –netstats песочницы

фильтровать протоколы взаимодействия

packet; bluetooth;

нужны sudo или su логин произведётся автоматически под пользователя с ID 1000[ЗАПЯТАЯ] /proc /dev и прочее будут уже смонтированы и настроены.

которые наверняка возникают[УДАЛИТЬ ЗАПЯТУЮ] у обычных пользователей

ограничивать доступ

Почему ЛОР-markdown не хочет выделять жирным/зачеркивать запятые – мне лично неясно.

Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 1)
Ответ на: комментарий от posixbit

TODO

Being able to spawn an independent Xwayland server. Needs compositor support. How do I ask GNOME team to consider such option?

Он еще не знает.

Siborgium ★★★★★
()
Ответ на: комментарий от hobbit

Хорошо. Здесь, кстати,

подключиться к bridge[ЗАПЯТАЯ] установить параметры ipv6[ЗАПЯТАЯ] подключиться к сети другой песочницы через –join-network=имя_или_пид[ЗАПЯТАЯ] производить мониторинг сети через –netstats песочницы

еще и тся/ться надо подправить.

Siborgium ★★★★★
()

Лол. Попробовал я как-то, помнится, запустить firecfg в дебиане. Оно настолько залочило каждый пук, что даже сраный gwenview отказался запускаться. Глянул я на это и откатил всё назад.

Всё по классике — если излишняя безопасность мешает жить, на безопасность забивают.

alegz ★★★★
()
Ответ на: комментарий от alegz

если излишняя безопасность мешает жить, на безопасность забивают

Всё так

Original_1
()
Ответ на: комментарий от alegz

У меня всё работало, кроме хромоногих браузеров - не было доступа к какому-то /dev/blablabla и мне было лень разбираться.

Если в дебиане ничего не работало, то это творчество мантейнеров дебиана, знаменитых своей неадекватностью.

alex1101
()
Ответ на: комментарий от alex1101

мне было лень разбираться

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

alex1101
()
Ответ на: комментарий от posixbit

На полноту я не претендовал. Вариантов написания firejail в статье масса, действительно нужно привести в единообразный вид.

Siborgium ★★★★★
()
Ответ на: комментарий от alex1101

где куча конфигов наследует настройки друг друга.

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

mky ★★★★★
()
Ответ на: комментарий от mky

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

Я тоже за все опции в конкретном готовом профиле без include пусть и избыточно зато всё сразу видно и понятно.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Спасибо за статью.

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

Дальше я буду писать с позиции обычного пользователя, или, если хотите, начинающего. Которым, собственно, я и являюсь.

А зачем? Зачем мне она нужна и нужна ли она? Да выглядит красиво, чтобы что-то там не лезло куда не надо. Но я кучу раз слышал, «винда дырявое решето, не то что линукс, вот там с безопасностью все ок». А тут говорится про анальное огораживание всего и вся.

Как пример, тот же браузер firefox.

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

Хорошо? Хорошо! А зачем? Может ли «злоумышленник» получить к ним доступ через браузер? Если да, то что это за дырявое решето, если нет, то и смысла нет. И так со всеми остальными приложениями, на которые мне создавались симлинки, при использовании: sudo firecfg

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

Кроме того, столкнулся с проблемой: виртуалбох, ругался «не вижу установочный образ». Благо тут просто: нужно добавить доступ к соответствующему каталогу. Так же заметил отсутствие сети, на установленной виртуальной машине. firecfg --clean не помогло, но возможно сам накосячил при установке, поэтому не будут утверждать, что виновата песочница. Т.к. образ минимального арча, для экспериментов, устанавливал до песочницы, а вот полез экспериментировать после.

@LINUX-ORG-RU

Да и нужно то ограничивать не софт из реп, а всякий левый или экспериментальный

Вот с этого хорошо было бы начать. Особенно с прицелом на «обычных пользователей». Что песочница, это не про программы из репозиториев, а про программы скачанные из сомнительных источников. А кроме этого, с ней еще можно сделать … и далее по списку.

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

Я предполагаю, что можно вручную сделать симлинк, по аналогии с симлинками от команды sudo firecfg, но только на нужную программу. И тогда она будет по умолчанию запускаться в песочнице. Конечно это не даст возможность реализовать те варианты, где одна и та же программа запускается в разных каталогах. За-то не надо сомневаться, в песочнице или нет.

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

sudo pacman -S firejail
sudo ln /usr/bin/firejail /usr/local/bin/XXX
#создание профиля для XXX или использования готового, если он есть

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

З.Ы. Если у кого-то есть время и желание, то мне лично, не хватает статей по типу:

  • linux и безопасность в 22 году для домашнего пользователя. Отчего надо защищаться, а от чего нет. Актуальные способы. И повторять ее хотя бы раз в пару лет :)
  • Файрволл для начинающего с разбором, того что это, для чего он нужен и как его правильно настроить. Нет, я знаю как его установить, знаю как включить. Но нужен ли он? А если нужен, то что с ним делать после установки? На примере gufw, достаточно ли его включить и выбрать профиль дом? Или надо настроить что-то дополнительно? К примеру заблокировать порты, он же для этого и предназначен. Как понять, какие именно порты надо блокировать или наоборот блокировать все и разрешать отдельные порты (что, по идее правильно). Как понять, что какая-то программа требует порт для работы или сливает через него всю твою порнографию?
  • Первые действия после установки linux Статья на разбор, того, что нужно сделать после установки любого дистрибутива и не в плане, поменяйте обои или подкрутите этот параметр для получения дополнительных попугаев. А в плане что нужно проверить, чтобы быть уверенным в бесперебойной работе системы. К примеру лог загрузки, лог иксов… включен тот же файерволл, если ситуация с безопасностью в 22 году, требует оного. Еще что-нибудь, о чем я новичок и не подозревает. К примеру, тот же dmesg содержит кучу сообщений, как его правильно анализировать, в каких случаях бить тревогу, а в каких забить. С чем лично я столкнулся (даже тему создавал) анализ journalctl -p4..0 -b 0 выдал 200+ строк сообщений, у системы работающей в лучшем случае, 5 минут. На тот момент, я знал только, что большинство сообщений относятся к 4 уровню и являются предупреждениями. Но нужно ли с ними что-то делать, я и сейчас не знаю. Возможно с примерами из личной практики, сисадмина, который поставил 100500 систему.
ComIngSoon
()

Уууу, гуй нужон. Кто там себе дипломную хотел?

Я по крестьянски пользую это:

alias mustdie='firejail --net=none wine '

Потом

mustdie SkyrimSE.exe
DumLemming ★★☆
()
Ответ на: комментарий от ComIngSoon

З.Ы. Если у кого-то есть время и желание, то мне лично, не хватает статей по типу:

Второе и третье — снова статьи для начинающих. Их и так в интернете пруд пруди. Как по мне, ценность представляет как раз либо что-то рассчитанное на продвинутого пользователя, либо подходящее и новичку, но менее стандартное/мейнстримовое, о чём легко даже не подумать погуглить.

CrX ★★★★★
()
Ответ на: комментарий от DumLemming

А хомяк в winecfg закрыт

Это не закрытие. Да и конфиг выходит для каждой игры одинаковый.

Я с виндоиграми поступаю так: кидаю каталог игры, названный game в пустой каталог, создаю пустой каталог profile, а рядом кладу start.sh с содержанием вроде

#!/bin/sh
EXENAME="Skyrim.exe"
cd "$(dirname "$0")"
export WINEPREFIX="$(pwd)/prefix"
# тут добавляю, если ещё какие экспорты нужны, например для отображения FPS в DXVK
cd game
exec wine "$EXENAME" "$@"

И запускаю как firejail --net=none --private=. ./start.sh (оно на алиасе, естественно).

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

Примерно похожим образом я поступаю и с нативными играми, кстати.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

Это не закрытие

Как это? Виндовая программа может прочитать файл не используя винапи? Или винапи не контроллируется конфигурацией вина?

DumLemming ★★☆
()
Ответ на: комментарий от DumLemming

Гуй есть в статье упомянут, но он не очень. Единственное что норм Tools вызываемый из контекстного меню унылой запускалки. Но я и его не использую, там полезное только top и join в файловую систему песочницы. Проще и быстрее команды использовать. А так да, качественный не на отвали продуманный (очень важно чтобы продуманный) гуй был бы к месту.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от DumLemming

Или винапи не контроллируется конфигурацией вина?

Как минимум сложно контроллируется, и легко допустить ошибку. Firejail явно надёжнее будет, тем более он всё равно используется. Там куча симлинков, диск z:\ и прочее-прочее. Наверное можно это всё убрать и надеяться, что точно нигде ничего не просочится, но это ненадёжно.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

@Vsevolod-linuxoid

Вроде так:

$mkdir wine32
$firejail --private=wine32 --env=WINEARCH=win32 wine wineboot
$ cat wine32/.wine/system.reg | grep "arch=win32"
$#arch=win32
$mkdir wine64
$firejail --private=wine64 --env=WINEARCH=win64 wine wineboot
$ cat wine64/.wine/system.reg | grep "arch=win64"
$#arch=win64

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

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Как вариант можно просто firejail --private=wine1, получить шелл внутри сэндбокса, там уже нарулить всё, что хотел с WINEARCH, winecfg, winetricks если надо, спокойненько, а потом уже запускать как обычно.

CrX ★★★★★
()

использовать приватный домашний каталог для постоянной в нём работы приложения; *запрещать приложению делать системные вызовы на ваш выбор;

Тут вроде ненумерованный пункт приклеился к предыдущему.

gutaper ★★★★★
()
Ответ на: комментарий от gutaper

Ага, спасибо поправил. У меня дежавю будто я это место раз третий правлю

LINUX-ORG-RU ★★★★★
() автор топика

Так я не понял. Для своей работы FireJail использует AppArmor. А в этом AppArmor зачастую либо кривые ограничения, либо дефолтные такие, что мешают нормальному исполнению программ даже входящих в сам Linux-дистрибутив. Поэтому, чтобы запустить программу, чтобы заработала подсистема, которую не учли в AppArmor, приходится отключать AppArmor, ибо исправлять правила себе дороже.

А для работы FireJail этот AppArmor надо взад включать?

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Для своей работы FireJail использует AppArmor

Да, apparmor это просто опция. Можно пересобрать без включения его по умолчанию, если хочется капитально.

  • Можно игнорировать apparmor при запуске приложения если у в конфиге приложения написано apparmor

    • firejail --ignore=apparmor appname --ignore=имяопции вырубает любую настройку из профиля приложения
  • Можно скопировать профиль проблемной программы себе в .config/firejail с тем же именем конфига чтобы просто продолжать запускать приложение без ключа игнорирования опции apparmor

    • поменять apparmor на ignore apparmor в твоём .config/firejail/appname.pfofile

Хотя я в подробности не вникал и проблем которые требовали отключать апепеармор не ловил.

LINUX-ORG-RU ★★★★★
() автор топика
28 января 2023 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.