Menggunakan NFSv4 ACL di Linux

5

Saya telah berhasil mengatur klien dan server NFSv4, secara kasar mengikuti panduan di Menyiapkan NFS HOWTO . Keduanya menjalankan Ubuntu Linux 14.04. Ini adalah lingkungan pengujian kecil tanpa otentikasi yang rumit; kedua server hanya menggunakan file passwd yang sama. Segalanya tampak bekerja dengan benar; file terlihat di klien, dan izin / ID pengguna benar.

Sekarang saya ingin menggunakan NFSv4 ACL untuk mengontrol akses ke file di server NFSv4. Saya menginstal alat baris perintah yang diperlukan pada klien, dan saya bisa melihat sesuatu yang tampak seperti NFSv4 ACL:

$ nfs4_getfacl .
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy

Namun, sementara saya bisa mendapatkan daftar ACL dengan baik, saya tidak bisa mengatur ACL. Setiap upaya menghasilkan Invalid argument kesalahan dari setxattr.

$ nfs4_setfacl -a A::OWNER@:rxtncy .
Failed setxattr operation: Invalid argument

Saya menggunakan strace untuk melihat apa yang sedang terjadi. Menurut dokumentasi yang jarang saya dapat temukan, NFSv4 ACL disimpan sebagai data XDR biner dalam atribut yang diperluas system.nfs4_acl pada file. Dan tentu saja, itulah yang terjadi; setxatt akan kembali EINVAL.

getxattr("/primary/home/rstudiouser", "system.nfs4_acl", 0x0, 0) = 80
getxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 80) = 80
setxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa9\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 104, XATTR_REPLACE) = -1 EINVAL (Invalid argument)

Jadi mengapa demikian? setxattr kegagalan? Atribut yang diperluas diaktifkan di server NFSv4:

$ sudo tune2fs -l /dev/sda1
tune2fs 1.42.9 (4-Feb-2014)
...
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file 
uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
...

Dan klien tentu saja menggunakan protokol NFSv4; menggunakan mount untuk menampilkan drive yang dipasang:

$ mount
...
192.168.55.103:/primary/home on /primary/home type nfs4 (rw,rsize=8192,wsize=8192,timeo=14,intr,nfsvers=4,acl,addr=192.168.55.103,client
addr=192.168.55.101)
...

Saya mencoba membalik semua flag debug pada nfsd untuk melihat apakah itu akan menghasilkan log yang bermanfaat.

$ sudo rpcdebug -m nfsd -s all

Itu mengkonfirmasi bahwa server menerima permintaan untuk mengatur atribut.

Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567892] nfsd_dispatch: vers 4 proc 1
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567909] nfsv4 compound op #1/2: 22 (OP_PUTFH)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567915] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567929] nfsv4 compound op ffff88003c2f6080 opcnt 2 #1: 22: status 0
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567932] nfsv4 compound op #2/2: 34 (OP_SETATTR)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567938] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567978] nfsv4 compound op ffff88003c2f6080 opcnt 2 #2: 34: status 22

Whatsapp "status 22"? Kenapa, 22 = EINVAL, Argumen Tidak Valid, yang adalah apa setxattr kembali pada klien. Sayangnya tidak muncul untuk mengungkapkan apa pun tentang Mengapa argumen tersebut dianggap tidak valid.

Beberapa hal lain yang pernah saya coba:

  1. Satu kemungkinan adalah bahwa server mengira ACL rusak. Untuk memeriksa ini, saya menggunakan nfs4_setfacl -e ., yang membuka ada ACL dalam editor teks untuk manipulasi. Menyimpan file tanpa perubahan masih menghasilkan ACL yang menghasilkan Invalid argument saat diterapkan.

  2. Pemetaan ID pengguna adalah masalah umum lainnya dengan NFSv4. Saya telah memvalidasi bahwa ID pengguna berbaris dengan benar dan kepemilikan file / mode bit benar dari sudut pandang klien NFSv4. Saya juga mencoba membuat domain untuk NFSv4 dengan mengatur Domain = localdomain di /etc/idmapd.conf pada kedua server, tidak berpengaruh.

Jika Anda menggunakan NFSv4 ACL di server NFS berbasis Linux, saya ingin tahu dari Anda; Saya menemukan banyak tutorial untuk mengatur NFSv4 sendiri (lihat tautan di bagian atas omelan ini), tetapi hampir tidak ada yang menyebutkan penggunaan ACL.

Jonathan
sumber

Jawaban:

1

Untuk apa nilainya, saya akhirnya menyerah pada upaya ini setelah beberapa tikaman dalam kegelapan, yang sebagian besar melibatkan mencoba host Ubuntu dengan ZFS.

Karena yang saya butuhkan untuk lingkungan pengujian saya adalah VM yang dapat mengekspos server NFSv4 dengan ACL, saya akhirnya mengabaikan upaya saya untuk membuat server Linux berjalan, dan menggunakan gambar FreeBSD 10.3 sebagai gantinya. Mencoba untuk membuatnya bekerja dengan NFSv4 adalah juga sulit tetapi setidaknya mungkin. Ada panduan yang cukup bagus di Internet Halaman manual FreeBSD untuk nfsv4 (4) .

Jonathan
sumber