![以非 root 身份读取另一个用户拥有的文件](https://linux22.com/image/37085/%E4%BB%A5%E9%9D%9E%20root%20%E8%BA%AB%E4%BB%BD%E8%AF%BB%E5%8F%96%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7%E6%8B%A5%E6%9C%89%E7%9A%84%E6%96%87%E4%BB%B6.png)
我正在备份服务器上备份服务器。每台备份的服务器在备份服务器上都有自己的帐户,并且文件会进行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