sshd_config ForceCommand /usr/bin/rsync 错误“连接意外关闭”

sshd_config ForceCommand /usr/bin/rsync 错误“连接意外关闭”

应如何配置 ForceCommand 以允许备份用户执行任何 rsync 命令?将 ForceCommand 设置为 /usr/bin/rsync 后,我收到以下错误:连接意外关闭...

托管要从中复制文件的远程服务器上的 /etc/ssh/sshd_config:

Match User backup
    PasswordAuthentication no  
    PubkeyAuthentication yes  
    AllowTCPForwarding no  
    X11Forwarding no  
    ForceCommand /usr/bin/rsync  

在本地服务器上运行的 rsync 命令执行从远程服务器的复制:

rsync -avzh --progress [email protected]:/opt/backups/automatic/cron/mysql/ /tmp/.  

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [Receiver=3.0.7]

如果我将 ForceCommand 配置为精确的 rsync 命令(例如下面的命令),我就可以作为备份用户成功地远程 rsync,但对于这个项目,我不想使用如下所示的完整精确命令:

ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/mysql/

如果我将 ForceCommand 配置为使用如下所示的脚本,我就能成功远程 rsync。我很好奇为什么这有效而 /usr/bin/rsync 无效?

Match User backup
    PasswordAuthentication no  
    PubkeyAuthentication yes  
    AllowTCPForwarding no  
    X11Forwarding no  
    ForceCommand /home/backup/cron/validate-rsync  

verify-rsync 脚本:

#!/bin/sh   
#script to validate rsync  
#script source: http://troy.jdmz.net/rsync/#validate-rsync  

case "$SSH_ORIGINAL_COMMAND" in   
*\&*)   
echo "Rejected"   
;;   
*\(*)   
echo "Rejected"   
;;   
*\{*)   
echo "Rejected"   
;;   
*\;*)   
echo "Rejected"   
;;   
*\<*)   
echo "Rejected"   
;;   
*\`*)   
echo "Rejected"   
;;   
*\|*)   
echo "Rejected"   
;;   
rsync\ --server*)   
$SSH_ORIGINAL_COMMAND   
;;   
*)   
echo "Rejected"   
;;   
esac   

我的主要问题是为什么 ForceCommand /usr/bin/rsync 不起作用?

我也想知道实现此目的的最佳方法是什么。我无法 chroot 备份用户,因为我正在从几个不同的文件夹复制。我真的不想使用完整的 rsync --server --client 等命令,因为我正在复制几个不同的文件夹,这似乎有点多余。我很想知道将备份用户限制为 rsync 的最简单/最佳方法是什么。

答案1

为什么很简单...ForceCommand正如它所说的那样:连接后,它会强制您运行该命令,无论您实际想做什么。在这种情况下,该命令没有 /usr/bin/rsync标志。

rsync通过在连接的另一端运行另一个副本rsync并通过 ssh 与其通信来工作。但在这种情况下,它无法使用所需的标志启动另一端,因为命令被替换为/usr/bin/rsync

rsync-validate 脚本可能是解决此问题的最佳方法。它会检查请求以确保它是有效的 rsync 服务器命令,然后才会运行它。 rsync可能可以可以修改为在没有参数的情况下运行时直接检查 $SSH_ORIGINAL_COMMAND,但出于安全原因不这样做可能是有充分理由的。

答案2

ForceCommand选项旨在与明确理解其充当SSH 守卫. 原命令放在SSH_ORIGINAL_COMMAND环境变量中。

答案3

我不认为你可以ForceCommand任何rsync 命令,但您可以使其与该命令配合使用。从客户端,您可以运行:

rsync -azh -e 'ssh -v' [email protected]:/opt/backups/automatic/cron/mysql/ /tmp/. 

获取服务器端命令。您将在密钥交换之后但在复制开始之前在详细输出中看到它:

...
debug1: Sending command: rsync --server -vlogDtprz --delete . /tmp
...

然后您可以将其添加到您的ForceCommand

ForceCommand rsync --server -vlogDtprz --delete . /tmp

来源:Sakana.fr:通过 SSH 确保自动 rsync 的安全

相关内容