OneFS: Aktualizace jádra Linuxu na NFS způsobuje selhání volání "access"
摘要: Aktualizace kódu NFS (Network File System) v linuxovém jádře změnila chování volání "access", která kontrolují oprávnění "WRITE" pro konkrétní sady oprávnění OneFS. Tato změna přivádí chování linuxového systému NFS a SMB (Server Message Block) do vzájemného souladu, takže tato kontrola je konzistentní bez ohledu na to, jaký protokol používáte. ...
症状
Po aktualizaci linuxového jádra nyní selhávají kontroly přístupu, které byly dříve úspěšné, v adresářích, ve kterých přistupující uživatel nemá oprávnění "delete_child" k adresáři zapojenému do jeho pracovního postupu. To lze ověřit pomocí nástroje Linux test pomocí příkazu -w příznak u stejného adresáře; U starých verzí jádra je návratový kód z tohoto příkazu 0 kdežto v novějších jádrech je 1.
To má vliv na klienty Red Hat a Centos, kteří přecházejí z verze 7 na novější verze.
原因
Tato změna chování byla zavedena v hlavním jádře Linuxu v4.13-rc2 během refaktoringu kódu ovladače NFS. Zdá se však, že kontrola byla přítomna od hlavního jádra v3.7-rc1
a nebyla správně volána.
Po důkladném přezkoumání se domníváme, že jak chování nového linuxového jádra, tak naše chování je správné. Operační systém Linux test příkaz a access Systémová volání jsou založena na standardu POSIX, který konceptualizuje pouze:
- ČÍST
- PSÁT
- PROVÉST
vzhledem k tomu, že podle rfc1813#section-3.3.4 a rfc7530#section-16.1
; NFS umožňuje podrobnější oprávnění, a proto konceptualizuje:
- ČÍST
- UPRAVIT
- PŘIPOJIT
- DELETE
- PROVÉST
S oprávněním DELETE definovaným jako to, zda klient může Delete an existing directory entry. To se přímo mapuje na delete_child v systému OneFS a mělo by být odepřeno za okolností, kdy klient toto oprávnění nemá. Také si všimněte; Oprávnění POSIX a NFS se přesně neshodují. POSIX WRITE zahrnuje všechny koncepty v samostatných oprávněních NFS MODIFY, APPEND a DELETE. Takže když se POSIX nástroj pokusí zkontrolovat oprávnění "WRITE", linuxové jádro překládá tento požadavek na "WRITE" na "MODIFY and APPEND and DELETE"
A konečně, novější chování je více v souladu s ostatními ovladači systému souborů Linux, které také podporují tuto sadu oprávnění. Například testování proti souboru SMB se stejnou sadou oprávnění také vrátí chybu při kontrole POSIX WRITE pomocí test pomocí příkazu -w vlajka.
# 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
解决方案
Chování systému OneFS i systému Linux je za těchto okolností správné, jelikož pracovní postupy ovlivněné tímto problémem musí poskytovat delete_child Oprávnění pro ovlivněné uživatele a skupiny. Pokud například adresář poskytuje úplný přístup svému vlastníkovi, uživateli a skupině, ale odebere delete_child z oprávnění Everyone mohou buď přidat toto oprávnění pro Everyone, nebo mohou přidat další položku Access Control (ACE) pro uživatele nebo skupinu, u které dochází k problémům, do seznamu Access Control (ACL) přímo.
# 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
Je také možné aktualizovat jádro Linuxu, aby se chování vrátilo. To vyžaduje sestavení linuxového jádra ze zdrojových kódů po aktualizaci fs/nfs/dir.c Chcete-li odebrat NFS4_ACCESS_DELETE požadavek ze strany NFS_MAY_WRITE makro.
Před:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Po:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)