组成员无法使用 reiserfs 和扩展 ACL 写入组可写文件

组成员无法使用 reiserfs 和扩展 ACL 写入组可写文件

用户virust共享组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。

相关内容