OneFS: Aktualizacja jądra systemu plików NFS powoduje niepowodzenie wywołania dostępu
Riepilogo: Aktualizacja kodu sieciowego systemu plików (NFS) w jądrze systemu Linux zmieniła zachowanie wywołań "access" sprawdzających uprawnienia "WRITE" dla określonych zestawów uprawnień OneFS. Ta zmiana sprawia, że zachowania systemu Linux NFS i bloku komunikatów serwera (SMB) są ze sobą zgodne, dzięki czemu ta kontrola jest spójna niezależnie od używanego protokołu. ...
Sintomi
Po uaktualnieniu jądra systemu Linux kontrole dostępu, które wcześniej zakończyły się powodzeniem, teraz kończą się niepowodzeniem w katalogach, w których użytkownik uzyskujący dostęp nie ma uprawnień "delete_child" w katalogu związanym z jego przepływem pracy. Można to sprawdzić za pomocą systemu Linux test polecenie za pomocą polecenia -w flaga dla tego samego katalogu; W starych wersjach jądra kod powrotny z tego polecenia to 0 podczas gdy w nowszych jądrach jest to 1.
Dotyczy to klientów Red Hat i Centos przechodzących z wersji 7 do nowszych wersji.
Causa
Ta zmiana zachowania została wprowadzona w głównym jądrze systemu Linux w wersji 4.13-rc2 podczas refaktoryzacji kodu sterownika NFS. Jednak najwidoczniej check był obecny w głównym jądrze v3.7-rc1
i nie był poprawnie wywoływany.
Po szczegółowym przeglądzie uważamy, że zarówno nowe zachowanie jądra Linuksa, jak i nasze zachowanie jest poprawne. Linux test komenda i access Wywołania systemowe są oparte na standardzie POSIX, który konceptualizuje jedynie:
- CZYTAĆ
- PISAĆ
- WYKONAĆ
zgodnie z rfc1813#sekcja-3.3.4 i rfc7530#sekcja-16.1
; NFS umożliwia bardziej szczegółowe uprawnienia, a zatem konceptualizuje:
- CZYTAĆ
- MODYFIKOWAĆ
- DOŁĄCZYĆ
- DELETE
- WYKONAĆ
Uprawnienie DELETE jest definiowane jako określa, czy klient może Delete an existing directory entry. To bezpośrednio odwzorowuje na delete_child w OneFS i powinny zostać odrzucone w okolicznościach, w których klient nie ma takiego uprawnienia. Zauważ również; Uprawnienia POSIX i NFS nie są dokładnie zgodne. POSIX WRITE zawiera wszystkie pojęcia w oddzielnych uprawnieniach NFS MODIFY, APPEND i DELETE. Tak więc, gdy narzędzie POSIX próbuje sprawdzić uprawnienia "WRITE", jądro Linuksa tłumaczy to żądanie "WRITE" na "MODIFY and APPEND and DELETE"
Wreszcie, nowsze zachowanie jest bardziej zgodne z innymi sterownikami systemu plików Linux, które również obsługują ten zestaw uprawnień. Na przykład testowanie na pliku SMB z tym samym zestawem uprawnień również zwraca błąd podczas sprawdzania POSIX WRITE z parametrem test za pomocą polecenia -w flaga.
# Old kernel ancons@ubuntu:~$ uname -r 4.13.0-041300rc1-generic ancons@ubuntu:~$ sudo mount -o vers=4,proto=tcp 10.20.0.181:/ifs /mnt/nfs ancons@ubuntu:~$ sudo mount -o user=admin,pass=a //10.20.0.181/ifs /mnt/smb ancons@ubuntu:~$ test -w /mnt/nfs/posix; echo "$?" 0 ancons@ubuntu:~$ test -w /mnt/smb/posix; echo "$?" 1 # New kernel ancons@ubuntu:~$ uname -r 4.14.0-041400rc4-generic ancons@ubuntu:~$ sudo mount -o vers=4,proto=tcp 10.20.0.181:/ifs /mnt/nfs ancons@ubuntu:~$ sudo mount -o user=admin,pass=a //10.20.0.181/ifs /mnt/smb ancons@ubuntu:~$ test -w /mnt/nfs/posix; echo "$?" 1 ancons@ubuntu:~$ test -w /mnt/smb/posix; echo "$?" 1
Risoluzione
Zachowania systemów OneFS i Linux w tej sytuacji są poprawne, ponieważ przepływy pracy, których dotyczy ten problem, muszą zapewniać delete_child Uprawnienia dla użytkowników i grup, których dotyczy problem. Jeśli na przykład katalog zapewnia pełny dostęp do swojego właściciela i grupy, ale usuwa delete_child z poziomu uprawnienia wszyscy mogą dodać to uprawnienie do wszystkich lub dodać dodatkowy wpis kontroli dostępu (ACE) dla użytkownika lub grupy, która widzi problemy bezpośrednio na liście kontroli dostępu (ACL).
# ACL that only allows root to delete child items p980-1-1# ls -led /ifs/posix-delete_child drwxrwxrwx + 2 root wheel 0 Jun 18 14:20 /ifs/posix-delete_child OWNER: user:root GROUP: group:wheel 0: user:root allow dir_gen_read,dir_gen_write,dir_gen_execute,std_write_dac,delete_child 1: group:wheel allow dir_gen_read,dir_gen_write,dir_gen_execute,delete_child 2: everyone allow dir_gen_read,dir_gen_write,dir_gen_execute # ACL that allows a specific additional group to delete child items p980-1-1# ls -led /ifs/posix-delete_child drwxrwxrwx + 2 root wheel 0 Jun 18 14:20 /ifs/posix-delete_child OWNER: user:root GROUP: group:wheel 0: group:admin allow dir_gen_read,dir_gen_write,dir_gen_execute,delete_child 1: user:root allow dir_gen_read,dir_gen_write,dir_gen_execute,std_write_dac,delete_child 2: group:wheel allow dir_gen_read,dir_gen_write,dir_gen_execute,delete_child 3: everyone allow dir_gen_read,dir_gen_write,dir_gen_execute # ACL that allows everyone to delete child items p980-1-1# ls -led /ifs/posix-delete_child drwxrwxrwx + 2 root wheel 0 Jun 18 14:20 /ifs/posix-delete_child OWNER: user:root GROUP: group:wheel 0: user:root allow dir_gen_read,dir_gen_write,dir_gen_execute,std_write_dac,delete_child 1: group:wheel allow dir_gen_read,dir_gen_write,dir_gen_execute,delete_child 2: everyone allow dir_gen_read,dir_gen_write,dir_gen_execute,delete_child
Możliwe jest również zaktualizowanie jądra Linuksa, aby odwrócić to zachowanie. Wymaga to zbudowania jądra Linuksa ze źródeł po aktualizacji fs/nfs/dir.c Aby wymontować NFS4_ACCESS_DELETE wymóg wynikający z NFS_MAY_WRITE Makro.
Przed:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Po:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)