Firejail (Русский)

Firejail - это простая в использовании Setuid программа-песочница, снижающая риск нарушения безопасности, ограничивая среду запуска недоверенных приложений с помощью пространств имен Linux, seccomp-bpf и возможностей Linux.

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

Установка

Установите либо пакет firejail, либо firejail-gitAUR. Также доступно приложение GUI для работы с Firejail - firetools.

Примечание Для информации об user_namespaces(7) поддерживаемом в ядрах Arch Linux, смотрите Запуск приложений в песочнице. Firejail can use it even if it is disabled.
Важно Несмотря на то, что upstream постепенно переходит на белые списки (ср. /etc/firejail/firefox.profile), большинство поставляемых профилей по-прежнему в значительной степени опираются на черные списки. Это означает, что все, что явно не запрещено профилем, будет доступно приложению. Например, если у вас есть снимки btrfs, доступные в /mnt/btrfs, изолированной программе может быть запрещен доступ к $HOME/.ssh, но она все равно сможет получить доступ к /mnt/btrfs/@some-snapshot/$HOME/.ssh. Обязательно проведите аудит своих профилей; см. #Профили тестирования.

Конфигурация

Большинству пользователей не потребуется никакой пользовательской конфигурации и они могут перейти к следующим действиям #Использование.

Firejail использует профили для установки защиты безопасности для каждого из приложений, выполняемых внутри него - профили по умолчанию можно найти в /etc/firejail/application.profile. Если вам требуются пользовательские профили для приложений, не включенных в пакет, или вы хотите изменить значения по умолчанию, то можете поместить новые правила или копии значений по умолчанию в каталог . Вы можете иметь несколько файлов пользовательских профилей для одного приложения, а также использовать один и тот же файл профиля для нескольких приложений.

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

Обратитесь к firejail-profile(5).

Использование

Чтобы выполнить приложение, используя защиту firejail по умолчанию для этого приложения (профиль по умолчанию), выполните следующее:

$ firejail program_name

Разовые дополнения к профилю по умолчанию могут быть добавлены как опции командной строки (см. firejail(1)). Например, чтобы выполнить okular с защитой seccomp, выполните следующее:

$ firejail --seccomp okular

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

$ firejail --profile=/absolute/path/to/profile program_name

Использование Firejail по-умолчанию

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

$ sudo firecfg

Это создает символические ссылки в /usr/local/bin, указывающие на /usr/bin/firejail для программ, для которых Firejail имеет профили по умолчанию или созданные самостоятельно. Обратите внимание, что firecfg(1) только симлинкует программы, перечисленные в /etc/firejail/firecfg.config. Некоторые программы CLI отсутствуют, такие как: tar, curl и git. Им ссылки необходимо указывать вручную. О том, почему они не включены, смотрите Профили не в firecfg #2507. firecfg дополнительно добавляет текущего пользователя в базу данных доступа пользователей Firejail и проверяет файлы /usr/share/applications/*.desktop, если они содержат полный путь к соответствующему исполняемому файлу, удаляет полный путь и копирует их в . Это гарантирует, что будут использованы симлинки в /usr/local/bin, что предотвращает обход Firejail. Если sudo не установлен в вашей системе, то следует выполнить:

# firecfg

от root и

$ firecfg --fix

как пользователь, чтобы исправить файлы .desktop.

Возможны случаи, когда потребуется вручную изменить строку Exec= в файле .desktop в ~/.local/share/applications/ для явного вызова Firejail.

Совет pacman hook можно использовать для автоматического запуска firecfg при выполнении операций pacman:
/etc/pacman.d/hooks/firejail.hook
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Operation = Remove
Target = usr/bin/*
Target = usr/local/bin/*
Target = usr/share/applications/*.desktop

[Action]
Description = Configure symlinks in /usr/local/bin based on firecfg.config...
When = PostTransaction
Depends = firejail
Exec = /bin/sh -c 'firecfg >/dev/null 2>&1'

Чтобы вручную отобразить отдельные приложения, выполните:

# ln -s /usr/bin/firejail /usr/local/bin/application
Примечание
  • /usr/local/bin должен быть установлен перед /usr/bin и /bin в переменной окружения PATH.
  • Убедитесь, что значение PATH изменено для корректного запуска вашего окружения рабочего стола или оконного менеджера. Например, при запуске i3 с помощью .xinitrc убедитесь в правильности установки PATH в ~/.profile. При использовании менеджера входа в систему ly в файле /etc/ly/config.ini есть возможность задать путь вручную.
  • Чтобы запустить символьную программу с пользовательскими настройками Firejail - просто добавьте префикс firejail, как показано в #Конфигурация.
  • Для демона вам нужно будет перезаписать файл systemd unit для этого демона, чтобы вызвать firejail, см. Редактирование файлов юнитов.
  • Символические ссылки на gzip и xz мешают makepkgвозможности предварительной загрузки libfakeroot.so. См. BBS#230913.

Использование с hardened_malloc

Примечание Некоторые программы не будут работать с использованием libhardened_malloc.so, например, PyCharm, Firefox.

hardened_mallocAUR это усиленная реализация распределителя glibc malloc(), изначально написанная для Android, но расширенная для использования на настольных компьютерах. Хотя он еще не интегрирован в glibc, его можно использовать выборочно с помощью LD_PRELOAD. Ниже показан правильный способ запуска приложения в firejail с использованием hardened_malloc. Чтобы сделать его постоянным, вам нужно создать собственную запись в /usr/local/bin для нужного приложения.

$ firejail --env=LD_PRELOAD='/usr/lib/libhardened_malloc.so' /usr/bin/firefox

В качестве альтернативы добавьте следующее в пользовательский профиль:

env LD_PRELOAD=/usr/lib/libhardened_malloc.so

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

Включение поддержки AppArmor

Начиная с версии 0.9.60-1, Firejail поддерживает более прямую интеграцию с AppArmor через общий профиль AppArmor. Во время установки профиль firejail-default помещается в каталог /etc/apparmor.d, и его необходимо загрузить в ядро, выполнив следующую команду от root:

# apparmor_parser -r /etc/apparmor.d/firejail-default

Смотрите firejail(1) § APPARMOR.

Локальная настройка профиля apparmor поддерживается путем редактирования файла /etc/apparmor.d/local/firejail-local

AppArmor уже включен для большего количества профилей Firejail. Есть несколько способов включить ограничение AppArmor поверх профиля безопасности Firejail:

  • Передайте флаг --apparmor в Firejail в командной строке, например, .
  • Используйте пользовательский профиль и добавьте команду --apparmor.
  • Включите Apparmor глобально в /etc/firejail/globals.local и отключите по мере необходимости с помощью ignore apparmor в /etc/firejail/ProgramName.local.

Обратите внимание, что включение AppArmor вышеуказанными методами всегда означает, что используется /etc/apparmor.d/firejail-default. Если вы хотите использовать конкретный профиль AppArmor для приложения - вам нужно использовать упомянутую выше команду ignore apparmor. Однако это не рекомендуется, поскольку использование Firejail и AppArmor для одних и тех же приложений часто создает проблемы.

Проверка использования Firejail

$ firejail --list

Более полный результат дает

$ firejail --tree

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

Белые и черные списки

Черные списки активно используются в различных /etc/firejail/*.inc файлах, которые включены в большинство профилей. Черные списки бывают разрешающими:

  • Запретить доступ к директории или файлу и разрешить все остальное: blacklist <directory/file>
  • Запретить/отменить/игнорировать черный список каталога или файла, уже внесенного в черный список, например, в файле *.inc: noblacklist <directory/file>

Порядок их появления в профиле важен: директивы noblacklist должны быть добавлены выше директив blacklist.

Белые списки блокируют все, что не включено в явный белый список. Их не следует использовать в профилях приложений, которым нужен доступ к произвольным местам (например, текстовые редакторы, просмотрщики/редакторы изображений).

  • Разрешить доступ к каталогу или файлу и запретить все остальное: whitelist <directory/file>
  • Запретить/отменить/игнорировать белый список каталога или файла, уже включенного в белый список, например, в файле *.inc: nowhitelist <directory/file>

Порядок их появления в профиле важен: директивы nowhitelist должны быть добавлены выше директив whitelist.

Белый список всегда составляется перед черным списком. Как уже говорилось, директива белого списка заносит в черный список все остальное. Поэтому директива blacklist является запасным вариантом, если нет директив whitelist или если директива whitelist слишком разрешающа.

Директивы (no)blacklist и (no)whitelist часто используются в комбинации. Пример: /etc/firejail/disable-programs.inc (который включается во все профили) содержит директиву:

blacklist ${HOME}/.mozilla

чтобы заблокировать доступ к этой директории для всех приложений, находящихся в песочнице Firejail. /etc/firejail/firefox.profile должен отключить эту директиву и должен добавить директиву белого списка, чтобы разрешить доступ к этому каталогу (поскольку профиль Firefox является профилем с белым списком):

noblacklist ${HOME}/.mozilla
whitelist ${HOME}/.mozilla

Написание профиля

Основной процесс заключается в следующем:

  1. Скопировать /usr/share/doc/firejail/profile.template в /etc/firejail/ или ~/.config/firejail/ и переименовать его в ProfileName.profile, где ProfileName должен совпадать с названием запускаемого в песочнице приложения
  2. Измените строку include PROFILE.local на include ProfileName.local
  3. Постепенно комментируйте/раскомментируйте различные опции, проверяя на каждом этапе, что приложение работает в новой песочнице. Не меняйте порядок разделов в этом шаблоне.
  4. Подробное объяснение возможных опций для профиля Firejail можно найти на странице руководства firejail-profile(5).
  5. Проверьте профиль на наличие дыр в безопасности, смотрите #Профили тестирования.

Если вы хотите создать профиль с белым списком (т.е. профиль, который содержит директивы whitelist), вы можете создать белый список разрешенных мест, выполнив команду

$ firejail --build application

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

Примечание
  • Идея состоит в том, чтобы быть как можно более ограничительным, сохраняя при этом удобство использования. Это может потребовать пожертвовать потенциально опасной функциональностью и изменить привычки беспечной работы.
  • По умолчанию фильтры seccomp работают по черному списку (который можно найти в /usr/share/doc/firejail/syscalls.txt). Можно использовать seccomp.keep для создания пользовательского белого списка фильтров для приложения. [1]. Удобным способом автоматизации этих шагов является выполнение /usr/lib/firejail/syscalls.sh. Если приложение все еще не работает из-за отсутствия syscalls, следует следовать инструкциям в нижней части /usr/share/doc/firejail/syscalls.txt.

Постоянная локальная адаптация

Стандартная схема профиля включает возможность постоянной локальной настройки посредством включения файлов .local[2]. В основном, каждый официально поддерживаемый профиль содержит строки include ProgramName.local и include globals.local. Эти файлы *.local могут быть расположены в /etc/firejail или в ~/.config/firejail. Поскольку порядок старшинства определяется тем, какой из них читается первым, это дает очень мощный способ локальной настройки. Например, по ссылке этот вопрос по firejail для глобального включения Apparmor и отключения соединения с интернетом, можно просто создать/отредактировать /etc/firejail/globals.local, включив в него строки

# включить Apparmor и отключить Интернет глобально
net none
apparmor

Затем, чтобы позволить, например, "curl" подключаться к интернету, но при этом сохранить ограничение apparmor, нужно создать/отредактировать /etc/firejail/curl.local, включив в него эти строки.

# разрешить доступ в интернет для curl
ignore net

Поскольку curl.local читается раньше globals.local, ignore net отменяет net none, и, в качестве бонуса, вышеуказанные изменения будут сохраняться в будущих обновлениях.

Профили тестирования

Для тестирования и аудита профиля Firejail вам будет полезно следующее:

  1. firejail --debug $Program > $PathToOutputFile дает подробное описание песочницы
  2. firejail --debug-blacklists $Program и firejail --debug-whitelists $Program отображает каталоги и файлы из черного и белого списков для текущего профиля.
  3. firejail --debug-caps выдает список заглушек, поддерживаемых текущей сборкой ПО Firejail. Это полезно при составлении белого списка заглушек.
  4. firejail --help для полного списка параметров --debug
  5. firemon PID следит за запущенным процессом. См. firemon --help для подробностей
  6. Выполнение sudo jailcheck тестов, запущенных в песочнице. Смотрите страницу man jailcheck(1) для подробностей.
  7. checksec также могут быть полезны для проверки того, какие стандартные средства безопасности используются

Firejail с Xorg

На Xorg любая программа может отображать весь ввод с клавиатуры и записывать все экраны. Цель песочницы X11 - ограничить такое поведение, что особенно проблематично для сложных программ, работающих с потенциально вредоносным вводом, таких как браузеры.

Xephyr и Xpra позволяют использовать "песочницу" Xorg. Хотя Xpra обеспечивает полную поддержку буфера обмена, рекомендуется использовать Xephyr из-за очень заметного и постоянного лага при работе со вложенными сессиями X11.

Для полной настройки с (не идеальной) поддержкой буфера обмена (буфер обмена по-прежнему всегда общий), смотрите Руководство Gentoo от Sakaki, особенно раздел о буфере обмена и автоматическом масштабировании.

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

xephyr-screen WidthxHeight можно установить в /etc/firejail/firejail.config, где Width и Height указаны в пикселях и основаны на разрешении вашего экрана.

Чтобы открыть песочницу:

$ firejail --x11 --net=device openbox

device - это ваш активный сетевой интерфейс, необходимый для обеспечения работы DNS. Затем щелкните правой кнопкой мыши и выберите приложения для запуска.

Примечание Если вы используете Unbound, dnsmasq, Pdnsd или любой другой локальный резолвер на 127.0.0.1, то должны оставить --net=device без команды, так как DNS должен работать автоматически.

Более простое руководство см. на сайте Firejail Wordpress.

Согласно руководству:

Песочница заменяет обычный сервер X11 на сервер Xpra или Xephyr. Это предотвращает доступ регистраторов клавиатуры X11 и утилит для снятия скриншотов к основному серверу X11.

Обратите внимание, что утверждение:

Единственный способ отключить абстрактный сокет @/tmp/.X11-unix/X0 - это использование сетевого пространства имен. Если по каким-либо причинам вы не можете использовать сетевое пространство имен, абстрактный сокет все равно будет виден внутри песочницы. Хакеры могут подключить к этому сокету программы кейлоггера и снятия скриншотов.

неправильно, xserverrc может быть отредактирован на -nolisten local, что отключает абстрактные сокеты X11 и помогает изолировать его.

Песочница для браузера

Openbox может быть настроен на запуск определенного браузера при старте. program.profile - это соответствующий профиль, содержащийся в /etc/firejail, а --startup "command - это командная строка, используемая для запуска программы. Например, чтобы запустить Chromium в песочнице:

$ firejail --x11 --profile=/etc/firejail/chromium.profile openbox --startup "chromium"

Советы и рекомендации

Усиление Firejail

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

force-nonewprivs yes

в /etc/firejail/firejail.config. Однако это может нарушить работу определенных приложений. На Arch Linux VirtualBox больше не запускается. С ядром linux-hardened затронуты также Wireshark и браузеры на базе Chromium.

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

Совет вы можете добавить хук pacman для автоматической смены владельца и режима firejail:
/etc/pacman.d/hooks/firejail-permissions.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = firejail
[Action]
Depends = coreutils
Depends = bash
When = PostTransaction
Exec = /usr/bin/sh -c "chown root:firejail /usr/bin/firejail && chmod 4750 /usr/bin/firejail"
Description = Setting /usr/bin/firejail owner to "root:firejail" and mode "4750"

Обязательно создайте группу firejail и добавьте в нее своего пользователя.

Пути, содержащие пробелы

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

/home/user/.moonchild productions

Приватный режим

Firejail также включает одноразовый приватный режим, в котором не производится монтирование в chroots к вашему домашнему каталогу. При этом вы можете запускать приложения, не производя никаких изменений на диске. Например, чтобы запустить okular в приватном режиме, выполните следующее:

$ firejail --seccomp --private okular

Экспериментальные усовершенствованные инструменты

Некоторые разработчики Firejail обнаружили проблемы с инструментами, поставляемыми вместе с ним, и создали свои собственные, улучшенные версии.

Важно Как указано в описании некоторых проектов, эти инструменты могут быть экспериментальными.

Устранение неисправностей

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

Некоторые приложения сложнее поместить в песочницу, чем другие. Например, приложения web browsers и Electron, как правило, нуждаются в более тщательном поиске неисправностей, чем другие, поскольку многое может пойти не так. Очень важно сначала проверить FAQ и открытые ошибки, так как отладка может занять довольно много времени.

Совет Также смотрите wiki, особенно страницу отладка Firejail.

Удаление символических ссылок Firejail

Чтобы удалить созданные Firejail символические ссылки (например, сбросить на значения по умолчанию):

# firecfg --clean

Если вы не хотите использовать Firejail для определенного приложения (например, потому что предпочитаете ограничиться AppArmor), то придется вручную удалить соответствующую символическую ссылку:

# rm /usr/local/bin/application

Поскольку последующее выполнение firecfg снова добавит удаленные симлинки - соответствующие приложения должны быть закомментированы в /etc/firejail/firecfg.config.

Проверьте, все ли остатки Desktop entries (Русский) все еще отменяются Firejail.

PulseAudio

Примечание Использование PulseAudio версии 9.0 или более поздней должно устранить эту проблему.

Если Firejail вызывает проблемы с PulseAudio при работе с приложениями в "песочнице" [3], можно воспользоваться следующей командой:

$ firecfg --fix-sound

Эта команда создает пользовательский файл ~/.config/pulse/client.conf для текущего пользователя с enable-shm = no и возможными другими обходными путями.

hidepid

Если в системе используется параметр ядра hidepid, Firemon может быть запущен только от имени root. Это, в частности, приведет к проблемам с некорректным отображением в графическом интерфейсе Firetools параметров "Capabilities", "Protocols" и состояния "Seccomp"[4].

Проприетарные драйверы Nvidia

Некоторые пользователи сообщают о проблемах при использовании Firejail и проприетарных графических драйверов от NVIDIA (Русский) (например, [5], [6] или [7]). Часто проблему можно решить, отключив опцию noroot Firejail в файле профиля приложения.

Параметр --net и Linux kernel >=4.20.0

Существует ошибка в firejail 0.5.96 с linux >= 4.20.0, см. [8] и [9].

Пример сообщения об ошибке:

$ firejail --noprofile --net=eth0 ls
Parent pid 8521, child pid 8522
Error send: arp.c:182 arp_check: Invalid argument
Error: proc 8521 cannot sync with peer: unexpected EOF
Peer 8522 unexpectedly exited with status 1

Warning: Cannot confine the application using AppArmor

Для некоторых приложений (например, Firefox) запуск с Firejail может привести к появлению предупреждений типа:

Warning: Cannot confine the application using AppArmor.
Maybe firejail-default AppArmor profile is not loaded into the kernel.
As root, run "aa-enforce firejail-default" to load it.

При выполнении предложенной команды вы можете увидеть:

ERROR: Cache read/write disabled: interface file missing. (Kernel needs AppArmor 2.4 compatibility patch.)

Это означает, что AppArmor не включен в качестве параметра ядра, поэтому его необходимо установить в соответствии с AppArmor#Installation.

/usr/bin/patch: **** Can't open patch file

Это означает, что PKGBUILD использует patch с аргументом -i, поэтому необходимо создать белый список для $SRCDEST в /etc/makepkg.conf.

Создайте переопределение patch.local со значением вашего $SRCDEST:

whitelist /path/to/makepkg/sources.

Изменение PKGBUILD на использование stdin также работает:

patch -p1 < ../file.patch

Зависание демонизированных/фоновых процессов

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

Смотрите также