Firejail

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

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

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

dr_faust

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

upd 21.12.24 Изменены "ipc-namespace, restrict-namespaces и прочая песочница", "machine-id".

upd 4.1.25 Добавлен «х11», изменен «ipc-namespace, restrict-namespaces и прочая песочница».
upd 7.1.25 Изменен "х11".

Это не гайд. Скорее попытка собрать в кучу мысли(правильные или нет) относительно опыта использования данной утилиты.
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(от Лия)
https://debianforum.ru/index.php?msg=139913
https://debianforum.ru/index.php?msg=139920

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

[Service]
Type=oneshot
ExecStart=/bin/bash /путь/к/скрипту
RemainAfterExit=true
ExecStop=/bin/bash /путь/к/скрипту

[Install]
WantedBy=multi-user.target
ExecStart или ExecStop в зависимости от того, когда нужно выполнять скрипт.

sh в debian является линком на dash, который строго соотвествует станрадту posix. Поэтому не всякий скрипт на баш корреrтно выполнит. Поэтому надо явно указать бинарник требуемого shell-a.

Привилегии
В манах пишут, что 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 - блокирует системные вызовы по дефолтному списку. Его особо не искал, что в нем хз. Все используют и я импользую.

seccomp <список,системных,вызовов,для,блокировка> - дабавить в черный список явно указанное. Указывать можно как отдельные вызовы, так и их группы. Группы см. в  /usr/share/doc/firejail/syscalls.txt
Открыть содержимое (спойлер)

The different seccomp commands
------------------------------

Always have a look at 'man 1 firejail'.

 - seccomp
    Blocks all syscalls in the default-group.
     - The default-group is @default-nodebuggers, unless allow-debuggers is
       specified, then @default is used.
     - Listed syscalls and groups are also blocked.
     - Exceptions are possible by putting a ! in before the name of a syscall.
 - seccomp.block-secondary
    Allows only native syscalls, all syscalls for other architectures are blocked.
 - seccomp.drop
    Blocks all listed syscalls.
     - Exceptions are possible by putting a ! in before the name of a syscall.
 - seccomp.keep
    Allows only listed syscalls.
     To write your own seccomp.keep line, see:
     - https://firejail.wordpress.com/documentation-2/seccomp-guide/
     - https://github.com/netblue30/firejail/blob/master/contrib/syscalls.sh

Definition of groups
--------------------

@aio=io_cancel,io_destroy,io_getevents,io_pgetevents,io_setup,io_submit,io_uring_enter,io_uring_register,io_uring_setup
@basic-io=_llseek,close,close_range,dup,dup2,dup3,lseek,pread64,preadv,preadv2,pwrite64,pwritev,pwritev2,read,readv,write,writev
@chown=chown,chown32,fchown,fchown32,fchownat,lchown,lchown32
@clock=adjtimex,clock_adjtime,clock_settime,settimeofday,stime
@cpu-emulation=modify_ldt,subpage_prot,switch_endian,vm86,vm86old
@debug=lookup_dcookie,perf_event_open,pidfd_getfd,process_vm_writev,rtas,s390_runtime_instr,sys_debug_setcontext
@default=@clock,@cpu-emulation,@debug,@module,@mount,@obsolete,@raw-io,@reboot,@swap,open_by_handle_at,name_to_handle_at,ioprio_set,ni_syscall,syslog,fanotify_init,add_key,request_key,mbind,migrate_pages,move_pages,keyctl,io_setup,io_destroy,io_getevents,io_submit,io_cancel,remap_file_pages,set_mempolicyvmsplice,userfaultfd,acct,bpf,nfsservctl,setdomainname,sethostname,vhangup
@default-nodebuggers=@default,ptrace,personality,process_vm_readv
@default-keep=execveat,execve,prctl
@file-system=access,chdir,chmod,close,close_range,creat,faccessat,faccessat2,fallocate,fchdir,fchmod,fchmodat,fcntl,fcntl64,fgetxattr,flistxattr,fremovexattr,fsetxattr,fstat,fstat64,fstatat64,fstatfs,fstatfs64,ftruncate,ftruncate64,futimesat,getcwd,getdents,getdents64,getxattr,inotify_add_watch,inotify_init,inotify_init1,inotify_rm_watch,lgetxattr,link,linkat,listxattr,llistxattr,lremovexattr,lsetxattr,lstat,lstat64,mkdir,mkdirat,mknod,mknodat,mmap,mmap2,munmap,newfstatat,oldfstat,oldlstat,oldstat,open,openat,openat2,readlink,readlinkat,removexattr,rename,renameat,renameat2,rmdir,setxattr,stat,stat64,statfs,statfs64,statx,symlink,symlinkat,truncate,truncate64,unlink,unlinkat,utime,utimensat,utimes
@io-event=_newselect,epoll_create,epoll_create1,epoll_ctl,epoll_ctl_old,epoll_pwait,epoll_wait,epoll_wait_old,eventfd,eventfd2,poll,ppoll,pselect6,select
@ipc=ipc,memfd_create,mq_getsetattr,mq_notify,mq_open,mq_timedreceive,mq_timedsend,mq_unlink,msgctl,msgget,msgrcv,msgsnd,pipe,pipe2,process_madvise,process_vm_readv,process_vm_writev,semctl,semget,semop,semtimedop,shmat,shmctl,shmdt,shmget
@keyring=add_key,keyctl,request_key
@memlock=mlock,mlock2,mlockall,munlock,munlockall
@module=delete_module,finit_module,init_module
@mount=chroot,fsconfig,fsmount,fsopen,fspick,mount,move_mount,open_tree,pivot_root,umount,umount2
@network-io=accept,accept4,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,recvmmsg,recvmsg,send,sendmmsg,sendmsg,sendto,setsockopt,shutdown,socket,socketcall,socketpair
@obsolete=_sysctl,afs_syscall,bdflush,break,create_module,ftime,get_kernel_syms,getpmsg,gtty,idle,lock,mpx,prof,profil,putpmsg,query_module,security,sgetmask,ssetmask,stty,sysfs,tuxcall,ulimit,uselib,ustat,vserver
@privileged=@chown,@clock,@module,@raw-io,@reboot,@swap,_sysctl,acct,bpf,capset,chroot,fanotify_init,mount,nfsservctl,open_by_handle_at,pivot_root,quotactl,setdomainname,setfsuid,setfsuid32,setgroups,setgroups32,sethostname,setresuid,setresuid32,setreuid,setreuid32,setuid,setuid32,umount2,vhangup
@process=arch_prctl,capget,clone,clone3,execveat,fork,getrusage,kill,pidfd_open,pidfd_send_signal,prctl,rt_sigqueueinfo,rt_tgsigqueueinfo,setns,swapcontext,tgkill,times,tkill,unshare,vfork,wait4,waitid,waitpid
@raw-io=ioperm,iopl,pciconfig_iobase,pciconfig_read,pciconfig_write,s390_mmio_read,s390_mmio_write
@reboot=kexec_load,kexec_file_load,reboot
@resources=ioprio_set,mbind,migrate_pages,move_pages,nice,sched_setaffinity,sched_setattr,sched_setparam,sched_setscheduler,set_mempolicy
@setuid=setgid,setgid32,setgroups,setgroups32,setregid,setregid32,setresgid,setresgid32,setresuid,setresuid32,setreuid,setreuid32,setuid,setuid32
@signal=rt_sigaction,rt_sigpending,rt_sigprocmask,rt_sigsuspend,rt_sigtimedwait,sigaction,sigaltstack,signal,signalfd,signalfd4,sigpending,sigprocmask,sigsuspend
@swap=swapon,swapoff
@sync=fdatasync,fsync,msync,sync,sync_file_range,sync_file_range2,syncfs
@system-service=@aio,@basic-io,@chown,@default,@file-system,@io-event,@ipc,@keyring,@memlock,@network-io,@process,@resources,@setuid,@signal,@sync,@timer,brk,capget,capset,copy_file_range,fadvise64,fadvise64_64,flock,get_mempolicy,getcpu,getpriority,getrandom,ioctl,ioprio_get,kcmp,madvise,mprotect,mremap,name_to_handle_at,oldolduname,olduname,personality,readahead,readdir,remap_file_pages,sched_get_priority_max,sched_get_priority_min,sched_getaffinity,sched_getattr,sched_getparam,sched_getscheduler,sched_rr_get_interval,sched_yield,sendfile,sendfile64,setfsgid,setfsgid32,setfsuid,setfsuid32,setpgid,setsid,splice,sysinfo,tee,umask,uname,userfaultfd,vmsplice
@timer=alarm,getitimer,setitimer,timer_create,timer_delete,timer_getoverrun,timer_gettime,timer_settime,timerfd_create,timerfd_gettime,timerfd_settime,times

Inheritance of groups
---------------------

+---------------+
| @default-keep |
+---------------+

+----------------+  +---------+  +--------+  +--------------+
| @cpu-emulation |  | @clock  |  | @chown |  | @aio         |
| @debug         |  | @module |  +--------+  | @basic-io    |
| @obsolete      |  | @raw-io |     :  :     | @file-system |
| @mount         |  | @reboot |     :  :     | @io-event    |
+----------------+  | @swap   |     :  :     | @ipc         |
   :                +---------+     :  :     | @keyring     |
   :                  :  :          :  :     | @memlock     |
   :    ..............:  :          :  :     | @network-io  |
   :    :                :  ........:  :     | @process     |
   :    :                :  :          :     | @resources   |
+----------+    +-------------+        :     | @setuid      |
| @default |    | @privileged |        :     | @signal      |
+----------+    +-------------+        :     | @sync        |
   :    :                              :     | @timer       |
   :    :...........................   :     +--------------+
   :                               :   :        :
+----------------------+        +-----------------+
| @default-nodebuggers |        | @system-service |
+----------------------+        +-----------------+


What to do if seccomp breaks a program
--------------------------------------

Start `journalctl --grep=SECCOMP --follow` in a terminal and run
`firejail --seccomp-error-action=log /path/to/program` in a second terminal.
Now switch back to the first terminal (where `journalctl` is running) and look
for the numbers of the blocked syscall(s) (`syscall=<NUMBER>`). As soon as you
have found them, you can stop `journalctl` (^C) and execute
`firejail --debug-syscalls | grep NUMBER` to get the name of the syscall.
In the particular case that it is a 32bit syscall on a 64bit system, use `firejail --debug-syscalls32 | grep NUMBER`.
Now you can add a seccomp exception using `seccomp !NAME`.

If the blocked syscall is ptrace, consider to add allow-debuggers to the profile.

```
term1$ journalctl --grep=SECCOMP --follow
term2$ firejail --seccomp-error-action=log /usr/bin/signal-desktop
term1$ (journalctl --grep=SECCOMP --follow)
audit[1234]: SECCOMP ... comm="signal-desktop" exe="/usr/bin/signal-desktop" sig=31 arch=c000003e syscall=161 ...
^C
term1$ firejail --debug-syscalls | grep "^161[[:space:]]"
161     - chroot
```
Profile: `seccomp -> seccomp !chroot`

[свернуть]
Кроме того поддерживает синтаксис вида syscall:errno, syscall:kill, syscall:log, т.е. вызов - выполняемое действие.

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очницы» в консоль скинет черновик  с весьма неплохими пояснениями зачем та или иная опция в данном случае.

x11
x11 xephyr
Есть и другие, но лично не пробовал. Только xephyr.

Доп. опции задать в файле профиля нельзя. Или в консольной команде или ввиде общих настроек для всех «песочниц» в /etc/firejail/firejail.config
xephyr-screen
xephyr-extra-params -resizeable -nolisten local

Первая задает желаемое разрешение экрана. Во второй можно прописать все остальное как касающееся xephyr, так и опции, которые поддерживаются самими иксами.
В данном примере первая позволяет в ходе работы менять размер окна.

Вторая устраняет проблему абстрактных сокетов. Кроме того для той же цели, если графика запускается вручную через startx, привести  /etc/X11/xinit/xserverrc привести к виду
exec /usr/bin/X -nolisten local "$@"
Если login manager-ом, то в его конфиге найти опцию, куда прописывать параметры запуска иксов, и указать
code]
-nolisten local
[/code]
Пользуюсь slim-ом - devuan с sysv, c systemd вроде не работает
[b]/etc/slim.conf[/b]
xserver_arguments   -nolisten local

После чего
netstat --listening --unix | grep X11
Не должно быть имен с "@".



Проблемы\непонятки\неудоства\etc.

1) Для того, чтобы были видны выпадаюие графические меню приходится держать кнопку нажатой. Исключением является лишь использование совместно с эмулируемым wine рабочим столом жестко заданного неизменяемого размера. Тогда все как обычно.
2) Разумеется раздельный буфер с основной системой. Т.е. для того, чтобы так использовать с браузером, как минимум, надо запустить в одной «песочнице»  еще и менеджер паролей.
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.

dr_faust

Devuan 4. Debian 12. LXDE.

dr_faust

Обновил первый пост.
Devuan 4. Debian 12. LXDE.