无法让 rsync 在 daemon-over-ssh 模式下工作

rjm*_*nro 11 ssh rsync

我正在尝试设置 rsync 以每天从服务器复制数据。为了尽可能限制系统,我尝试使用手册页中描述的模式:“通过远程外壳连接使用 RSYNC-DAEMON 功能”

所以我在根目录文件夹中放置了一个名为 rsyncd.conf 的文件:

[root]
path = /
read only = true
Run Code Online (Sandbox Code Playgroud)

并尝试复制 /etc/passwd 作为测试:

rsync -vv -e ssh myserver::root/etc/passwd .
Run Code Online (Sandbox Code Playgroud)

但我得到以下信息:

opening connection using: ssh myserver rsync --server --daemon . 
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(635) [receiver=3.0.3]
Run Code Online (Sandbox Code Playgroud)

我做这一切的原因是,一旦我开始工作,我计划通过指定命令来限制访问

rsync --server --daemon .
Run Code Online (Sandbox Code Playgroud)

在 ~/.ssh/authorized_keys

rjm*_*nro 11

文档或 rsync 的实现中似乎存在错误。man rsync说:

Rsync 支持使用远程 shell 连接到主机,然后生成一个一次性“守护程序”服务器,该服务器期望读取远程用户目录中的配置文件。

但是当连接到 root 时,根据 /var/log/messages,它在 /etc/rsyncd.conf 中查找配置文件(rsyncd.conf 文件的标准位置,当不通过 SSH 使用时。

我不得不通过添加来强制 ssh 服务器使用正确的配置文件

command="rsync --config=/root/rsyncd.conf --server --daemon ."
Run Code Online (Sandbox Code Playgroud)

到 /root/.ssh/authorized_keys。

我不只是将配置放在默认位置的原因是我不希望有人意外启动一个普通的 rsync 守护进程 - 我只希望守护进程在获得正确的 ssh 密钥时拥有这么多的访问权限。


Mik*_*eyB 5

如果您想尽可能地将其锁定,那么守护进程模式下的 rsync 不是我建议的。您想限制允许 SSH 密钥运行的命令并使用该密钥调用复制命令。

要找出限制密钥的命令,请在 ssh 命令中稍作修改后运行适当的 rsync 命令行:

rsync -avz -e 'ssh -v' stuff somewhere:/place
Run Code Online (Sandbox Code Playgroud)

您将在调试输出中看到一行,例如:

debug1: Sending command: rsync --server -vlogDtprze.iLs . /place
Run Code Online (Sandbox Code Playgroud)

那个确切的命令是您想要限制密钥能够在 .ssh/authorized_keys 中运行的命令:

command="rsync --server -vlogDtprze.iLs . /place" ssh-dss AAAASSHKEY=
Run Code Online (Sandbox Code Playgroud)

  • 我希望能够对系统的各个部分进行不同的只读备份 - 例如每天备份电子邮件和 SQL 数据库,但每周一次。对于每个可能的备份,我都需要一个特定的命令和一个特定的密钥,而且我无法使用相同的基础架构进行额外的临时备份。 (3认同)
  • 足够公平 - 我从字面上理解“为了使系统尽可能受到限制”:) (2认同)