最初我认为我想做的事情很简单。但我越看 FreeBSDman
页面,我就越困惑这是否可能。
我有一个仅用于数据文件的 zfs 池。我想对上面写入/存储的任何内容设置相当严格的一致性和控制。一方面是我希望保留所有“静态”文件,以拥有统一的所有者/组(以前,当不同用户编写的非可执行文件被分割到不同的帐户时,这对我来说是一个真正的痛苦)。
基于这个 InfoSec SE 问题让该单个用户成为 root 用户似乎是最简单的,因为没有脚本或操作系统文件引用数据池,并且执行权限很容易未设置。
所以我觉得这听起来很简单。使用 chmodsetuid
位,一切都很好。除了man chmod
说这个做不到-o suiddir
除非使用(参见“模式”)安装数据集。好吧,这有点痛苦,因为它不是默认的,但可行。
man mount
然后添加执行位被删除(好)但说“并且它不会被授予 root”这是意想不到的,尽管从技术上讲我可以将文件提供给我创建的“虚拟”非root用户。
除了它然后添加“只有 UFS 文件系统支持此选项”,所以显然我毕竟无法使用 setiud 位,因为我安装的文件系统是 ZFS。
我正在使用 NFSv4 ACL,但我也看不到任何有助于继承所有权的内容。它们似乎只能用于防止用户更改现有所有者。
那我能做什么呢?我只想对数据集中创建/修改的所有文件强制执行单个文件所有者,但从这些页面看起来好像无法完成。
有办法实现吗?
更新:
@Raphael Ahrens - 通过静态文件,我只是指整个数据集上的文件不会被任何系统进程执行或调用 - 它们只是用户在数据集中的任何位置创建/移动/修改的数据文件和目录层次结构。
我尝试了你给出的命令。我没有注意到这setuid
是一个有效的 zfs 属性,如果它有效的话可以解决问题。但是当我尝试时,它似乎报告已启用/继承但实际上忽略了该标志?我是否做错了什么,或者我需要启用其他功能吗?这是输出,也许我错了:
# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)
# su -l temp_user
% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)
% cd /mnt/test_pool
% ls -lt
drwsrwxrwx 11 root data_managers 12 Apr 3 15:25 test_dataset
% zfs get setuid test_pool/test_dataset
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset setuid on default
% cd test_dataset
% ls -lt
drwsrwxrwx 11 root data_managers 12 Apr 3 15:26 test_dataset2
% zfs get setuid test_pool/test_dataset/test_dataset2
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset/test_dataset2 setuid on default
% cd test_dataset2
% touch testfile
% ls -lt testfile
-rw-r--r-- 1 temp_user data_managers 0 Apr 3 15:27 testfile
dir+dataset 及其父 dir+dataset 显示已设置 setuid + 继承,但在其中创建的文件是使用所有者 = 调用用户 ( temp_user
) 而不是父目录 ( root
) 的所有者创建的。
更新2:
请参阅下面的输出,它清楚地显示了问题。
数据集在 ZFS 中已启用 setuid。它是通过 suiddir 选项安装的。 long dir 输出显示 setuid 位已设置。 dir 由 root 所有,调用用户是“temp_user”。但正如OP和OP中引用的手册页中所述,其中新创建的文件( test0
)是使用owner=temp_user而不是root创建的。
这就是我正在尝试解决的问题 - 让 ZFS 文件继承文件所有权(如果可能的话),或者如果不可能的话,采取解决方法。
# id
uid=0(root) gid=0(wheel) groups=0(wheel),1002(data_managers)
# su -l temp_user
% id
uid=1003(temp_user) gid=65533(nogroup) groups=65533(nogroup),1002(data_managers)
% zfs get setuid test_pool/test_dataset/test_dataset2
NAME PROPERTY VALUE SOURCE
test_pool/test_dataset/test_dataset2 setuid on default
% mount | grep 'test_dataset2'
test_pool/test_dataset/test_dataset2 on /mnt/test_pool/test_dataset/test_dataset2 (zfs, local, noatime, suiddir, nfsv4acls)
% cd /mnt/test_pool/test_dataset
% ls -lt
drwsrwxrwx 5 root wheel 9 Apr 3 22:30 test_dataset2
% cd test_dataset2
% touch test0
% ls -lt test0
-rw-r--r-- 1 temp_user wheel 0 Apr 3 22:32 test0