사용자 vi
및 rust
공유 그룹은 rust
특정 파일을 공유하려고 합니다.
rust$ ls -l myfile
-rw-rw-r-- 1 vi rust 0 May 30 03:48 myfile
rust$ stat myfile | grep Gid
Access: (0664/-rw-rw-r--) Uid: ( 1000/ vi) Gid: ( 1057/ rust)
rust$ id
uid=1048(rust) gid=1057(rust) groups=1057(rust),...
rust$ cat myfile
rust$ touch myfile
touch: cannot touch ‘myfile’: Permission denied
rust $ dd of=myfile
dd: failed to open ‘myfile’: Permission denied
vi$ id
uid=1000(vi) gid=1000(vi) groups=1000(vi),{many unrelated groups skipped},1057(rust),{many unrelated groups skipped}
vi$ touch myfile
vi$
g+w에도 불구하고 "vi" 사용자만 파일에 대한 쓰기 권한을 갖습니다.
root# chown rust myfile
rust$ ls -l myfile
-rw-rw-r-- 1 rust rust 0 May 30 03:51 myfile
vi$ touch myfile
rust$ chmod g-w myfile
vi$ touch myfile
touch: cannot touch ‘myfile’: Permission denied
vi
쓰기 가능한 rust
파일은 g+w 비트에 따라 다릅니다(예외).
그룹 쓰기 가능 비트가 한 방향으로만 작동하는 이유는 무엇입니까?
모드에서도 파일을 사용할 수 없습니다 a+w
. 세 번째 사용자는 파일에 쓸 수 있지만 a+w
...
getfacl myfile
반품 Invalid argument
.
이 파일은 로컬 reiserfs에 있습니다.
id vi
그리고 각 사용자의 쉘에서 관련되지 않은 그룹의 순서를 id rust
일치시킵니다 .id
또 하나의 실험:
vi$ chmod a+w myfile
vi$ stat myfile
File: ‘myfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fb02h/64258d Inode: 12618147 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ vi) Gid: ( 1057/ rust)
Access: 2016-05-30 18:49:20.000000000 +0300
Modify: 2016-05-30 20:48:23.000000000 +0300
Change: 2016-05-30 20:48:23.000000000 +0300
Birth: -
뿌리#다이빙-J -u 녹슨 -g 녹슨 -- id uid=1048(러스티) gid=1057(러스티) 그룹=1057(러스티) 루트# 다이브 -J -u 녹 -g 녹 -- dd of=/home/vi/home/rust/myfile dd: '/home/vi/home/rust/myfile'을 열 수 없습니다: 권한이 거부되었습니다. 루트# 다이빙 -J -u 녹 -g 99999 -- id uid=1048(rust) gid=99999 그룹=99999 루트# dive -J -u Rust -g 99999 -- dd of=/home/vi/home/rust/myfile 식품의약품안전청 0+1 레코드 0+1 레코드 출력 9바이트(9B), 1.14971초, 0.0kB/초 복사
미스터리. grsecurity 패치가 문제가 될까요?
다음 실험:
root# stat /home/vi/home/rust/myfile
File: ‘/home/vi/home/rust/myfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fb02h/64258d Inode: 13848412 Links: 1
Access: (0664/-rw-rw-r--) Uid: (99997/ UNKNOWN) Gid: (99998/ UNKNOWN)
Access: 2016-05-31 00:39:24.000000000 +0300
Modify: 2016-05-31 00:39:24.000000000 +0300
Change: 2016-05-31 00:39:24.000000000 +0300
Birth: -
root# getfacl /home/vi/home/rust/myfile
getfacl: /home/vi/home/rust/myfile: Invalid argument
root# for i in {0..1099}; do if dived -J -u $i -g 99998 -- touch /home/vi/home/rust/myfile 2> /dev/null; then echo $i; fi; done
0
1000
root#
root#
root# mount -o remount,noacl /home
root#
root# for i in {0..1099}; do if dived -J -u $i -g 99998 -- touch /home/vi/home/rust/myfile 2> /dev/null; then echo $i; fi; done | head
0
1
2
3
4
5
6
7
8
9
(and so on, basically it works)
root# mount -o remount,acl /home
root#
root# for i in {0..1099}; do if dived -J -u $i -g 99998 -- touch /home/vi/home/rust/myfile 2> /dev/null; then echo $i; fi; done | head
0
1000
root#
getfacl
(또는 커널 부분) 문제가 있는 것 같습니다 . ACL은 유효하지만 관리할 수 없습니다.
답변1
문제는 Linux에서 ReiserFS가 무시된다는 것입니다.https://bbs.archlinux.org/viewtopic.php?id=197628
커널 4.4.x의 reiserfs에서 ACL이 손상되었습니다(잘못된 매개변수 오류). 4.3.x는 나에게 잘 작동합니다...
4.4 이후에는 커널에 들어가는 방법을 확인하지 않았습니다.
파일 시스템에서 손상된 ACL을 제거하려면 <4.4 커널로 재부팅해야 합니다.