setfacl 错误地更改了组权限

setfacl 错误地更改了组权限

为了备份服务器的“/home”目录树,我创建了一个“备份”帐户并使用 setfacl 使其可读整个目录。我的 cron 作业每晚以 root 身份运行此命令:

setfacl -R -m u:backup:rx,d:u:backup:rx /home

很好,除了一个问题:每当我运行此命令时,它都会更改我的 ssh 密钥的组权限。

me@myserver:~/.ssh$ ls /home/me/.ssh/id_rsa -l
-rw-r-x---+ 1 me me 1679 Jan  8 18:35 /home/me/.ssh/id_rsa

好吧,这会导致我的 ssh 程序崩溃,因为它现在是组可读的。奇怪的是,getfacl 不同意权限。

me@myserver:~/.ssh$ getfacl /home/me/.ssh/id_rsa
getfacl: Removing leading '/' from absolute path names
# file: home/me/.ssh/id_rsa
# owner: me
# group: me
user::r--
user:backup:r-x
group::---
mask::r-x
other::---

getfacl 认为该文件不是组可读的。如果我运行明显的命令

chmod 400 id_rsa

权限是固定的,但每次重新运行原始命令(setfacl -R -mu:backup:rx,d:u:backup:rx /home)时都会恢复。这是怎么回事?

注意:我确实希望备份我的 id_rsa,所以我们不用担心这些安全问题。

答案1

如果我们查看acl(5)手册页,我们会看到:

ACL 条目和文件权限位之间的对应关系

ACL 定义的权限是文件权限位指定的权限的超集。

文件所有者、组和其他权限与特定 ACL 条目之间存在对应关系:所有者权限对应于 ACL_USER_OBJ 条目的权限。如果ACL有ACL_MASK条目,则组权限对应ACL_MASK条目的权限。否则,如果 ACL 没有 ACL_MASK 条目,则组权限对应于 ACL_GROUP_OBJ 条目的权限。其他权限对应于 ACL_OTHER_OBJ 条目的权限。

如果您查看getfacl输出,您会看到 is maskr-x没有它就backup无法访问该文件。

实际上,r-x在该模式下并不意味着该me组可以访问该文件(事实并非如此),只是其他人(用户或组)可能有权访问它

不过,既然ssh是一样的,那就还不够好。

当您执行 时chmod 400,您将清除掩码,这意味着用户backup不再有权访问它。

这有点令人困惑,但这可能是协调两种权限机制的最佳方法。

对于您的问题,您可能需要进行备份root或使用功能。

答案2

我的 ssh 的行为并非如此(openssh-6.0p1-2.3.3)。

查看 ssh 调用的 strace 输出(仅检查文件)会很有趣。

我普遍怀疑这是一个好的策略。为什么不使用 root 进行备份?或者至少将 CAP_DAC_READ_SEARCH 和 CAP_DAC_OVERRIDE 提供给备份进程(使用 setcap 或 Apparmor)?

相关内容