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 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 不帶參數執行時直接檢查它,但可能有一個很好的安全理由不這樣做。