rsync todos os arquivos da máquina remota sobre SSH sem usuário root?

68

Eu tenho esse comando para fazer backup de uma máquina remota. O problema é que eu preciso de direitos de root para ler e copiar todos os arquivos. Não tenho usuário root habilitado por razões de segurança e uso sudoo modo Ubuntu. Eu precisaria de alguma tubulação legal ou algo para fazer isso?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
redanimalwar
fonte
3
Basta usar a rootconta em primeiro lugar. sudo, especialmente combinado com NOPASSWDo recomendado nos comentários, não melhora realmente a segurança da sua máquina.
Martin von Wittich

Respostas:

89

Eu recomendaria que você usasse a conta root em primeiro lugar. Se você configurá-lo assim:

  • Configure o seu sshd_configna máquina de destino para PermitRootLogin without-password.
  • Use ssh-keygenna máquina que executa o backup para criar uma chave privada SSH (somente se você ainda não tiver uma chave SSH). Não defina uma senha. Google um tutorial, se você precisar de detalhes para isso, deve haver uma abundância.
  • Anexe o conteúdo da /root/.ssh/id_rsa.pubmáquina de backup ao /root/.ssh/authorized_keysda sua máquina de destino.
  • Agora sua máquina de backup tem acesso root à sua máquina de destino, sem precisar usar a autenticação de senha.

a configuração resultante deve ser bastante segura.


sudo, especialmente combinado com NOPASSWDo recomendado nos comentários, não possui benefícios de segurança ao usar apenas a conta raiz. Por exemplo, esta sugestão:

adicione o seguinte ao seu /etc/sudoersarquivo:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

essencialmente dá rsyncuserpermissões de root de qualquer maneira. Você pergunta:

@MartinvonWittich Fácil de obter um shell raiz completo porque rsyncexecutado com sudo? Caminhe [m] e [por] isso por favor.

Bem, simples. Com a configuração recomendada, rsyncuseragora pode ser executado rsynccomo root sem sequer ser solicitada uma senha. rsyncé uma ferramenta muito poderosa para manipular arquivos, então agora rsyncusertem uma ferramenta muito poderosa para manipular arquivos com permissões de root. Encontrar uma maneira de explorar isso levou apenas alguns minutos (testado no Ubuntu 13.04, requer dash, bashnão funcionou):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Como você pode ver, eu criei um shell raiz; whoamiidentifica minha conta como raiz, posso criar arquivos /etce posso ler /etc/shadow. Minha exploração foi definir o bit setuid no dashbinário; faz com que o Linux sempre execute esse binário com as permissões do proprietário, neste caso raiz.

Ter uma raiz real não é [recomendado] por boas razões. - redanimalwar 15 horas atrás

Não, trabalhar desajeitadamente na conta raiz em situações em que é absolutamente apropriado usá-la não é por boas razões. Essa é apenas outra forma de programação de cultos de carga - você realmente não entende o conceito por trás do sudo x root, aplica cegamente a crença de que "a raiz é ruim, o sudo é bom" porque você leu em algum lugar.

Por um lado, há situações em que sudodefinitivamente é a ferramenta certa para o trabalho. Por exemplo, quando você está trabalhando interativamente em uma área de trabalho gráfica do Linux, digamos Ubuntu, então é necessário ter sudobom uso nos casos raros em que às vezes você precisa de acesso root. O Ubuntu intencionalmente possui uma conta root desabilitada e obriga a usar sudopor padrão para impedir que os usuários sempre usem a conta root para efetuar login. Quando o usuário apenas deseja usar, por exemplo, o navegador da Web, fazer login como root seria uma coisa perigosa. e, portanto, não ter uma conta root por padrão impede que pessoas estúpidas façam isso.

Por outro lado, há situações como a sua, em que um script automatizado requer permissões de root para algo, por exemplo, para fazer um backup. Agora, usar sudoa solução para a conta raiz não é apenas inútil, também é perigoso: à primeira vista, rsyncuserparece uma conta comum e sem privilégios. Mas, como eu já expliquei, seria muito fácil para um invasor obter acesso root completo se ele já tivesse rsyncuseracesso. Portanto, agora você tem uma conta root adicional que não se parece com uma conta root, o que não é uma coisa boa.

Martin von Wittich
fonte
2
Boa explicação. Outro motivo para o uso do sudo sobre raiz estaria na situação em que várias pessoas têm funções de administrador de sistema em um servidor? Dessa forma, cada um pode usar suas próprias chaves SSH em vez de compartilhar a chave SSH da raiz?
Nathan S. Watson-Haigh
2
@ NathanS.Watson-Haigh você poderia apenas tão fácil colocar todas as chaves SSH em /root/.ssh/authorized_keys, ou até mesmo criar várias contas de raiz com diferentes casas de modo que cada usuário pode ter sua própria concha, casa e .ssh/authorized_keys:)
Martin von Wittich
2
Você pode restringir as teclas ssh a permitir apenas determinados comandos também. Definitivamente, é uma boa ideia, pois se você estiver automatizando alguma coisa, provavelmente estará criando essas chaves ssh sem nenhuma senha, ou pelo menos para que elas estejam acessíveis o tempo todo em que uma máquina estiver funcionando. (o que significa que root em que os subsídios máquina acesso à raiz em outras máquinas.)
Peter Cordes
2
As preocupações de Martin sobre o uso do sudo root são válidas, mas parece que elas poderiam ser atenuadas especificando os parâmetros exatos do rsync no arquivo sudoers. De acordo com a página do manual sudoers (5) no Ubuntu: "Se um Cmnd tiver argumentos de linha de comando associados, os argumentos no Cmnd deverão corresponder exatamente aos dados fornecidos pelo usuário na linha de comando (ou os caracteres curinga, se houver algum) . " Se o arquivo sudoers especificar o comando rsync exato com as opções exatas (incluindo origem e destino), parece que deve ser seguro.
4
Uma consideração não trouxe mais cedo: sshdgeralmente faz não log que autorizou chave foi usada para conectar a uma conta, por isso, se você se conectar como bob, em seguida sudo, você tem uma trilha de auditoria melhor do que se você ligar para rootdiretamente com bob's chave.
Coderer
71

Utilize a --rsync-pathopção para executar o rsynccomando remoto com sudoprivilégios. Seu comando deve ser, por exemplo:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

Se sudovocê solicitar uma senha, será necessário evitar isso usando um NOPASSWDprivilégio com a conta de usuário remoto (inútil para raiz, pode fazer sentido em outros casos de uso) ou se você não quiser:

  • Verifique se a opção tty_ticketsestá desativada para o usuário que você está usando, executando, por exemplo, sudo visudo -f /etc/sudoers.d/local-rsync e digitando:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Verifique se a opção requirettyestá desativada para o usuário que você está usando - ela pode estar desativada por padrão. O método é o mesmo que acima.

  • Propague a sudosenha na máquina remota executando, por exemplo, ssh -t [email protected] sudo

M_dk
fonte
11
@scai a senha que é pedido é mais provável que a sudosenha, não a sshsenha
trema
2
@redanimalwar permite que o usuário sudo /usr/bin/rsyncsolicite uma senha; verifique man sudoerscomo fazer isso; convém criar um usuário de backup extra para isso.
umläute
5
Para permitir sudo /usr/bin/rsynca execução sem a necessidade de senha, adicione o seguinte ao seu /etc/sudoersarquivo: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncIsso permitirá ao usuário rsyncuser (como mencionado acima, seria melhor criar um usuário de backup dedicado) com o nome de usuário desejado.
M_dk
4
O @M_dk agora rsyncbasicamente sempre tem permissões de root; provavelmente é muito fácil obter um shell raiz completo nessa conta. Eu acho que é melhor usar apenas a conta raiz real em primeiro lugar.
Martin von Wittich
11
A resposta, de maneira alguma falando, echo "password" | somethingeu realmente nunca usei isso e concordo com os problemas de segurança que vêm deixando a execução sudoless do rsync (também não sugerida aqui) é ruim. O tty_ticketsque eu realmente não tenho idéia, parece necessário e um problema de segurança. Isso funcionaria com segurança, sem alterar nada, apenas executando o sodo no ssh e executando o comando, certo? Mas desde que fiz essa pergunta para fins de script, concordo totalmente que o ssh baseado em chave sem pw é o seguro e o correto a fazer. Aceitei a resposta de Martins.
precisa saber é o seguinte
17

Uma maneira simples de fazer isso é usar o ssh-askpassprograma gráfico sudo, isso evita o fato de que sudonão está conectado ao terminal e permite que você digite a senha com segurança:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

Obviamente, o ssh-askpassprograma deve ser instalado no local especificado e você deve estar executando uma sessão X na máquina em que está trabalhando. Existem algumas variações no ssh-askpassprograma que também devem funcionar (versões do Gnome / KDE). Também um sudoprograma de substituição gráfica como gksuou kdesudotambém deve funcionar.

Graeme
fonte
rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .não funciona rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Ah, o ubuntu envia gnome-ssh-askpass, mas é /usr/bin/ssh-askpass, em vez de /usr/lib/ssh/x11.... Assim que funcionou :)
Peter Cordes
11
Essa é uma das melhores soluções, pois não precisa de reconfiguração do outro lado - apenas o askpass instalado e o encaminhamento X habilitado, os quais devem ser bastante comuns.
David Gardner
11
Funciona como um encanto após a instalação ssh-askpass. Eu só tinha que procurar o significado de -chavzPe, seria ótimo explicar isso como opções longas.
krlmlr
Eu tentei isso, mas o prompt está sendo aberto na máquina remota e não está sendo encaminhado para a máquina local. O X11Forwarding está funcionando, pergunte ao esperado, que eu verifiquei executando xeyesusando o SSH.
Joyce Babu
7

Se o seu usuário já possui privilégios de sudo protegidos por uma senha, eu os manteria como estão e apenas adicionaria uma estrofe para usar o rsync sem uma senha:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
Gunnar Thielebein
fonte
5

Encontrei esse problema hoje e o resolvi sem a necessidade de modificar arquivos de configuração ou conceder permissões no nível raiz a contas de usuário. Minha configuração específica era que o usuário Ana máquina footinha que copiar todos os diretórios do usuário foopara a máquina barem um backupdiretório que o usuário Apossuía. (O usuário Atem privilégios de sudo ativados foo.)

O comando que usei está abaixo. Foi chamado pelo usuário Ano /homediretório em foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Isso executa o rsync como sudo, para que todos os diretórios do usuário foopossam ser acessados, mas diz ao rsync para usar o ssh para acessar a máquina barusando as Acredenciais do usuário . Minhas necessidades eram um pouco diferentes da pergunta acima, mas isso me permitiu obter rapidamente um backup de todos os diretórios de usuários em uma máquina específica que eu gerencio sem mexer na configuração do sistema.

Ken Anderson
fonte
2
Isto é brilhante. Eu esqueci a -iopção de ssh. Você pode usar --rsync-path="sudo /usr/bin/rsync" se tiver sudo na máquina bar. Isso então lê root@fooe escreve como root@bar, mas transfere via A@foo-> B@bar. Obrigado!
ctbrown
Não preservará o proprietário (por exemplo, root), estou certo?
Andris
3

A execução do rsync como daemon na máquina de destino permite que você faça o que deseja.

Konstantin
fonte
11
Votei positivamente nesta resposta, mas seria melhor incluir algumas explicações sobre como executar o daemon rsynch e como usá-lo com acesso root.
Mike Lippert
O rsync como daemon não corresponderia a esse caso, porque o rsync eliminará as permissões de root, mesmo quando iniciado como root, e nem todos os arquivos poderão ser transferidos.
teissler
2

Minha solução é usar, --rsync-path="sudo rsync"mas ele pede senha, solução alternativa:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .
Bulat
fonte
11
Geralmente, não é uma boa ideia colocar senhas em uma linha de comando; eles se tornam visíveis na árvore de processos, por exemplo. Às vezes, substituo a senha real neste tipo de instrução pela $( cat my_password.txt )qual é um pouco melhor, mas geralmente é preferível configurar as permissões em ambas as extremidades e / ou usar chaves SSH, de modo que as senhas não sejam necessárias na CLI
JDS