sshd_config ForceCommand / usr / bin / rsync erro “conexão encerrada inesperadamente”

5

Como o ForceCommand deve ser configurado para permitir que o usuário de backup execute qualquer comando rsync? Com o ForceCommand configurado para / usr / bin / rsync, recebo o erro abaixo: conexão inesperadamente fechada ...

/ etc / ssh / sshd_config no servidor remoto que hospeda os arquivos a serem copiados de:

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

Comando rsync em execução no servidor local fazendo a cópia do servidor remoto:

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]

Se eu configurar o ForceCommand para o comando rsync exato, como o abaixo, posso rsync remotamente com êxito como o usuário de backup, mas para este projeto não quero ter que usar o comando completo como abaixo:

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

Se eu configurar o ForceCommand para usar um script como o abaixo, posso rsync remotamente com êxito. Estou curioso para saber por que isso funciona e / usr / bin / rsync não funciona?

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

O script validate-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   

Minha principal questão é por que o ForceCommand / usr / bin / rsync não funciona?

Também estou curioso sobre a melhor maneira de fazer isso. Eu não posso chroot o usuário de backup porque eu estou copiando de várias pastas diferentes. Eu realmente não quero ter que usar o comando rsync --server --client etc. completo porque eu estou copiando várias pastas diferentes e isso parece excessivo. Estou curioso sobre as maneiras mais simples / melhores de restringir o usuário de backup ao rsync.

    
por caleban 21.10.2011 / 02:01

2 respostas

2

O por que é fácil ... ForceCommand faz exatamente o que diz: Você se conecta, obriga você a executar esse comando, não importa o que você realmente queira fazer. Nesse caso, esse comando é /usr/bin/rsync sem sinalizadores.

rsync funciona executando outra cópia de rsync no outro lado da conexão e falando com ele sobre o ssh. Nesse caso, porém, não é possível iniciar o outro lado com os sinalizadores necessários, porque o comando é substituído por /usr/bin/rsync

Seu script validar rsync é provavelmente a melhor maneira de fazer isso. Ele verifica o pedido para certificar-se de que é um comando do servidor rsync válido e somente então ele é executado. rsync probably poderia ser modificado para verificar o $ SSH_ORIGINAL_COMMAND diretamente quando executado sem argumentos, mas provavelmente há uma boa razão de segurança para não fazê-lo.

    
por 21.10.2011 / 04:43
3

A opção ForceCommand deve ser usada com um comando que entenda especificamente que está agindo como um gatekeeper SSH . O comando original é colocado na variável de ambiente SSH_ORIGINAL_COMMAND .

    
por 21.10.2011 / 02:15

Tags