OneFS:LinuxカーネルをNFSにアップデートすると「アクセス」コールが失敗する
摘要: LinuxカーネルのNetwork File System (NFS)コードの更新により、特定のOneFS権限セットの「WRITE」権限をチェックする「access」コールの動作が変更されました。この変更により、Linux NFSとSMB(Server Message Block)の動作が一致し、使用しているプロトコルに関係なく、このチェックの一貫性が保たれます。
症状
Linuxカーネルのアップグレード後、以前は成功していたアクセス チェックが、アクセスするユーザーがワークフローに関連するディレクトリーに対する「delete_child」権限を持っていないディレクトリーで失敗するようになりました。これは、Linux test コマンドを -w その同じディレクトリに対するフラグ。古いカーネル バージョンでは、このコマンドからのリターン コードは 0 一方、新しいカーネルでは 1が連携しない場合があります。
これは、バージョン7からそれ以降のリリースに移行しているRed HatおよびCentosクライアントに影響します。
原因
この動作の変更は、NFSドライバー コードのリファクター中にLinuxメインライン カーネル v4.13-rc2 で導入されました。しかし、どうやらこのチェックはメインラインカーネル v3.7-rc1
の時点で存在しており、正しく呼び出されていませんでした。
広範囲にわたるレビューの結果、新しいLinuxカーネルの動作と私たちの動作の両方が正しいと考えています。ザ・リナックス test command と access システムコールはどちらもPOSIX標準に基づいており、POSIX標準は以下を概念化しているだけです。
- 読む
- 書く
- 実行する
一方、rfc1813#section-3.3.4およびrfc7530#section-16.1
;NFSでは、より細分化された権限が許可されるため、次の概念が提供されます。
- 読む
- 修飾する
- 追加
- DELETE
- 実行する
DELETE権限が定義されている場合は、クライアントが Delete an existing directory entryが連携しない場合があります。これは、以下に直接マッピングされます。 delete_child クライアントにその権限がない状況では拒否されるべきです。また、注意してください。POSIXとNFSの権限が完全には一致しません。POSIX WRITEには、個別のNFSのMODIFY、APPEND、DELETE権限のすべての概念が含まれています。したがって、POSIXツールが「WRITE」権限をチェックしようとすると、Linuxカーネルは「WRITE」の要求を「MODIFYとAPPENDとDELETE」に変換します
最後に、新しい動作は、このアクセス許可セットもサポートする他の Linux ファイル システム ドライバーとより一致しています。たとえば、同じ権限セットを持つSMBファイラーに対してテストすると、POSIX WRITEを test コマンドを -w 旗。
# 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
解决方案
この状況でのOneFSとLinuxの両方の動作は正しいです。この問題の影響を受けるワークフローでは、 delete_child 影響を受けるユーザーとグループへのアクセス許可。たとえば、ディレクトリーが所有者のユーザーとグループにフル アクセスを提供するが、 delete_child Everyone権限から、その権限をすべてのユーザーに追加するか、問題が発生しているユーザーまたはグループのアクセス制御エントリー(ACE)をのアクセス制御リスト(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
Linuxカーネルを更新して、動作を元に戻すこともできます。これには、更新後にソースからLinuxカーネルをビルドする必要があります fs/nfs/dir.c 削除するには NFS4_ACCESS_DELETE 要件を NFS_MAY_WRITE マクロ。
処理前:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND | \ NFS4_ACCESS_DELETE)
処理後:
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ NFS4_ACCESS_EXTEND)