我想使用 rsync 通过 ssh 从远程网络服务器进行自动备份。网络服务器是用 suphp 配置的,所以不同的站点有不同的用户和组的文件。不幸的是,Web 应用程序会生成一些没有组或其他读取权限的文件。
我只能看到两个选项,一个都不好吃;要么以 root 身份运行 rsync,要么允许每个 Web 用户进行 ssh 访问,然后依次以每个 Web 用户身份运行 rsync。
不幸的是,ACL 不起作用,因为当文件由具有 600 权限的网络服务器创建时,这会调整继承的 ACL 掩码以使其他用户的有效权限为 000。
任何人都可以建议一种以最低可能权限运行 rsync 的方法,该方法仍然允许访问没有组或其他读取权限的用户文件。
谢谢
我有一个解决办法,把问题转过来。我没有将数据从生产机器拉到备份机器,而是将数据从生产机器推送到备份机器。
这样,我只需在生产机器上以 PHP 用户身份运行 rsync,在备份机器上以备份用户身份运行。备份用户的 ssh 授权密钥文件允许我进一步锁定生产服务器 IP 的访问,并限制可以运行 rsync 的命令。
我可以看到 3 条线索,它们都不是很简单。
您可以在没有 ssh 的情况下在 vpn 或 ssl 隧道中使用 rsync,这样 rsync 进程将非常有限,具有只读共享。
您可以运行数据的只读绑定挂载,并在其中使用 rsync/ssh 数据。
使用功能http://linux.die.net/man/7/capabilities,尤其是 CAP_DAC_READ_SEARCH 您的非特权进程应该能够读取所有内容。要更改 rsync 的功能,我会使用http://linux.die.net/man/8/setcap。
此处描述了基于功能的干净解决方案: 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(无需 root 即可读取任何文件)提供给用户备份。仅当使用具有与继承相同的功能集的可执行文件(以及隐含启用它的“有效”位)时,它才会启用该功能。
-- 使用命令在文件 /usr/bin/rsync 上设置有效和继承能力:
它提供了在使用给定二进制文件时仅向给定用户读取所有内容的能力(而不是对使用相同二进制文件的任何其他人)