Как определить, какие разрешения отсутствуют у моего пользователя для получения набора данных ZFS?

9

У меня есть машина FreeNAS (11.1-U1) и FreeBSD (11.1-RELEASE-p6). На FreeNAS я хотел бы делать zfs receiveрекурсивные снимки как пользователь без полномочий root с делегированными привилегиями. Похоже, это хорошо работает для большинства дочерних наборов данных. Но наборы dataданных iocage , которые можно установить в тюрьму и оттуда администрировать, не работают:

root@freebsd:~> zfs send -RI "dozer@2018-02-21" "dozer@2018-03-08"  | ssh -T -i /root/backup_key backupuser@freenas zfs receive -dvuF neo/backups/freebsd
receiving incremental stream of dozer@2018-03-03 into neo/backups/freebsd@2018-03-03
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-07 into neo/backups/freebsd@2018-03-07
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-08 into neo/backups/freebsd@2018-03-08
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer/ROOT@2018-03-03 into neo/backups/freebsd/ROOT@2018-03-03
.
.
.
receiving incremental stream of dozer/iocage/jails/owncloud/root@2018-03-08 into neo/backups/freebsd/iocage/jails/owncloud/root@2018-03-08
received 578MB stream in 110 seconds (5.25MB/sec)
receiving incremental stream of dozer/iocage/jails/owncloud/root/data@2018-03-03 into neo/backups/freebsd/iocage/jails/owncloud/root/data@2018-03-03
cannot receive incremental stream: permission denied
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-03': signal received
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-07': Broken pipe
warning: cannot send 'dozer/iocage/jails/owncloud/root/data@2018-03-08': Broken pipe

Разрешения этого конкретного потомка точно такие же, как и у родительского набора данных:

root@freenas:~ # zfs allow neo/backups/freebsd/iocage/jails/owncloud/root/data
---- Permissions on neo/backups/freebsd -----------------------------
Local+Descendent permissions:
        user backupuser atime,compression,create,dedup,exec,jailed,mount,mountpoint,quota,receive,rename,reservation,setuid,userprop

Запуск zfs receiveна FreeNAS от имени root работает как положено.

Какие делегированные привилегии нужны моему пользователю для получения заключенных в тюрьму наборов данных iocage и, в более общем смысле, есть ли способ заставить zfs receiveвыдавать более подробное сообщение об ошибке, в котором сообщается, какого разрешения не хватает?

sloh
источник

Ответы:

3

При устранении неполадок, связанных с разрешениями, возникающими из zfsкоманд, проанализируйте zfsоперацию с точки зрения этапов ее компонентов.

Пример команды zfs receive -duvFраспаковки в несколько этапов. Два из этих флагов не относятся к каким-либо специальным разрешениям:

-d влияет на наименование нового набора данных (если есть)
-v включает подробный вывод

Два других делают.

-F означает, что файловая система будет возвращена к исходному снимку инкрементной передачи до начала приема.
-U означает, что файловая система не будет подключена после завершения приема.

Я догадываюсь, что вам не хватает разрешения на откат. Флаг -F в вашей команде подразумевает, что zfs rollbackбудет выполнено, а ваш zfs allowнет в списке rollback.

В общем случае можно сделать дедуктивные предположения о разрешениях, необходимых для данной zfsкоманды.

Справочная страница для zfsуказывает на:

Имена разрешений совпадают с именами подкоманд ZFS и свойств.

а также ...

Как правило, разрешения - это возможность использовать подкоманду ZFS или изменить свойство ZFS. Доступны следующие разрешения:

   NAME              TYPE          NOTES
   allow             subcommand    Must also have the permission
                                   that is being allowed
   clone             subcommand    Must also have the 'create'
                                   ability and 'mount' ability in
                                   the origin file system
   create            subcommand    Must also have the 'mount'
                                   ability
   destroy           subcommand    Must also have the 'mount'
                                   ability
   diff              subcommand    Allows lookup of paths within a
                                   dataset given an object number,
                                   and the ability to create
                                   snapshots necessary to 'zfs diff'
   hold              subcommand    Allows adding a user hold to a
                                   snapshot
   mount             subcommand    Allows mount/umount of ZFS
                                   datasets
   promote           subcommand    Must also have the 'mount' and
                                   'promote' ability in the origin
                                   file system
   receive           subcommand    Must also have the 'mount' and
                                   'create' ability
   release           subcommand    Allows releasing a user hold
                                   which might destroy the snapshot
   rename            subcommand    Must also have the 'mount' and
                                   'create' ability in the new
                                   parent
   rollback          subcommand    Must also have the 'mount'
                                   ability
   send              subcommand
   share             subcommand    Allows sharing file systems over
                                   the NFS protocol
   snapshot          subcommand    Must also have the 'mount'
                                   ability
   groupquota        other         Allows accessing any
                                   groupquota@... property
   groupused         other         Allows reading any groupused@...
                                   property
   userprop          other         Allows changing any user property
   userquota         other         Allows accessing any
                                   userquota@... property
   userused          other         Allows reading any userused@...
                                   property
   aclinherit        property
   aclmode           property
   atime             property
   canmount          property
   casesensitivity   property
   checksum          property
   compression       property
   copies            property
   dedup             property
   devices           property
   exec              property
   filesystem_limit  property
   logbias           property
   jailed            property
   mlslabel          property
   mountpoint        property
   nbmand            property
   normalization     property
   primarycache      property
   quota             property
   readonly          property
   recordsize        property
   refquota          property
   refreservation    property
   reservation       property
   secondarycache    property
   setuid            property
   sharenfs          property
   sharesmb          property
   snapdir           property
   snapshot_limit    property
   sync              property
   utf8only          property
   version           property
   volblocksize      property
   volsize           property
   vscan             property
   xattr             property

Данный пример включает -uфлаг, поэтому файловая система не будет смонтирована в конце операции приема. Однако, если бы его не -uбыло, файловая система была бы смонтирована в конце процесса получения. Что характерно, receiveразрешение требует mountразрешения.

Поскольку zfs mountоперация автоматически создает любые необходимые точки монтирования, пользователь может иметь zfsразрешение на монтирование набора данных, но не может иметь разрешения файловой системы для создания точки монтирования. В случае zfs mount, монтирование не удастся. В операции zfs createили renameфайловая система будет создана или переименована, но она останется отключенной, если у пользователя нет достаточных разрешений файловой системы для создания точки монтирования.

Аналогичным образом, zfs renameкоманда может завершиться сбоем из-за отсутствия разрешений в нескольких точках операции переименования. Проще говоря, этапы компонента могут быть:

1) размонтировать файловую систему ( mountразрешение)
2) создать новую файловую систему ( createразрешение)
3) сопоставить метаданные файловой системы с новым именем ( renameразрешение)

Четвертый шаг - это повторное монтирование файловой системы с новым именем в новой, возможно, измененной точке монтирования, которая снова использует mountразрешение и, возможно, разрешения файловой системы для создания новой точки монтирования.

Я не проверял такие фокусы, но можно видеть , что zfsразличие между createи renameразрешений, а также между mountи mountpointразрешений. Можно предположить, что можно позволить пользователю создавать новые файловые системы, но после создания пользователь не может переименовать их. Для файловых систем с унаследованными точками монтирования переименование файловой системы также часто переименовывает точку монтирования файловой системы, как при переименовании tank/usr/localдля tank/usr/local.OLDизменения точки монтирования с /usr/localна /usr/local.OLD.

Разделение mountили renameот mountpointразрешений означает , что пользователь может быть разрешено переименовать файловую систему , но не разрешено изменять свою точку монтирования. Или наоборот, чтобы иметь возможность изменить место монтирования файловой системы, но не иметь возможности изменить имя файловой системы.

Богатство операций с файловой системой и делегирование этих операций в сочетании с гранулярностью разрешений может сделать zfsнесколько сложным, но также очень мощным.

Джим Л.
источник
Этот ответ расширен от оригинала. Я надеюсь, что он продолжит заслуживать своих предыдущих голосований.
Джим Л.
0

Похоже, у вас есть снимок, на котором отсутствует разрешение.

Попробуйте установить receiveразрешение на neo/backups/freebsd/iocage/jails/owncloud/root/data@2018-03-03.

Похоже, что он правильно установлен на томе, но отсутствует на снимке.

hargut
источник