OneFS: Оновлення ядра Linux до NFS спричиняє збої викликів «доступу»
Summary: Оновлення коду мережевої файлової системи (NFS) у ядрі Linux змінило поведінку викликів «доступу», які перевіряють дозволи «WRITE» для певних наборів дозволів OneFS. Ця зміна приводить поведінку Linux NFS і блоку повідомлень сервера (SMB) у відповідність одна до одної, роблячи цю перевірку узгодженою незалежно від того, який протокол ви використовуєте. ...
Symptoms
Після оновлення ядра Linux перевірки доступу, які раніше були успішними, тепер зазнають невдачі в каталогах, у яких користувач, що має доступ, не має прав «delete_child» на каталог, пов'язаний з їхнім робочим процесом. Це можна перевірити за допомогою Linux test за допомогою команди -w прапор проти тієї ж директорії; У старих версіях ядра код повернення цієї команди виглядає наступним чином 0 тоді як у нових ядрах це 1.
Це впливає на перехід клієнтів Red Hat і Centos з версії 7 на новіші.
Cause
Ця зміна в поведінці була внесена в основне ядро Linux v4.13-rc2 під час рефакторингу коду драйвера NFS. Однак, судячи з усього, перевірка була присутня станом на версію основного ядра v3.7-rc1
, і її неправильно називали.
Після детального розгляду ми вважаємо, що як нова поведінка ядра Linux, так і наша поведінка є правильними. Компанія linux test command і access Обидва системні виклики базуються на стандарті POSIX, який лише концептуалізує:
- ЧИТАТИ
- НАПИСАТИ
- ВИКОНАТИ
Беручи до уваги, що відповідно до rfc1813#section-3.3.4 та rfc7530#section-16.1
; NFS надає більш детальні дозволи, а отже, концептуалізує:
- ЧИТАТИ
- ЗМІНИТИ
- ДОДАТИ
- ВИДАЛИТИ
- ВИКОНАТИ
При цьому дозвіл DELETE визначається як те, чи може клієнт Delete an existing directory entry. Це безпосередньо пов'язано з delete_child в OneFS, і повинні бути відхилені в обставинах, коли клієнт не має такого дозволу. Також зверніть увагу; Дозволи POSIX і NFS не зовсім збігаються. POSIX WRITE включає всі концепції в окремих дозволах на зміну, додавання та видалення NFS. Отже, коли інструмент 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)