OneFS: Uppdatering av Linux-kerneln till NFS orsakar fel vid åtkomstanrop
Riepilogo: En uppdatering av NFS-kod (Network File System) i Linux-kärnan har ändrat beteendet för åtkomstanrop som kontrollerar skrivbehörigheter för specifika OneFS-behörighetsuppsättningar. Den här ändringen gör att Linux NFS- och SMB-beteenden (Server Message Block) överensstämmer med varandra, vilket gör den här kontrollen konsekvent oavsett vilket protokoll du använder. ...
Sintomi
Efter en uppgradering av Linux-kerneln misslyckas nu åtkomstkontroller som tidigare lyckades på kataloger där den anropande användaren inte har "delete_child"-behörighet för en katalog som ingår i arbetsflödet. Detta kan valideras med hjälp av Linux-programmet. test kommandot med -w flagga mot samma katalog. På gamla kernelversioner är returkoden från det kommandot 0 I nyare kärnor är det 1.
Detta påverkar Red Hat- och Centos-klienter som flyttar från version 7 till nyare versioner.
Causa
Den här beteendeändringen introducerades i Linux mainline kernel v4.13-rc2 under en omarbetning av NFS-drivrutinskoden. Tydligen fanns dock kontrollen från huvudkärnan v3.7-rc1
, och anropades inte korrekt.
Efter omfattande granskning anser vi att både den nya Linuxkärnans beteende och vårt beteende är korrekta. Linux test Kommando och access systemanrop baseras båda på POSIX-standarden, som endast konceptualiserar:
- LÄSA
- SKRIVA
- UTFÖRA
Enligt rfc1813#section-3.3.4 och rfc7530#section-16.1
; NFS tillåter mer detaljerade behörigheter och konceptualiserar därför:
- LÄSA
- MODIFIERA
- BIFOGA
- TA BORT
- UTFÖRA
Där DELETE-behörigheten definieras som om en klient kan Delete an existing directory entry. Detta mappar direkt till delete_child i OneFS, och bör nekas under omständigheter där klienten inte har den behörigheten. Lägg också märke till; POSIX- och NFS-behörigheter matchar inte exakt. POSIX WRITE innehåller alla begrepp i de separata behörigheterna NFS MODIFY, ADD och DELETE. Så när ett POSIX-verktyg försöker kontrollera "WRITE"-behörigheter, översätter Linux-kärnan denna begäran om "WRITE" till "MODIFY and APPEND and DELETE"
Slutligen är det nyare beteendet mer i linje med andra Linux-filsystemdrivrutiner som också stöder den här behörighetsuppsättningen. Om du till exempel testar mot en SMB-filer med samma behörighetsuppsättning returneras även ett fel när du kontrollerar POSIX WRITE med test kommandot med hjälp av -w flagga.
# 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
Både OneFS- och Linux-beteenden under dessa omständigheter är korrekta, eftersom sådana arbetsflöden som påverkas av det här problemet måste tillhandahålla delete_child Behörighet till berörda användare och grupper. Om en katalog till exempel ger fullständig åtkomst till dess ägare, användare och grupp, men tar bort delete_child från behörigheten Alla kan de antingen lägga till den behörigheten till Alla, eller så kan de lägga till ytterligare en Access Control Entry (ACE) för den användare eller grupp som ser problem i åtkomstkontrollistan (ACL) för direkten.
# 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
Det är också möjligt att uppdatera Linux-kärnan för att återställa beteendet. Detta kräver att Linux-kärnan byggs från källan efter uppdatering fs/nfs/dir.c för att ta bort NFS4_ACCESS_DELETE krav från NFS_MAY_WRITE makro.
Före:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Efter:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)