OneFS: Linux-ytimen päivitys NFS:ään aiheuttaa pääsykutsuvirheitä
Riepilogo: Linux-ytimen NFS (Network File System) -koodin päivitys on muuttanut tiettyjen OneFS-käyttöoikeusjoukkojen kirjoitusoikeuksia tarkistavien access-kutsujen toimintaa. Tämä muutos tuo Linux NFS:n ja SMB (Server Message Block) -toiminnot linjaan, mikä tekee tarkistuksesta yhdenmukaisen riippumatta siitä, mitä protokollaa käytät. ...
Sintomi
Linux-ytimen päivityksen jälkeen aiemmin onnistuneet käyttöoikeustarkistukset epäonnistuvat nyt hakemistoissa, joissa käyttäjällä ei ole delete_child-oikeuksia työnkulkuun liittyvään hakemistoon. Tämä voidaan vahvistaa Linuxilla test komento, jossa on -w merkitse samaa hakemistoa vastaan; Vanhoissa ytimen versioissa kyseisen komennon palautuskoodi on 0 kun taas uudemmissa ytimissä se on 1.
Tämä vaikuttaa Red Hat- ja Centos-asiakkaiden siirtymiseen versiosta 7 uudempiin julkaisuihin.
Causa
Tämä käyttäytymisen muutos otettiin käyttöön Linuxin päälinjan ytimessä v4.13-rc2 NFS-ajurikoodin refaktoroinnin aikana. Ilmeisesti tarkistus oli kuitenkin olemassa päälinjan ytimestä v3.7-rc1
, eikä sitä kutsuttu oikein.
Laajan tarkastelun jälkeen uskomme, että sekä uuden Linux-ytimen käyttäytyminen että käyttäytymisemme ovat oikeita. Linux test komento ja access Molemmat järjestelmäkutsut perustuvat POSIX-standardiin, joka käsittää vain:
- LUKEA
- KIRJOITTAA
- SUORITTAA
Kun taas rfc1813#section-3.3.4 ja rfc7530#section-16.1
; NFS sallii yksityiskohtaisemmat käyttöoikeudet ja käsitteellistää siksi:
- LUKEA
- MUOKATA
- LIITTÄÄ
- DELETE
- SUORITTAA
Kun DELETE-oikeus määritellään sen mukaan, voiko asiakas Delete an existing directory entry. Tämä kartoittaa suoraan delete_child OneFS:ssä, ja se on evättävä olosuhteissa, joissa asiakkaalla ei ole kyseistä lupaa. Huomaa myös; POSIX- ja NFS-käyttöoikeudet eivät täsmää tarkalleen. POSIX WRITE sisältää kaikki erillisten NFS-muokkaus-, liittämis- ja POISTO-oikeuksien käsitteet. Joten kun POSIX-työkalu yrittää tarkistaa "WRITE"-oikeudet, linux-ydin kääntää "WRITE"-pyynnön muotoon "MODIFY and APPEND and DELETE"
Lopuksi, uudempi toiminta vastaa paremmin muita Linux-tiedostojärjestelmäohjaimia, jotka myös tukevat tätä käyttöoikeusjoukkoa. Esimerkiksi testaus SMB-arkistoijalla, jolla on sama käyttöoikeusjoukko, palauttaa myös virheen, kun POSIX WRITE tarkistetaan test komento komennolla -w lippu.
# 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
Tässä tapauksessa sekä OneFS- että Linux-toiminta on oikein, koska työnkuluissa, joihin ongelma vaikuttaa, on annettava delete_child käyttöoikeudet käyttäjille ja ryhmille, joita ongelma koskee. Esimerkiksi jos hakemisto tarjoaa omistajalle, käyttäjälle ja ryhmälle täydet käyttöoikeudet, mutta poistaa delete_child Kaikki-oikeudesta he voivat joko lisätä kyseisen käyttöoikeuden kaikille tai lisätä ACE (Access Control Entry) -merkinnän käyttäjälle tai ryhmälle, jolla on ongelmia suoraan käyttöoikeusluettelossa (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
On myös mahdollista päivittää Linux-ydin toiminnan palauttamiseksi. Tämä edellyttää Linux-ytimen rakentamista lähdekoodista päivityksen jälkeen fs/nfs/dir.c Voit poistaa NFS4_ACCESS_DELETE vaatimus NFS_MAY_WRITE makro.
Ennen:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Jälkeen:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)