OneFS. Обновление ядра Linux до NFS приводит к сбоям вызова 'access'
Summary: Обновление кода сетевой файловой системы (NFS) в ядре Linux изменило поведение вызовов access, проверяющих разрешения WRITE для определенных наборов разрешений OneFS. Это изменение приводит поведение Linux NFS и SMB (Server Message Block) в соответствие друг с другом, что делает эту проверку согласованной независимо от используемого протокола. ...
Symptoms
После модернизации ядра Linux проверки доступа, которые ранее были успешными, теперь завершаются сбоем в каталогах, в которых пользователь, получающий доступ, не имеет разрешений «delete_child» для каталога, связанного с его рабочим процессом. Это можно проверить с помощью test с помощью команды -w флаг напротив того же каталога; В старых версиях ядра код возврата из этой команды выглядит следующим образом: 0 в то время как в более новых ядрах он 1.
Это влияет на клиентов Red Hat и Centos, переходящих с версии 7 на более новые выпуски.
Cause
Это изменение поведения было внесено в основное ядро Linux версии 4.13-rc2 во время рефакторинга кода драйвера NFS. Однако, по-видимому, проверка присутствовала в основном ядре v3.7-rc1
и вызывалась неправильно.
После тщательного анализа мы пришли к выводу, что и поведение нового ядра Linux, и наше поведение являются правильными. Линукс test command и access Оба системных вызова основаны на стандарте POSIX, который концептуализирует только:
- ЧИТАТЬ
- ПИСАТЬ
- ИСПОЛНЯТЬ
Принимая во внимание, что согласно rfc1813#section-3.3.4 и rfc7530#section-16.1
; NFS предоставляет более детализированные разрешения и поэтому концептуализирует:
- ЧИТАТЬ
- МОДИФИЦИРОВАТЬ
- ПРИБАВЛЯТЬ
- DELETE
- ИСПОЛНЯТЬ
При этом разрешение DELETE определяется как то, может ли клиент Delete an existing directory entry. Это напрямую связано с delete_child в OneFS и должен быть запрещен в обстоятельствах, когда у клиента нет такого разрешения. Также обратите внимание; Разрешения POSIX и NFS не совпадают. POSIX WRITE включает в себя все концепции в отдельных разрешениях NFS MODIFY, APPEND и DELETE. Поэтому, когда инструмент POSIX пытается проверить права "WRITE", ядро Linux преобразует этот запрос на "WRITE" в "MODIFY and APPEND and DELETE"
Наконец, новое поведение больше соответствует другим драйверам файловой системы Linux, которые также поддерживают этот набор разрешений. Например, тестирование файловой системы SMB с тем же набором разрешений также возвращает ошибку при проверке POSIX WRITE с помощью команды test с помощью команды -w флаг.
# 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
Resolution
Поведение OneFS и Linux в этом случае правильно, так как такие рабочие процессы, на которые влияет эта проблема, должны предоставлять delete_child Разрешение для затронутых пользователей и групп. Например, если каталог предоставляет полный доступ своему владельцу, пользователю и группе, но удаляет delete_child В разрешении «Все» можно добавить это разрешение для всех или добавить дополнительную запись контроля доступа (ACE) для пользователя или группы, у которых возникли проблемы, в список контроля доступа (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
Также можно обновить ядро Linux, чтобы изменить поведение. Для этого необходимо собрать ядро Linux из исходного кода после обновления fs/nfs/dir.c Чтобы удалить NFS4_ACCESS_DELETE требование от NFS_MAY_WRITE макрос.
До:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
После:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)