Ssh

sshd_config ForceCommand /usr/bin/rsync 錯誤“連接意外關閉”

  • July 19, 2021

應該如何配置 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 backup@hostname.domain:/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 配置為使用如下腳本,我可以成功遠端同步。我很好奇為什麼這有效而 /usr/bin/rsync 無效?

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

驗證 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 的最簡單/最佳方法。

原因很簡單……正如它所說的ForceCommand那樣:你連接,它迫使你執行那個命令,不管你真正想做什麼。在這種情況下,該命令 /usr/bin/rsync沒有標誌。

rsync通過rsync在連接的另一端執行另一個副本並通過 ssh 與其交談來工作。但在這種情況下,它無法使用它需要的標誌啟動另一端,因為命令被替換為/usr/bin/rsync

您的 rsync-validate 腳本可能是解決此問題的最佳方法。它檢查請求以確保它是有效的 rsync 伺服器命令,然後才執行它。 rsync可能可以修改為在 $SSH_ORIGINAL_COMMAND 不帶參數執行時直接檢查它,但可能有一個很好的安全理由不這樣做。

引用自:https://serverfault.com/questions/323501