OneFS: NFS에 대한 Linux 커널 업데이트로 인해 '액세스' 호출 실패가 발생함
Riepilogo: Linux 커널의 NFS(Network File System) 코드 업데이트로 인해 특정 OneFS 사용 권한 집합에 대한 'WRITE' 사용 권한을 확인하는 'access' 호출 동작이 변경되었습니다. 이 변경으로 Linux NFS 및 SMB(Server Message Block) 동작이 서로 일치하므로 사용 중인 프로토콜에 관계없이 이 검사의 일관성이 보장됩니다. ...
Sintomi
Linux 커널 업그레이드 후 이전에 성공한 액세스 확인은 액세스하는 사용자에게 워크플로와 관련된 디렉토리에 대한 "delete_child" 권한이 없는 디렉토리에서 실패합니다. 이는 Linux를 사용하여 검증할 수 있습니다. test 명령을 -w 동일한 디렉토리에 대한 플래그; 이전 커널 버전에서 해당 명령의 반환 코드는 다음과 같습니다. 0 반면 최신 커널에서는 1명령을 사용합니다.
이는 Red Hat 및 Centos 클라이언트가 버전 7에서 최신 릴리스로 이동하는 데 영향을 미칩니다.
Causa
이러한 동작 변경은 NFS 드라이버 코드를 리팩터링하는 동안 Linux 메인라인 커널 v4.13-rc2 에 도입되었습니다. 그러나 분명히 검사는 메인라인 커널 v3.7-rc1
부터 존재했으며 올바르게 호출되지 않았습니다.
광범위한 검토 후 새로운 Linux 커널 동작과 우리의 동작이 모두 옳다고 생각합니다. 리눅스 test command 및 access 시스템 호출은 모두 다음을 개념화하는 POSIX 표준을 기반으로합니다.
- 읽다
- 쓰다
- 수행하다
반면 rfc1813#section-3.3.4 및 rfc7530#section-16.1
; NFS는 보다 세분화된 사용 권한을 허용하므로 다음을 개념화합니다.
- 읽다
- 수정하다
- 덧붙이다
- 삭제
- 수행하다
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
Risoluzione
이 문제의 영향을 받는 워크플로는 다음을 제공해야 하므로 이 상황에서 OneFS 및 Linux 동작은 모두 올바릅니다. delete_child 영향을 받는 사용자 및 그룹에 대한 사용 권한입니다. 예를 들어 디렉토리가 소유자 사용자 및 그룹에 전체 액세스 권한을 제공하지만 delete_child everyone 권한에서 해당 권한을 모든 사람에게 추가하거나 문제가 발생하는 사용자 또는 그룹에 대한 ACE(Access Control Entry)를 의 ACL(Access Control List)에 직접 추가할 수 있습니다.
# 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)