Bagaimana saya bisa menentukan izin apa yang hilang untuk pengguna saya untuk menerima dataset ZFS?

9

Saya memiliki mesin FreeNAS (11.1-U1) dan FreeBSD (11.1-RELEASE-p6). Pada FreeNAS saya ingin zfs receivesnapshot rekursif sebagai pengguna non-root dengan hak istimewa yang didelegasikan. Ini tampaknya bekerja dengan baik untuk sebagian besar dataset anak. Tapi set datadata iocage , yang bisa dipasang ke penjara dan dikelola dari sana, mereka gagal:

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

Izin anak tertentu persis sama dengan salah satu dari dataset induk:

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

Menjalankan zfs receiveFreeNAS sebagai root berfungsi seperti yang diharapkan.

Apa hak istimewa yang didelegasikan yang diperlukan pengguna saya untuk menerima set data iocage yang dipenjara dan, secara lebih umum, apakah ada cara untuk membuat zfs receivememberikan pesan kesalahan yang lebih terperinci yang memberi tahu Anda izin apa yang hilang?

sloh
sumber

Jawaban:

3

Ketika memecahkan masalah izin yang timbul dari zfsperintah, menganalisis zfsoperasi dalam hal langkah-langkah komponennya.

Perintah sampel zfs receive -duvFmembongkar menjadi beberapa langkah. Dua dari bendera itu tidak terkait dengan izin khusus apa pun:

-d mempengaruhi penamaan dataset baru (jika ada)
-v memungkinkan keluaran verbose

Dua lainnya melakukannya.

-F berarti filesystem akan digulirkan kembali ke snapshot awal dari transfer tambahan sebelum penerimaan dimulai
-u berarti filesystem tidak akan dipasang setelah penerimaan selesai

Firasat saya adalah bahwa Anda kehilangan izin rollback. Bendera -F dalam perintah Anda menyiratkan bahwa zfs rollbackakan dilakukan, dan Anda zfs allowtidak mencantumkan rollback.

Dalam kasus umum, seseorang dapat membuat dugaan deduktif tentang izin yang diperlukan untuk zfsperintah yang diberikan .

Halaman manual untuk zfsmenunjukkan:

Nama izin sama dengan sub-perintah ZFS dan nama properti.

dan ...

Izin umumnya kemampuan untuk menggunakan sub-perintah ZFS atau mengubah properti ZFS. Izin berikut tersedia:

   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

Contoh yang ada meliputi -uflag, sehingga sistem file tidak akan dipasang pada akhir operasi penerimaan. Namun, jika -utidak ada, sistem file akan dipasang pada akhir proses penerimaan. Tellingly, receiveizin tersebut memerlukan mountizin.

Karena zfs mountoperasi akan secara otomatis membuat mountpoint yang diperlukan, dimungkinkan bagi pengguna untuk memiliki zfsizin untuk me-mount dataset, tetapi tidak memiliki izin sistem file untuk membuat mountpoint. Jika demikian zfs mount, mount akan gagal. Dalam suatu zfs createatau renameoperasi, sistem file akan dibuat atau diganti namanya, tetapi akan tetap dilepas jika pengguna tidak memiliki izin sistem file yang memadai untuk membuat mountpoint.

Demikian pula, sebuah zfs renameperintah bisa gagal karena kurangnya izin di beberapa titik dalam operasi ganti nama. Secara longgar diungkapkan, langkah-langkah komponen mungkin:

1) unmount filesystem ( mountizin)
2) buat filesystem baru ( createizin)
3) memetakan meta-data filesystem ke dalam nama baru ( renameizin)

Langkah keempat adalah memasang kembali filesystem yang baru dinamai pada mountpoint barunya, yang mungkin diubah, yang lagi-lagi menggunakan mountizin, dan mungkin izin filesystem untuk membuat mountpoint baru.

Saya belum menguji trik seperti itu, tetapi dapat dilihat bahwa zfsmembedakan antara createdan renameizin, dan juga antara mountdan mountpointizin. Seseorang membayangkan itu mungkin untuk memungkinkan pengguna untuk membuat sistem file baru, tetapi sekali dibuat, pengguna tidak dapat mengubah nama mereka. Untuk filesystem dengan mountpoints yang diwarisi, mengubah nama filesystem sering juga akan mengubah nama mountpoint filesystem, seperti ketika mengganti nama tank/usr/localuntuk tank/usr/local.OLDmengubah mountpoint dari /usr/localke /usr/local.OLD.

Pemisahan dari mountatau renamedari mountpointizin berarti bahwa pengguna dapat diizinkan untuk mengubah nama sistem file tetapi tidak diizinkan untuk mengubah mountpoint-nya. Atau sebaliknya, untuk dapat mengubah di mana sistem file dipasang, tetapi tidak dapat mengubah nama sistem file.

Kekayaan operasi sistem berkasnya dan pendelegasian operasi tersebut, ditambah dengan perincian izin, dapat membuat zfsagak sulit, tetapi juga sangat kuat.

Jim L.
sumber
Jawaban ini diperluas dari yang asli. Saya berharap ini akan terus mendapat upvotes sebelumnya.
Jim L.
0

Ini terlihat seperti Anda memiliki snapshot di mana izin tidak ada.

Coba aktifkan receiveizin neo/backups/freebsd/iocage/jails/owncloud/root/data@2018-03-03.

Sepertinya sudah diatur dengan benar pada volume, tetapi hilang pada snapshot.

hargut
sumber