OneFS: Linux-kerneopdatering til NFS forårsager 'adgangsopkaldsfejl'
摘要: En opdatering til NFS-koden (Network File System) i Linux-kernen har ændret adfærden for "adgangs"-kald, der kontrollerer "WRITE"-tilladelser for specifikke OneFS-tilladelsessæt. Denne ændring bringer adfærden i Linux NFS og Server Message Block (SMB) på linje med hinanden, hvilket gør denne kontrol konsistent, uanset hvilken protokol du bruger. ...
症状
Efter en Linux-kerneopgradering mislykkes adgangskontroller, der tidligere var lykkedes, nu på mapper, hvor den bruger, der får adgang, ikke har "delete_child"-tilladelser til en mappe, der er involveret i deres arbejdsgang. Dette kan valideres ved hjælp af Linux test Kommandér med -w flag mod samme mappe På gamle kerneversioner er returkoden fra denne kommando 0 der henviser til, at det i nyere kerner er 1.
Dette påvirker Red Hat- og Centos-klienter, der flytter fra version 7 til nyere udgivelser.
原因
Denne ændring i funktionsmåde blev introduceret i Linux-hovedlinjekerne v4.13-rc2 under en omstrukturering af NFS-driverkoden. Men tilsyneladende var kontrollen til stede fra hovedlinjekernen v3.7-rc1
og blev ikke korrekt kaldt.
Efter omfattende gennemgang mener vi, at både den nye Linux-kerneadfærd og vores adfærd er korrekt. Linux test kommando og access Systemkald er begge baseret på POSIX-standarden, som kun konceptualiserer:
- LÆSE
- SKRIVE
- UDFØRE
der henviser til, at i henhold til rfc1813#sektion-3.3.4 og rfc7530#sektion-16.1
; NFS tillader mere detaljerede tilladelser og konceptualiserer derfor:
- LÆSE
- MODIFICERE
- TILFØJE
- SLETTE
- UDFØRE
Når tilladelsen SLET defineres som, hvorvidt en klient kan Delete an existing directory entry. Dette er direkte knyttet til delete_child i OneFS, og bør nægtes under omstændigheder, hvor klienten ikke har denne tilladelse. Bemærk også; POSIX- og NFS-tilladelser stemmer ikke nøjagtigt overens. POSIX WRITE indeholder alle begreberne i de separate tilladelser NFS MODIFY, ADD og DELETE. Så når et POSIX-værktøj forsøger at kontrollere "WRITE" -tilladelser, oversætter linuxkernen denne anmodning om "WRITE" til "MODIFY and ADD and DELETE"
Endelig er den nyere adfærd mere på linje med andre Linux-filsystemdrivere, der også understøtter dette tilladelsessæt. Hvis du f.eks. tester mod en SMB-fil med det samme tilladelsessæt, vises der også en fejl ved kontrol af POSIX WRITE med test Kommando ved hjælp af -w flag.
# 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
解决方案
Både OneFS- og Linux-funktionsmåderne under disse omstændigheder er korrekte, da sådanne arbejdsprocesser, der påvirkes af dette problem, skal give delete_child tilladelse til berørte brugere og grupper. Hvis et katalog f.eks. giver fuld adgang til ejerbrugeren og gruppen, men fjerner delete_child Fra tilladelsen Alle kan de enten føje denne tilladelse til alle, eller de kan tilføje en ekstra adgangskontrolpost (ACE) for den bruger eller gruppe, der oplever problemer, på adgangskontrollisten (ACL) for den direkte.
# 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 er også muligt at opdatere Linux-kernen for at ændre adfærden. Dette kræver, at Linux-kernen bygges fra kilden efter opdatering fs/nfs/dir.c for at fjerne NFS4_ACCESS_DELETE Krav fra NFS_MAY_WRITE makro.
Før:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Efter:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)