Firejail

Автор dr_faust, 10 декабря 2024, 15:44:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

dr_faust

upd 12.12.24 Дополнены "привилегии" и "Прочие полезности private".

Это не гайд. Скорее попытка собрать в кучу мысли(правильные или нет) относительно опыта использования данной утилиты.
firejail version 0.9.72
Открыть содержимое (спойлер)
Формат опций для консоли
--опция
или
-—опция=дополнительные,параметры,через,запятую,без,пробелов
Для файла профиля
опция
опция дополннительные,параметры,через,запятую,без,проблелов
Каждая опция с новой строки.
[свернуть]
Самый полезный параметр

это private. Без дополнительных параметров создает в оперативк временный /home для «песочницы», удаляя после того, как она завершит работу. При указании каталога — постоянный отдельный /home для песочницы.
В файл профиля перед вышеуказанной также можно прописать команду
mkdir <каталог для /home «песочницы»>
которая создаст соответствующий каталог.
Удобно тем, что установленное штатными средствами ПО не засирает систему своими конфигами и кэшэм, которые потом найди еще(в apt же вроде так и не завезли опцию чистки домашнего каталога от файлов удаляемых пакетов).
Удобно также при использовании разного рода портативных программ вроде браузера palemoon, которые поставляются в виде структуры каталогов, в которых есть все необходимое для запуска.
В последнем случае путь к исполняемому файлу нужно указывать относительно /home песочницы. Т.е.
firejail —-private=/home/user/palemoon palemoon.sh
а не
firejail—-private=/home/user/palemoon /home/user/palemoonpalemoon.sh

И большой баг

Предположим нужно запустить в одной «песочнице» несколько приложений. Теоретически это делается без проблем целым набором опций —-join чего-то там. Например,
firejail —-profile=mysandbox.profile —-join=mysandbox PO2
На это выдаст ошибку, смысл которой сводится к тому, что что-то не то с синтаксисом команды. Аналогичный результат будет и если поместить join-опции в файл профиля, указав только путь до него.
Разработчики уж года 2 извещены о ней, однако с тех пор новых релизов не было. А если и будут, то  штатные репозитории debian свежие версии явно не заведут.
Частичное(очень частичное) решение проблемы есть. Если явно не задан файл профиля, то ищется с идентичным запускаемому приложению названию сначала в ~/.config/firejail, потом /etc/firejail. Т.е. Для условного libreoffice можно обойти, просто положив правильный профиль в домашнюю директорию и прописав в декстоп-файле
firejail libreoffice <опции запуска>
Но запихнуть таким образом в одну песочницу несколько приложений нельзя.

Прочие полезности private

private-etc <файлы,папки> — создает на время рабоы песочницы директорию /etc, в которую копирует указанное из постоянной. Если использовать опцию без дополнительных параметров, песочница не запустится, но можно указать нечто не существующее. Тогда будет пустой временный /etc.
private-bin <исполняемые файлы> - очень, очень многому в обязательном порядке нужен доступ к оболочк. Минимум к sh/dash и bash. Если запускаемое исполняет некие скрипты, то и в к куче утилит работы с текстом типа cat, sed и т.д.
private-lib <файлы библиотек или без доп параметров> - можно явно указать, а можно и не указывать - тогда автоматически скопируются все те, что необходимы для работы указанных исполняемых файлов. Экспериментальная и пока, вроде, работает не совсем корректно: посмотрите браузером или файловым менеджером соответствующие каталоги при ее использовании. Указывать ПОСЛЕ private-bin, иначе не срабатывает.
private-tmp — «песочница» оперативной памяти.
private-cache
disable-mnt — отключает «песочницу» от всех сторонних носителей(флешки, дополнительные\внешние жесткие диски и т. д.), блокируя доступ к /mnt,/media.
private-dev — сильно ограничивает «песочнице» доступ к подключенным к системе устройствам. Данную опцию дополняют следующие:
no3d - аппаратному ускорению графики(дискретная видеокарта?), в любом случае именно это не стоит использовать без четкого понимания зачем это  надо: графика лагать начинает
nodvd — к дисководу для оптических дисков
nosound — звук
notv — к каким-то умным телевизорам(кто ими вообще пользуется?)
nou2f — различного рода апаратным токенам и т.п.
novideo - Disable video devices – доп. мониторы что ли?
noprinters — принтерам.

env, whitelist

Позволяет передать «песочнице» любые переменные. В первую очередь, полезно для запуска префиксов wine, чтобы указать какой именно префикс использовать. Во-вторую, при запуске портативного ПО, все файлы которого в одной папке, с некими необычными, недефолтрными параметрами. И, наверное, для запуска установленного штатными средствами ПО(хотя, как минимум пока, в голову не приходит зачем)
При указании в файле профиля в качестве значения переменной пути к некоему месту с системе путь ни в коем случае не брать его в кавычки(одинарные,двойные), иначе не видит данный параметр
env WINEPREFIX=pach/to/wine/prefix
Тогда как при запуске в консоли это бывает необходимым(если перемененная никак не скармливается firejail-у).
Вторая опция полезная для разрешения чтения-записи всего,что находится в префиксе. Private для wine не нужно. Также, если по неким причинам нельзя запихнуть ПО в отдельный /home, позволяет сильно ограничить доступ к постоянному общему /home.


dbus

Как понимаю, нужен или для обмена информацией между ПО в песочнице и ПО все песочницы, или для тогоже между ПО, которое работает в одной песочнице. Первое как-то несекурно. Насчет возможности реализации второго см. выше. Поэтому
dbus-system none
dbus-user none
несмотря на очень проработанный механизм фильтрации данных.
Если в песочнице запущено что-то одно, то оно спокойно работает и без dbus.

Самый сложный вопрос. Допустим, таки  настроить dbus. Откуда брать название dbus-сервисов, которые создает то или иное ПО? Пока ИИ - единственный простой(но не факт что верный) вариант.

machine-id

Параметр генерирует новый временный machine-id для каждого сеанса песочницы. Полезная штука для всякого рода интернет-ПО, учитывая, что, согласно wiki, хз какое ПО его запрашивает и хз куда сливает. А может и не только для интернет-по...
А потом понял, что мысль неправильная. Вернее, правильная, но недодуманная до конца. Случайный id для песочницы — это хорошо. А может еще и новый генерить для каждого запуска самой машины?
Накатал простенький скрипт(devuan с sysv)
Открыть содержимое (спойлер)
#!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          regen_machine-id
    # Required-Start:    $all # т. е. после всех остальных
# Default-Start:      2 #дефолтный runlevel
# Short-Description: regenerate file machine-id
    # Description:       Delete old and create new file machine-id
    ### END INIT INFO

        rm -f /var/lib/dbus/machine-id /etc/machine-id

        dbus-uuidgen > /var/lib/dbus/machine-id

        cp /var/lib/dbus/machine-id /etc/machine-id

        chmod 444 /etc/machine-id

        exit 0
[свернуть]
Сохранить в /etc/inin.d Владелец и группа — root. Права 755(так по-умолчанию для всех init в devuan)
sudo update-rc.d regenere_machine-id defaults
В логе выполнения команды будут ошибки: ругается на отсуствие указаний, когда скрипт останавливать. Но соответствующие символический ссылки все-таки создает и скрипт работает исправно. Можно выполнять этот скрипт и при остановке системы, заменив на
# Required-Stop:    <хз что тут>
# Default-Stop:      0 6 #runlevel остановки и перезагрузки

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


Привилегии
В манах пишут, что firejail можно смело использовать для изоляции процессов с root-правами, но все-таки страшно. Поэтому
А) В
/etc/firejail/firejail.config
привести к виду
force-nonewprivs yes
Б) Предоставить право запска песочниц при помощи firejail только закрытому списку непривилегированных пользователей.
sudo firecfg —-add-users <список юзеров>
Или вручную в файл
/etc/firejail/firejail.users
каждый юзер с новой строки.
Файл не создается при установке пакета. Только при первом выполнении приведенной выше команды. Права на него
-rw-r--r-- root root
В) addgroup --system firejail
usermod -a -G firejail <ваш юзверь>
chown :firejail /usr/bin/firejail
chmod 4750 /usr/bin/firejail
После перезайти в систему(перезагружать ее не обязательно)

Было root-root 4755. Стало root-firejail 4750.
При обновлении пакета это слетит. Поэтому имеет смысл заморозить пакет
apt-mark hold firejail
И обновлять его отдельно, четко понимая что и зачем, а не скопом со всем прилетевшим.
Г) Во всех файлах профилей:
noroot — ни в коем лучае не запускать от рута,
nonewprivs — не повышать привилегии процессов в песочнице,
nogroups — не запускать от какой-либо иной группы креме основной для пользователя.
Д)Запуск песочницы только с явным указанием файла профиля опцией —-profile=<абсолютный путь к файлу>. Такая практика вызывает описанный выше баг.
ipc-namespace, restrict-namespaces и прочая песочница
Сложный вопрос, не до конца вник.
Первая опция вроде создает отдельное(«песочница» пространство имен межпроцессорного взаимодействия. Вторая без дополнительных опций запрещает создание каких-либо новых пространств любых видом. При указании дополнительных опций в виде названий видов запрещает только для явно указанных.
При этом обе опции могут спокойно соседствовать в одном профиле. Только разве первую нужно указывать перед второй.

сaps.drop all — caps о разграничении root прав на уровне ядра, приведенный вариант просто запрещает песочнице любой root.

seccomp

apparmor — интегрирует инструмент изоляции apparmor и firejail.
Интернет
Отключить песочницу от интернета вообще
net none
Создать интернет-песочницу
net <интерфейс>
Удобно тем, что позволяет написать для каждой песочницы свои правила фаерволла, не стесняясь настройками системного пространства интернет-имен, командой(для ipv4 и ipv6 соответственно)
netfilter <файл правил>
netfilter6 <файл правил>
В каталоге /etc/firejail есть несколько файлов расширением .net, в которых содержатся наборы правил для наиболее распространенных случаев.
Но есть НО. Эта функция по-умолчанию работает, только если песочница firejail работает из-под рута. А с рутом см. выше.
Поэтому в
/etc/firejail/firejail.config
привести к виду
network yes
restricted-network no
protocol
Фильтр тех протоколов, которые разрешены для использования в песочнице. Насколько понимаю, речь идет как о нужных для работы внутри локальной машины протолоках, так и интернет.
unix — графика вместе c связанной с ним морокой относительно абстрактных сокетов unix,
inet — ipv4,
inet6 — ipv6,
netlink — для торента, что-то про  механизм взаимодействия интернет пространства имен системы и прикладного ПО.
Автосоздание черновика профиля
Опция —-build
firejail —-build my-program &
После завершения работы «пеcочницы» в консоль скинет черновик  с весьма неплохими пояснениями зачем та или иная опция в данном случае.
Devuan 4. Debian 12. LXDE.

Лия

#1
Цитата: dr_faust от 10 декабря 2024, 15:44:48novideo - Disable video devices – доп. мониторы что ли?
Это веб-камеры

10 декабря 2024, 23:56:27
Цитата: dr_faust от 10 декабря 2024, 15:44:48Откуда брать название dbus-сервисов, которые создает то или иное ПО?
dbus-monitor
показывает активность dbus
ещё есть bustle в репозитории

sudo apt update && sudo apt install qt6-tools-dev-tools qtchooser
qdbusviewer
показывает названия

dr_faust

Цитата: Лия от 10 декабря 2024, 23:52:16
Цитата: dr_faust от 10 декабря 2024, 15:44:48novideo - Disable video devices – доп. мониторы что ли?
Это веб-камеры


А noinput тогда что такое? Какие такие системы ввода он блочит?
Devuan 4. Debian 12. LXDE.

Лия

Цитата: dr_faust от 12 декабря 2024, 12:36:31А noinput тогда что такое? Какие такие системы ввода он блочит?
/dev/input
Мышь, клавиатура (прямое их чтение)

dr_faust

Первое сообщение обновлено.
Devuan 4. Debian 12. LXDE.

Лия

#5
Цитата: dr_faust от 10 декабря 2024, 15:44:48Как запустить такой скрипт на системах с systemd пока не копал.
/var/lib/dbus/machine-id должен быть симлинком на /etc/machine-id
sudo rm -v /var/lib/dbus/machine-id
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id

/etc/systemd/system/regenerate-machine-id.service
[Unit]
Description=Regenerate machine ID

[Service]
Type=oneshot
ExecStart=sh -c 'dbus-uuidgen > /etc/machine-id'

[Install]
WantedBy=multi-user.target
sudo systemctl enable regenerate-machine-id.service
sudo systemctl start regenerate-machine-id.service


14 декабря 2024, 04:40:00
Цитата: dr_faust от 10 декабря 2024, 15:44:48Предположим нужно запустить в одной «песочнице» несколько приложений.
firejail --profile=mysandbox.profile --join-or-start=mysandbox myapp
firejail --profile=mysandbox.profile --join-or-start=mysandbox someapp

dr_faust

#6
Цитата: Лия от 14 декабря 2024, 04:35:2014 декабря 2024, 04:40:00
Цитата: dr_faust от 10 декабря 2024, 15:44:48Предположим нужно запустить в одной «песочнице» несколько приложений.
firejail --profile=mysandbox.profile --join-or-start=mysandbox myapp
firejail --profile=mysandbox.profile --join-or-start=mysandbox someapp
https://github.com/netblue30/firejail/issues/5598
На версии firejail из devuan 4 этот баг имеется. О чем и писал в разделе "и большой баг".

14 декабря 2024, 14:14:37
Цитата: Лия от 14 декабря 2024, 04:35:20
Цитата: dr_faust от 10 декабря 2024, 15:44:48Как запустить такой скрипт на системах с systemd пока не копал.
/var/lib/dbus/machine-id должен быть симлинком на /etc/machine-id
sudo rm -v /var/lib/dbus/machine-id
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id

/etc/systemd/system/regenerate-machine-id.service
[Unit]
Description=Regenerate machine ID

[Service]
Type=oneshot
ExecStart=sh -c 'dbus-uuidgen > /etc/machine-id'

[Install]
WantedBy=multi-user.target
sudo systemctl enable regenerate-machine-id.service
sudo systemctl start regenerate-machine-id.service


В таком случае можно же просто указать сам скрипт
/bin/bash пуст/к/к/скрипту.

Скрипт, при его запуске по завершении работы системы, можно доработать, впихнув массу полезного вроде проверки существуют ли некиефайлы-каталоги с удвлением, если таки да.
sh  это ссылка на dash, который строго средует стандарту posix. В отличии от bash, поэтому скрипт может и не сработать из-за отличия синтаксиса.
Devuan 4. Debian 12. LXDE.

Лия

#7
Цитата: dr_faust от 14 декабря 2024, 14:09:50https://github.com/netblue30/firejail/issues/5598
Да, могу подтвердить
Но вариант, предложенный мной (если не добавлять join-or-start в профиль) работает :)

14 декабря 2024, 14:43:37
Цитата: dr_faust от 14 декабря 2024, 14:09:50Скрипт, при его запуске по завершении работы системы
[Unit]
Description=Regenerate machine ID

[Service]
Type=oneshot
ExecStart=/bin/bash /root/regenerate_machine_id.sh
RemainAfterExit=true
ExecStop=/bin/bash /root/on_system_shutdown.sh

[Install]
WantedBy=multi-user.target

dr_faust

Цитата: Лия от 14 декабря 2024, 14:40:06
Цитата: dr_faust от 14 декабря 2024, 14:09:50https://github.com/netblue30/firejail/issues/5598
Да, могу подтвердить
Но вариант, предложенный мной (если не добавлять join-or-start в профиль) работает :)


Где?!
firemon --tree

5873:user:OPENOFFICE4:firejail --profile=/home/user/.config/firejail/openoffice4.profile --join-or-start=OPENOFFICE4 openoffice4 -calc
  5874:user::firejail --profile=/home/user/.config/firejail/openoffice4.profile --join-or-start=OPENOFFICE4 openoffice4 -calc
    5878:user::/bin/sh /opt/openoffice4/program/soffice -calc
      5887:user::/opt/openoffice4/program/soffice.bin -calc
5909:user::firejail --profile=/home/user/.config/firejail/openoffice4.profile --join-or-start=OPENOFFICE4 openoffice4-printeradmin
  5910:user::/opt/openoffice4/program/spadmin.bin -env:INIFILENAME=vnd.sun.star.pathname:/opt/openoffice4/program/redirectrc

Кроме утилиты firejail еще есть firemon для мониторинга как песочница работает.
Devuan 4. Debian 12. LXDE.

Лия

#9
Цитата: dr_faust от 14 декабря 2024, 14:53:19Где?!
$ cat mysandbox.profile
private
$ firejail --profile=mysandbox.profile --join-or-start=mysandbox libreoffice
$ firejail --profile=mysandbox.profile --join-or-start=mysandbox ps ax
Reading profile mysandbox.profile
Switching to pid [REDACTED], the first child process inside the sandbox
Changing root to /proc/[REDACTED]/root
Child process initialized in 4.91 ms
    PID TTY      STAT   TIME COMMAND
      1 pts/2    S+     0:00 firejail --profile=mysandbox.profile --join-or-start=mysandbox libreoffice
      7 pts/2    Sl+    0:00 /usr/lib/libreoffice/program/oosplash
     37 pts/2    Sl+    0:00 /usr/lib/libreoffice/program/soffice.bin --splash-pipe=5
     63 pts/3    R+     0:00 ps ax
$ firejail --profile=mysandbox.profile ps ax                         
Reading profile mysandbox.profile
Parent pid [REDACTED], child pid [REDACTED]
Child process initialized in 9.00 ms
    PID TTY      STAT   TIME COMMAND
      1 pts/3    S+     0:00 firejail --profile=mysandbox.profile ps ax
      7 pts/3    R+     0:00 ps ax

Parent is shutting down, bye...

dr_faust

Опыты с консольной утилитой ps, а также графическими, запускаемыми на отдельном X-сервере посредством xephyr показывают, что запускается таки в одной песочнице. В то же время штатная утилита монитаринга firemon показывает 2,3 по числу введеных консольных команд.

ХЗ как интрепретировать результат. Или таки не в одной. Или в одной, но на firemon нужен баг-репорт, так как она некорретно отображает запрашиваемую посредством ключей --list и --tree информацию.
Devuan 4. Debian 12. LXDE.