OneFS: Linux-kernelupdate naar NFS veroorzaakt fouten bij 'access'-aanroep
摘要: Een update van de NFS-code (Network File System) in de Linux-kernel heeft het gedrag gewijzigd van 'access'-aanroepen waarbij 'WRITE'-machtigingen worden ingeschakeld voor specifieke OneFS-machtigingensets. Deze wijziging brengt het gedrag van Linux NFS en Server Message Block (SMB) op elkaar af, waardoor deze controle consistent wordt, ongeacht het protocol dat u gebruikt. ...
症状
Na een upgrade van de Linux-kernel mislukken toegangscontroles die eerder waren gelukt nu op directory's waarin de gebruiker die toegang heeft geen "delete_child"-machtigingen heeft in een directory die betrokken is bij hun workflow. Dit kan worden gevalideerd met behulp van de test opdracht met de -w markering tegen diezelfde directory; Op oude kernelversies is de retourcode van die opdracht 0 terwijl het bij nieuwere kernels 1te installeren.
Dit is van invloed op Red Hat- en Centos-clients die van versie 7 naar nieuwere releases gaan.
原因
Deze gedragswijziging is geïntroduceerd in Linux mainline kernel v4.13-rc2 tijdens een refactor van de NFS-drivercode. Blijkbaar was de controle echter aanwezig vanaf mainline kernel v3.7-rc1
en werd deze niet correct aangeroepen.
Na uitgebreid onderzoek zijn we van mening dat zowel het gedrag van de nieuwe Linux-kernel als ons gedrag correct zijn. De linux test Commando en access systeemaanroepen zijn beide gebaseerd op de POSIX-standaard, die alleen het volgende conceptualiseert:
- LEZEN
- SCHRIJVEN
- EXECUTEREN
Overwegende dat per rfc1813#section-3.3.4 en rfc7530#section-16.1
; NFS staat meer gedetailleerde machtigingen toe en conceptualiseert daarom:
- LEZEN
- MODIFICEREN
- TOEVOEGEN
- VERWIJDEREN
- EXECUTEREN
Waarbij de DELETE-machtiging wordt gedefinieerd als de vraag of een client Delete an existing directory entryte installeren. Dit komt rechtstreeks overeen met delete_child in OneFS, en moet worden geweigerd in omstandigheden waarin de klant die toestemming niet heeft. Let ook op; POSIX- en NFS-machtigingen komen niet precies overeen. POSIX WRITE bevat alle concepten in de afzonderlijke NFS MODIFY, APPEND en DELETE machtigingen. Dus wanneer een POSIX-tool probeert om "WRITE"-machtigingen te controleren, vertaalt de linux-kernel dat verzoek voor "WRITE" in "MODIFY and APPEND and DELETE"
Ten slotte is het nieuwere gedrag meer in lijn met andere Linux-bestandssysteemdrivers die deze machtigingenset ook ondersteunen. Testen tegen een SMB-filer met dezelfde machtigingenset retourneert bijvoorbeeld ook een fout bij het controleren van POSIX WRITE met de test opdracht met behulp van de -w vlag.
# 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
解决方案
Zowel het OneFS- als het Linux-gedrag in dit geval zijn correct, omdat dergelijke workflows die door dit probleem worden beïnvloed, de volgende moeten bieden: delete_child Rechten voor getroffen gebruikers en groepen. Dit kan bijvoorbeeld het geval zijn als een directory volledige toegang biedt tot de eigenaar, gebruiker en groep, maar delete_child van de machtiging Iedereen kunnen ze die machtiging aan iedereen toevoegen, of ze kunnen een extra toegangscontrole-invoer (ACE) toevoegen voor de gebruiker of groep die problemen ondervindt aan de toegangscontrolelijst (ACL) van de rechtstreeks.
# 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
Het is ook mogelijk om de Linux-kernel bij te werken om het gedrag ongedaan te maken. Hiervoor moet de Linux-kernel worden gebouwd vanaf de broncode na de update fs/nfs/dir.c om de NFS4_ACCESS_DELETE vereiste van de NFS_MAY_WRITE macro.
Vóór:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Na:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)