如何在保留权限的情况下以非 root 用户身份运行 rsync 备份/复制脚本?这是一个多用户文件服务器,每个用户都有一个 *nix 帐户来获取权限。
以 root 用户身份运行会带来明显的安全风险 - 尤其是当您使用无密码 ssh 密钥自动执行此操作时。
但是在 root 以外的用户(例如具有数据目录的完整组权限的备份用户)中运行时会遇到设置权限的问题,因为只有所有者或 root 可以更改权限。
在理想情况下,生产服务器用户只有只读访问权限。
谢谢!
答案1
您可以使用 fakeroot -s:
-s save-file
Save the fakeroot environment to save-file on exit. This file
can be used to restore the environment later using -i. However,
this file will leak and fakeroot will behave in odd ways unless
you leave the files touched inside the fakeroot alone when out‐
side the environment. Still, this can be useful. For example, it
can be used with rsync(1) to back up and restore whole directory
trees complete with user, group and device information without
needing to be root. See /usr/share/doc/fakeroot/README.saving
for more details.
答案2
您是否考虑过只允许使用 ssh 密钥执行强制命令,而不是使用其他帐户?我写了关于如何在 rsync 上进行此设置的文章我的博客不久以前。
这意味着 ssh 密钥只能用于运行您指定的精确 rsync 命令,而不能用于其他任何命令。
设置备份用户不是我以前考虑过的事情,但我预计这会是一份更多的工作 - 而且,因为这是一个多用户系统,你如何确保所有文件都可以被该用户读取?
答案3
我将在生产系统上配置一个 rsync 服务器,以便允许对生产数据进行只读访问。
类似这样的事情可以解决这个问题:
# cat /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
[prd_data]
path = /path/to/prd_data
comment = Production data
read only
# grep rsync /etc/inetd.conf
rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon
# grep rsync /etc/services
rsync 873/tcp
然后在备份端,您可以根据需要配置一个fakeroot环境,然后运行:
# rsync -az --delete rsync://prod_server/prd_data /path/to/fakeroot
答案4
当需要 rsync 操作并维护所有所有权/权限时,我不向 root 开放服务器访问权限,我的解决方案是两个都使用额外机器上的中间暂存区,从实时服务器推送并拉取到备份。
这样一来,备份服务器和实时服务器都拥有 SSH 访问权限和暂存区域的 root 权限,但无需进行通信根本直接连接,因此不需要彼此的特权访问。并且暂存服务器不需要任何访问权限即可与实时或备份计算机建立连接。
这增加了一点复杂性,但意味着您不需要在任一端通过 SSH 启用特权帐户登录。它还通过分离增加了一些额外的有用安全性 - 如果您确保实时服务器和备份服务器不共享任何凭据,那么如果有人设法侵入(或只是获取/猜测密码)实时服务器或备份服务器上的特权帐户,他们就无法使用对其中一个服务器的访问权限轻松访问另一个服务器。