我正在尝试创建服务器上各种文件夹的自动备份,其中一些文件夹需要 root 权限才能读取。我意识到我可以按照此方法进行 rsync回答,也就是说我可以(成功)做到
rsync ... --rsync-path="sudo rsync" ...
但是,此解决方案意味着我必须向具有 sudo 权限(或至少具有使用 rsync 的 sudo 权限)的用户添加公共 ssh 密钥。由于 rsync 是一个功能强大的工具,我希望通过以下方式添加更多保护:
- 为私有 ssh-key 添加密码,或者
- 限制用户可以通过 rsync 执行的操作。
前者在自动备份中实际上是不可能的。而“rrsync”似乎可以完成后者,请参阅这里。
但是,我在使用 rrsync 访问需要 root 访问权限的文件夹时遇到了问题。我按照上面的 rrsync 教程操作,并在远程服务器上设置 rrsync,~/.ssh/authorized_keys
方法是在密钥前面添加
command="/path/to/rrsync -ro /path/to/backups/"
然后尝试在本地运行
rsync ... --rsync-path="sudo rsync" ...
然后 rrsync 会抛出一个错误。具体如下:
/path/to/rrsync: SSH_ORIGINAL_COMMAND='sudo /usr/bin/rsync --server --sender ...' is not rsync
因此,我的理解是 rrsync 不允许使用“sudo rsync”。这是 rrsync 的缺点还是故意的?或者还有其他方法可以实现我想要做的事情?
答案1
要将 rrsync 与 sudo 一起使用,您需要配置 sudo 以保留SSH_ORIGINAL_COMMAND
环境变量。
sudo rrsync
通过在远程服务器上编辑以下内容来配置远程服务器备份用户的 ssh,使其始终运行~/.ssh/authorized_keys
:
command="/usr/bin/sudo /usr/bin/rrsync -ro /path/to/backups/" ssh-rsa AAAA...
sudo
在远程服务器上需要保留 SSH_ORIGINAL_COMMAND 环境变量,该变量由 sshd 在使用command
上述配置时设置,并且是 rrsync 所必需的。要在远程服务器上执行此操作,请运行visudo /etc/sudoers.d/rrsync
并输入以下内容:
Defaults!/usr/bin/rrsync env_keep += "SSH_ORIGINAL_COMMAND"
backup_user ALL = (root) NOPASSWD: /usr/bin/rrsync
将其替换backup_user
为您通过 ssh 进入远程服务器的用户名。
您现在可以通过在本地服务器上运行以下命令将远程目录 rsync 到本地服务器:
rsync -axv backup_user@remote-server:/path/to/backups/ local-backups/
答案2
您是否考虑过尝试使用赋予特定用户权限的 NFS?我想有关目标和当前服务器的安全性的更多信息将有助于找到另一种解决方案……或者可能更好地理解您当前的 rsync 解决方案。我很困惑为什么您认为 ssh 密钥会受到密码保护。如果您是 root 并且 root 正在运行 rsync……那么您可以访问任何文件……包括您拥有的任何 ssh 密钥。
答案3
限制 rsync 权限的一种方法是将其作为服务器上的守护进程运行。通常,你会有一个配置文件,/etc/rsyncd.conf
指定哪些目录可以复制或写入,并且 rsync 会永久监听给定端口上的连接,以便客户端发送请求(使用语法::
而:
不是用户@主机:/目录)不幸的是,数据没有加密,并且身份验证是通过简单的纯文本密码进行的,因此这只有在受信任的网络上才可行。
但是,你也可以让 rsync 以这种模式运行ssh 连接内部。这将恢复网络安全。您仍然需要用户在 rsync 上运行 sudo,但使用一组固定的参数。sudoers 条目将是:
user clienthost = NOPASSWD: /usr/bin/rsync --config=/etc/myconfig --server --daemon .
注意末尾的“。”。客户端将运行:
rsync -a --rsh=ssh --rsync-path='sudo rsync --config=/etc/myconfig' \
remote::dir1/a/b /local/a/b
请注意,rsync 添加了额外的选项。此外,该--rsh
选项是必需的,否则::
语法将期望连接到已在运行的守护进程。文件/etc/myconfig
(只对 root 写入)将是:
log file = /var/log/mylog
[dir1]
path=/x/y/z
use chroot = true
read only = true
uid = 0
客户端dir1/a/b
被映射到/x/y/z/a/b
远程。
如果需要,可以在用户文件的部分sudo rsync --config=/etc/myconfig
中进行修复,但需要添加部分,因为在这种情况下 ssh 将忽略客户端的命令。command=
~/.ssh/authorized_keys
--server --daemon .
man rsyncd.conf
在开始此解决方案之前,请务必阅读守护进程模式的 rsync 手册页描述。