用户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
并在各个用户的 shell 中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(生锈) root# 潜水 -J -u rust -g rust -- dd of=/home/vi/home/rust/myfile dd:无法打开“/home/vi/home/rust/myfile”:权限被拒绝 root# 潜水 -J -u rust -g 99999 -- id uid=1048(rust) gid=99999 组=99999 root# 潜水 -J -u rust -g 99999 -- dd of=/home/vi/home/rust/myfile 食品药品监督管理局 0+1 条记录 0+1记录输出 复制 9 个字节 (9 B),1.14971 秒,0.0 kB/秒
一个谜。 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
问题是 ReiserFS 在 Linux 中被忽略:https://bbs.archlinux.org/viewtopic.php?id=197628
ACL 在内核 4.4.x 的 reiserfs 中被破坏(无效参数错误)4.3.x 对我来说工作得很好......
我还没有检查过 4.4 之后如何进入内核。
需要重新引导到 <4.4 的内核才能从文件系统中删除损坏的 ACL。