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

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

我正在备份服务器上备份服务器。每台备份的服务器在备份服务器上都有自己的帐户,并且文件会进行rsync。重要的是,权限保持完整(使用 rsync -p)以简化恢复。

我正在尝试创建一个可以读取文件并创建一些统计信息的脚本。我不喜欢该脚本在根用户下运行,而且也不可能为每个备份用户运行它,因为该脚本应该能够读取所有用户的所有文件。但是,当文件被 chmodded 600 等时,这会产生问题。我不想触及权限,但除 root 和所有者之外的其他用户无法读取它。

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

答案1

使用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

答案2

您可以编写一个只能由您的备份用户执行suid的版本cat(创建一个备份用户独占的组,并使可执行文件只能由该组读取)。这cat只会允许您读取您感兴趣的目录中的文件。(您可能希望禁止符号链接并注意诸如 之类的技巧/dir/../otherdir/。)

然后你的脚本就可以使用这个可执行文件来读取文件而无需root权限。

答案3

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

如果您有机器的 root 访问权限,您可以使用以下命令执行此操作ACL:

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

这将使用户能够USERNAME读取/path/to/directory.

答案4

ZFS 为此提供了一些机制。

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

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

相关内容