我想使用 rsync 通过 ssh 从远程 Web 服务器进行自动备份。Web 服务器配置了 suphp,因此不同的站点的文件属于不同的用户和组。不幸的是,Web 应用程序会生成一些没有组或其他读取权限的文件。
我只能看到两个选项,但都不太可取;要么以 root 身份运行 rsync,要么允许每个 Web 用户访问 ssh,然后依次以每个 Web 用户身份运行 rsync。
不幸的是,ACL 不起作用,因为当 Web 服务器创建具有 600 个权限的文件时,这会调整继承的 ACL 掩码,使其他用户的有效权限为 000。
有人可以建议一种以最低可能的权限运行 rsync 的方法,但仍然允许访问没有组或其他读取权限的用户文件。
谢谢
答案1
我通过反转问题找到了解决方案。我没有将数据从生产机器拉到备份机器,而是将数据从生产机器推送到备份机器。
这样,我只需在生产机器上以 PHP 用户身份运行 rsync,在备份机器上以备份用户身份运行 rsync。备份用户的 ssh 授权密钥文件允许我进一步锁定生产服务器 IP 的访问权限,并限制可以运行 rsync 的命令。
答案2
我看到了 3 条线索,但没有一条是真正简单的。
您可以在 vpn 或 ssl 隧道中使用无需 ssh 的 rsync,这样 rsync 进程就会受到很大限制,并且只具有只读共享。
您可以运行数据的只读绑定挂载,并在其中使用 rsync/ssh 数据。
使用功能http://linux.die.net/man/7/capabilities,尤其是 CAP_DAC_READ_SEARCH ,你的非特权进程应该能够读取所有内容。要更改 rsync 的功能,我会使用http://linux.die.net/man/8/setcap。
答案3
基于能力的清洁解决方案描述如下: https://blog.night-shade.org.uk/2015/04/linux-capabilities-and-rsync-from-presentation-to-practice/
编辑:解决方案的详细信息。功能由进程功能(在进程之间继承并由 PAM 最初设置)和文件功能(在可执行文件上设置)的组合组成。要在使用 rsync 时授予用户“备份”完全读取权限:
-- 在 /etc/security/capability.conf 中添加一行
cap_dac_read_search backup
将 cap_dac_read_search(无需 root 身份即可读取任何文件)提供给用户备份。仅当使用具有与继承相同的功能集的可执行文件时,它才会启用该功能(并且“有效”位会隐式启用它)。
-- 使用命令在文件 /usr/bin/rsync 上设置有效并继承功能:
setcap cap_dac_read_search+ei /usr/bin/rsync
它允许特定用户在使用特定二进制文件时读取所有内容(而其他使用相同二进制文件的用户则无法读取)。