OneFS: NFS'ye yönelik Linux çekirdeği güncelleştirmesi 'erişim' çağrısı hatalarına neden oluyor
摘要: Linux çekirdeğindeki Ağ Dosya Sistemi (NFS) kodunda yapılan bir güncelleştirme, belirli OneFS izin kümeleri için 'WRITE' izinlerini denetleyen 'erişim' çağrılarının davranışını değiştirdi. Bu değişiklik, Linux NFS ve Sunucu İleti Bloğu (SMB) davranışlarını birbiriyle uyumlu hale getirerek, kullandığınız protokolden bağımsız olarak bu denetimin tutarlı olmasını sağlar. ...
症状
Bir Linux çekirdeği yükseltmesinden sonra, daha önce başarılı olan erişim denetimleri artık erişen kullanıcının iş akışıyla ilgili bir dizinde "delete_child" izinlerine sahip olmadığı dizinlerde başarısız olur. Bu, Linux kullanılarak doğrulanabilir test komutu ile -w aynı dizine karşı bayrak; Eski çekirdek sürümlerinde, bu komutun dönüş kodu şöyledir 0 oysa daha yeni çekirdeklerde 1.
Bu, sürüm 7'den daha yeni sürümlere geçiş yapan Red Hat ve Centos istemcilerini etkiler.
原因
Davranıştaki bu değişiklik, NFS sürücü kodunun yeniden düzenlenmesi sırasında Linux ana hat çekirdeği v4.13-rc2'de kullanıma sunulmuştur. Ancak görünüşe göre kontrol, ana hat çekirdeği v3.7-rc1'den
itibaren mevcuttu ve doğru şekilde çağrılmıyordu.
Kapsamlı bir incelemeden sonra, hem yeni Linux çekirdeği davranışının hem de davranışımızın doğru olduğuna inanıyoruz. Linux test komut ve access sistem çağrılarının her ikisi de yalnızca aşağıdakileri kavramsallaştıran POSIX standardına dayanmaktadır:
- OKUMAK
- YAZMAK
- YÜRÜTMEK
rfc1813#bölüm-3.3.4 ve rfc7530#bölüm-16.1'e
göre; NFS daha ayrıntılı izinlere izin verir ve bu nedenle şunları kavramsallaştırır:
- OKUMAK
- DEĞİŞTİRMEK
- EKLEME
- DELETE
- YÜRÜTMEK
DELETE izni, bir istemcinin şunları yapıp yapamayacağı olarak tanımlanır Delete an existing directory entry. Bu doğrudan şuna eşlenir: delete_child OneFS'de yer alır ve istemcinin bu izne sahip olmadığı durumlarda reddedilmelidir. Ayrıca dikkat edin; POSIX ve NFS izinleri tam olarak eşleşmiyor. POSIX WRITE, ayrı NFS DEĞIŞTIRME, EKLEME ve SİLME izinlerindeki tüm kavramları içerir. Bu nedenle, bir POSIX aracı "YAZMA" izinlerini kontrol etmeye çalıştığında, linux çekirdeği bu "YAZMA" isteğini "DEĞIŞTIR ve EKLE ve SİL" olarak çevirir
Son olarak, yeni davranış, bu izin kümesini destekleyen diğer Linux dosya sistemi sürücüleriyle daha uyumludur. Örneğin, aynı izin kümesine sahip bir SMB dosyalayıcısına karşı test yapmak, POSIX WRITE ile kontrol edilirken de bir hata döndürür. test komutunu kullanarak -w bayrak.
# 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
解决方案
Bu sorundan etkilenen iş akışlarının sağlaması gerektiğinden bu durumda hem OneFS hem de Linux davranışları doğrudur. delete_child Etkilenen kullanıcılar ve gruplar için izin. Örneğin, bir dizin sahip kullanıcısına ve grubuna tam erişim sağlıyor ancak delete_child herkes izninden, bu izni herkese ekleyebilir veya sorunları gören kullanıcı veya grup için doğrudan Erişim Denetimi Listesine (ACL) ek bir Erişim Denetimi Girişi (ACE) ekleyebilirler.
# 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
Davranışı geri döndürmek için Linux çekirdeğini güncelleştirmek de mümkündür. Bu, güncellemeden sonra Linux çekirdeğinin kaynaktan oluşturulmasını gerektirir fs/nfs/dir.c Kaldırmak için NFS4_ACCESS_DELETE gereksinimi NFS_MAY_WRITE Makro.
Önce:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
Sonra:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)