Firejail (Русский)

From ArchWiki

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

The factual accuracy of this article or section is disputed.

Reason: Почему для песочницы X11 требуется DNS? (Discuss in Talk:Firejail (Русский))

На 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 обнаружили проблемы с инструментами, поставляемыми вместе с ним, и создали свои собственные, улучшенные версии.

Важно: Как указано в описании некоторых проектов, эти инструменты могут быть экспериментальными.
  • firecfg.py, улучшенная версия firecfg.
  • fjp, инструмент для взаимодействия с профилями Firejail.
  • firejail-handler-http, помогающий правильно открывать HTTP(S) ссылки при работе приложений в песочнице.
  • firejail-handler-extra, как и выше, но работает с другими протоколами.

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

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

This article or section is a candidate for merging with #Enable AppArmor support.

Notes: Требование включить AppArmor должно быть явно выражено в предыдущем тексте. (Discuss in Talk:Firejail (Русский))

Для некоторых приложений (например, 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 - никакие настройки не могут решить эту проблему. К счастью, приложения, упомянутые в проблеме, обычно не имеют большой уязвимости, поэтому риск их работы без "песочницы" сравнительно невелик.

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