对于在 FreeBSD 安装的数据集上使用“setuid”来确保所有文件/目录都有固定所有者感到困惑吗?

对于在 FreeBSD 安装的数据集上使用“setuid”来确保所有文件/目录都有固定所有者感到困惑吗?

最初我认为我想做的事情很简单。但我越看 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

相关内容