以非超级用户身份读取另一个用户拥有的文件


9

我正在备份服务器上的服务器。备份的每个服务器在备份服务器上都有其自己的帐户,并且文件被同步。重要的是,保持权限完整(使用rsync -p)以简化还原。

我正在尝试创建一个脚本,该脚本可以读取文件并创建一些统计信息。我不希望该脚本在root用户下运行,并且也不可能为每个备份用户运行该脚本,因为该脚本应该能够从所有用户读取所有文件。但是,这会在文件更改为例如600的情况下产生问题。我不想触摸权限,但是除root和所有者之外的其他用户无法读取它。

特定的非root用户应该能够读取目录或分区中的所有文件,而不管权限级别如何(文件的所有者应该没有办法阻止它)。有没有办法做到这一点?我正在使用ZFS卷运行FreeBSD。


这是我在该网站上提出的第一个问题:)您可能也可以对此进行研究。unix.stackexchange.com/questions/91488/…–
拉梅什

Answers:


4

使用sudo

如果您的sudoers文件列出了确切且特定的命令,则该命令必须完全按照中列出的命令进行调用,sudoers否则将被拒绝。

例如:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

在此示例中,用户backup可以完全按照所示执行命令:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

如果他们调用sudo rsync...而不是sudo /usr/bin/rsync命令失败,或者标志或路径不同,则命令失败。

如果要在脚本中执行此操作,则要启用无密码使用这些命令:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

有关更多信息,请参见的sudoers(5)手册页Cmnd_list


好点子。我在sudoers文件中添加了ls,cat,head,tail等命令,现在可以以root特权执行它们并读取所有文件。可能不是每个人的最佳解决方案,因为用户可以读取系统上的所有文件,但这在我的设置中不是问题。
伊维安农2014年

好吧,如果您使用的是Solaris,我建议使用RBAC和pfexec。但是由于您使用的是BSD,sudo因此必须这样做。
巴哈马特

4

您可以编写一个只能由备份用户执行的suid版本cat(将组设为备份用户专有的,并使可执行文件仅可由该组读取)。这cat将只允许您读取您感兴趣的目录中的文件。(您可能希望禁止符号链接,并提防类似的技巧/dir/../otherdir/。)

然后,您的脚本可以使用此可执行文件来读取文件,而无需具有root特权。


4

警告:正如Stephane在下面的评论中指出的那样,文件的所有者仍然可以撤消ACL。

如果您具有对该计算机的root访问权限,则可以使用ACL进行此操作:

setfacl -R -m u:USERNAME:r /path/to/direcory

这将使使用USERNAME权限可以访问下的所有文件和目录/path/to/directory


文件的所有者仍然可以删除这些ACL。
斯特凡Chazelas

@StephaneChazelas哦。即使这是由根完成的?我没意识到。你知道吗?
terdon

不,在Linux上,我会研究Linux功能和LSM的结合。在FreeBSD上,我不知道。
斯特凡Chazelas

1

Bindfs是一个FUSE文件系统,它提供具有不同权限和所有权的目录树视图。FreeBSD没有端口,但是您可以从源代码进行编译。

要为用户backupper(和只有该用户)提供/some/files所有文件可读位置的视图,请/some/files在的私有目录中装入的世界可读视图backupper

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files

0

ZFS为此提供了一些机制。

其中一种机制仍在研究中,尚未实现,但允许使用“所有者”替代来装入数据集。在这种情况下,您可以克隆快照,将其所有者覆盖的快照覆盖到备份用户,备份它,然后销毁克隆。缺点是您不备份文件的真实所有权。

最好的解决方案可能是ZFS nfsv4样式的ACL


0

关于如何使用特定于FreeBSD的技术解决此问题,我有两个想法,尽管我也没有尝试过:

  • 使用辣椒。这是我的首选方法。另外,由于它最近已经移植到Linux,因此它也应该在这里工作。它会像这样:

    1. 创建一个drop-cap-write命令,该命令删除CAP_WRITE然后执行命令行上提供的命令
    2. 使用sudo允许备份用户无需密码即可执行该命令
    3. (可选)使用sshd_config的ForceCommand指令在备份用户登录时自动执行该命令。这样,远程用户就无需在其备份脚本中指定drop-cap-write。
  • 使用强制访问控制。这在Linux AFAIK上不起作用,设置起来比较麻烦。它会像这样:

    1. 创建一个rootdir为/的backup-jail。硬编码囚犯。
    2. 在备用监狱中运行sshd。即使您在常规sshd中不允许root登录,也要允许root登录
    3. 在/etc/rc.conf中设置ugidfw_enable =“ YES”
    4. 使用看起来像这样的ugidfw规则:

    ugidfw添加使用者uid根jailid BACKUP_JAIL_ID模式rsx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.