OneFS: Linux-kjerneoppdatering til NFS forårsaker feilslåtte tilgangsanrop
Summary: En oppdatering av NFS-kode (Network File System) i Linux-kjernen har endret virkemåten til tilgangsanrop som kontrollerer skrivetillatelser for bestemte OneFS-tillatelsessett. Denne endringen bringer Linux NFS og Server Message Block (SMB) atferd i tråd med hverandre, noe som gjør denne kontrollen konsekvent uavhengig av hvilken protokoll du bruker. ...
Symptoms
Etter en oppgradering av Linux-kjernen mislykkes tilgangskontrollene som tidligere lyktes, på kataloger der brukeren som får tilgang ikke har "delete_child"-tillatelser i en katalog som er involvert i arbeidsflyten. Dette kan valideres ved hjelp av Linux test kommando med -w flagg mot den samme katalogen; På gamle kjerneversjoner er returkoden fra denne kommandoen 0 mens i nyere kjerner er det 1.
Dette påvirker Red Hat- og Centos-klienter som går over fra versjon 7 til nyere utgivelser.
Cause
Denne endringen i virkemåten ble introdusert i Linux-hovedkjerne v4.13-rc2 under en refaktor av NFS-driverkoden. Men tilsynelatende sjekken var til stede som av hovedkjernen v3.7-rc1
, og ble ikke riktig kalt.
Etter omfattende gjennomgang tror vi at både den nye Linux-kjernens oppførsel og vår oppførsel er riktig. Linuxen test kommando og access systemkall er begge basert på POSIX-standarden, som bare konseptualiserer:
- LESE
- SKRIVE
- HENRETTE
Mens per rfc1813#section-3.3.4 og rfc7530#section-16.1
; NFS tillater mer detaljerte tillatelser, og konseptualiserer derfor:
- LESE
- MODIFISERE
- TILFØYE
- SLETT
- HENRETTE
Med DELETE-tillatelsen definert som om en klient kan Delete an existing directory entry. Dette tilordnes direkte til delete_child i OneFS, og bør nektes under omstendigheter der klienten ikke har den tillatelsen. Legg også merke til; POSIX- og NFS-tillatelser stemmer ikke helt overens. POSIX WRITE inneholder alle konseptene i de separate tillatelsene NFS MODIFY, ADD og DELETE. Så når et POSIX-verktøy forsøker å sjekke "WRITE" -tillatelser, oversetter linux-kjernen den forespørselen om "WRITE" til "MODIFY and ADDD and DELETE"
Endelig er den nyere oppførselen mer i tråd med andre Linux-filsystemdrivere som også støtter dette tillatelsessettet. Hvis du for eksempel tester mot en SMB-fil med samme tillatelsessett, returneres også en feil når du kontrollerer POSIX WRITE med test kommandoen ved hjelp av -w flagg.
# 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
Både OneFS- og Linux-virkemåten i denne situasjonen er riktige, da arbeidsflyter som påvirkes av dette problemet, må gi delete_child Tillatelse til berørte brukere og grupper. Hvis for eksempel en katalog gir full tilgang til eierbruker og -gruppe, men fjerner delete_child Fra alle-tillatelsen kan de enten legge til denne tillatelsen for alle, eller de kan legge til en ekstra tilgangskontrolloppføring (ACE) for brukeren eller gruppen som ser problemer med tilgangskontrollisten (ACL) for 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å mulig å oppdatere Linux-kjernen for å tilbakestille oppførselen. Dette krever bygging av Linux-kjernen fra kilden etter oppdatering fs/nfs/dir.c Slik tar du ut NFS4_ACCESS_DELETE krav fra NFS_MAY_WRITE makro.
Før:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Etter:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)