Firejail (Русский)
Firejail - это простая в использовании Setuid программа-песочница, снижающая риск нарушения безопасности, ограничивая среду запуска недоверенных приложений с помощью пространств имен Linux, seccomp-bpf и возможностей Linux.
Установка
Установите либо пакет firejail, либо firejail-gitAUR. Также доступно приложение GUI для работы с Firejail - firetools.
/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.
/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
Написание профиля
Основной процесс заключается в следующем:
- Скопировать
/usr/share/doc/firejail/profile.template
в/etc/firejail/
или~/.config/firejail/
и переименовать его вProfileName.profile
, где ProfileName должен совпадать с названием запускаемого в песочнице приложения - Измените строку
include PROFILE.local
наinclude ProfileName.local
- Постепенно комментируйте/раскомментируйте различные опции, проверяя на каждом этапе, что приложение работает в новой песочнице. Не меняйте порядок разделов в этом шаблоне.
- Подробное объяснение возможных опций для профиля Firejail можно найти на странице руководства firejail-profile(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 вам будет полезно следующее:
-
firejail --debug $Program > $PathToOutputFile
дает подробное описание песочницы -
firejail --debug-blacklists $Program
иfirejail --debug-whitelists $Program
отображает каталоги и файлы из черного и белого списков для текущего профиля. -
firejail --debug-caps
выдает список заглушек, поддерживаемых текущей сборкой ПО Firejail. Это полезно при составлении белого списка заглушек. -
firejail --help
для полного списка параметров--debug
-
firemon PID
следит за запущенным процессом. См.firemon --help
для подробностей - Выполнение
sudo jailcheck
тестов, запущенных в песочнице. Смотрите страницу man jailcheck(1) для подробностей. - 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. Затем щелкните правой кнопкой мыши и выберите приложения для запуска.
--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. Подробности см. на сайте здесь.
/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 и открытые ошибки, так как отладка может занять довольно много времени.
Удаление символических ссылок Firejail
Чтобы удалить созданные Firejail символические ссылки (например, сбросить на значения по умолчанию):
# firecfg --clean
Если вы не хотите использовать Firejail для определенного приложения (например, потому что предпочитаете ограничиться AppArmor), то придется вручную удалить соответствующую символическую ссылку:
# rm /usr/local/bin/application
Поскольку последующее выполнение firecfg снова добавит удаленные симлинки - соответствующие приложения должны быть закомментированы в /etc/firejail/firecfg.config
.
Проверьте, все ли остатки Desktop entries (Русский) все еще отменяются Firejail.
PulseAudio
Если 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 - никакие настройки не могут решить эту проблему. К счастью, приложения, упомянутые в проблеме, обычно не имеют большой уязвимости, поэтому риск их работы без "песочницы" сравнительно невелик.