Por que este trabalho do rsync + ssh cron está me dando erros 'Permissão negada (chave pública)'?

20

Faço backups freqüentes em uma unidade local que desejo sincronizar diariamente com um servidor remoto.

O servidor de destino está configurado apenas para acesso à chave SSH (sem senha). Como minha chave SSH principal desse servidor é protegida por senha, criei uma segunda chave SSH (não protegida por senha) + usuário para usar em backups autônomos - dessa forma, não preciso estar presente para inserir minha senha quando o cron for executado .

Estou usando cron e rsync, e todos os comandos funcionam individualmente, mas falham quando combinados.

O máximo que eu tenho enquanto a solução de problemas está em execução

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"

que retorna o erro

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]

Alguma dica sobre como solucionar isso ainda mais?


Aqui está o que eu tentei até agora e estou sem ideias:

  1. Cron está definitivamente rodando ps aux | grep cron
  2. Nada incomum em / var / log / syslog Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. SSH no Terminal para servidor remoto enquanto o usuário de backup trabalha ssh [email protected]

  4. A execução do comando no Terminal funciona perfeitamente rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
  5. A especificação manual do caminho para a chave do usuário de backups não tem efeito rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

  6. Substituir o comando que não funciona por um comando de teste simples funciona echo "Hello world" > ~/Desktop/test.txt

  7. Gritar / xingar o computador não teve efeito (mas me fez sentir melhor temporariamente).


Editar 1:

Aqui está o meu arquivo crontab e o script que ele chama.

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup

e

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

Edição 2:

Apenas para esclarecer, /var/log/auth.logo servidor de destino contém a linha Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user rootIsso é confuso, porque não estou mais executando o cron a cada minuto localmente, mas uma nova entrada ainda aparece a cada minuto nos logs do servidor. Os arquivos Crontab para todos os usuários (incluindo root) no servidor estão vazios e não fazem nada.

Além disso, o usuário 'somente backups' foi criado apenas no servidor e com direitos limitados, com uma chave SSH dedicada copiada para minha máquina desktop. Estou assumindo que este é o caminho a seguir, porque tudo funciona ao executar os comandos manualmente.

O arquivo crontab postado acima é para mim, usuário 'tom' na minha máquina desktop. Minha intenção é chamar o script que deve efetuar login no servidor como usuário 'apenas backups'. Eu apenas tentei executar o script de backup (em vez do comando dentro dele) e ele se conectou e funcionou com sucesso. Eu o executei na minha área de trabalho como usuário 'tom', o mesmo usuário que criou o trabalho cron que não funcionará. Aqui está a saída do log do servidor correspondente a esse login bem-sucedido

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Tom Brossman
fonte
Se 3. trabalha usando o arquivo-chave e 6. funciona também, então ... erra ... o que diz o arquivo de log sshd no lado receptor?
Jan
@Jan I getSep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Tom Brossman
Essa é a linha de log errada ou o usuário que está tentando se conectar via ssh é root ... Ou é da máquina que inicia os backups?
Jan
1
Tom, 2 perguntas apenas para garantir No seu primeiro comentário, a linha de log possui CRON, [...] mas deve parecer Sep 7 16:06:02 <hostname> sshd[6747].... Você tem 100% de certeza de que esta linha de log é do servidor e que é a linha correta? O crontab que você postou é o crontab apenas de backups ? Além disso, tente adicionar o arquivo de identidade manualmente:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
Jan
1
Além disso, a linha que auth.logvocê postou em Edit 2 é para o cron sendo executado no servidor e não deve ter nada a ver com suas tentativas de login. Você pode tentar tail -f /var/log/auth.logno servidor enquanto tenta executar o script através do cron? Além disso, não tenho certeza se isso funcionaria, mas você pode tentar seu primeiro envcomando rsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...para ver se ele gera mais erros?
Alaa Ali

Respostas:

15

Como tudo está funcionando bem na linha de comando, o erro Permission denied (publickey)significa que a parte SSH rsyncestá usando um arquivo de identidade diferente do nome de usuário especificado.

No comentário de Jan sobre a pergunta original, podemos especificar o arquivo de identidade no rsynccomando usando -e 'ssh -i /path/to/identity.file' ....

Usar o comando abaixo para começar com um ambiente novo no cron e especificar o caminho completo para o arquivo aparentemente resolve o problema:

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"

Ainda estou realmente interessado nessa descoberta. Provavelmente tem a ver com cron, o fato de começar com variáveis ​​de ambiente mínimas e com o ssh-agent. Vou configurar o mesmo cenário daqui a alguns dias para testá-lo e reportar de volta.

Alaa Ali
fonte
1
Você quer dizer que você correuenv -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Qazwsx
@Problemania whops, fixo.
Alaa Ali
Vejo que você tem uma resposta, mas estou curioso para saber se você está executando 'sudo crontab -e', que é o cron raiz. O que acontece se você 'crontab -e' enquanto estiver logado como usuário de "backup".
wlraider70
Eu acho que você quis dizer isso para a pessoa que fez a pergunta. Mas ele estava usando o crontab do nome de usuário, não root, e acho que ele não queria usar o crontab do usuário de backup.
Alaa Ali
quando executo um script semelhante com meu usuário, ele pega a chave ssh via X11, então eu precisava de uma cópia local if key e verifique se esse arquivo tem o proprietário e os direitos corretos, combinados aos itens acima, que funcionou bem para mim.
Sverre
1

Acabei de resolver este problema que me manteve ocupado ..

Não é possível conectar no RSYNC pelo SSH, apesar de ter estipulado a identidade para o SSH ... Nada é feito ... O Rsync diz "permissão negada" e o ssh diz "read_passphrase: não pode abrir / dev / tty: nenhum dispositivo ou endereço de esse tipo"

Mas li um post que explicava que o crontab tem seu próprio ambiente que não é o mesmo que root. Eu já sabia disso, mas não entendi o impacto que poderia ter no SSH ao usar o SSH-AGENT

Mas minhas trocas de chaves SSH são feitas com PassPhrase ... portanto, se o ambiente for diferente e meu RSYNC sobre SSH esperar uma senha que não possa ser inserida => As informações de depuração SSH também indicarão o erro:

"debug1: read_passphrase: não pode abrir / dev / tty: Não existe esse dispositivo ou endereço" => Bem, sim não TTY = nenhuma senha = não permitida

Na minha máquina, uso "Keychain" para ativar o agente SSH, para que não seja necessário inserir novamente a senha sempre que tento uma conexão remota. Keychain gera um arquivo que contém as seguintes informações

SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; exportar SSH_AUTH_SOCK; SSH_AGENT_PID = 18893; exportar SSH_AGENT_PID;

==> O comando SSH-AGENT retorna a mesma informação.

Portanto, no final, são essas informações relacionadas à sessão atual que permitem futuras autenticações da sessão atual, sem a necessidade de digitar a senha, pois já foram feitas anteriormente e memorizadas ...

==> A solução existe ... basta no script iniciado pelo crontab e "originar" o arquivo que contém essas informações ou fazê-lo na linha de comando ds crontab ...

exemplo: 14 09 * * *. /home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh [email protected]:. >> / var / log / check_connexion.log 2> & 1 ou use o comando "source /home/foo/keychain/foo.server.org-sh" no script que inicia uma conexão usando SSH.

=> Com essa fonte, não precisa mais se preocupar. As informações de SSH_AUTH_SOCK e SSH_AGENT_PID são carregadas no ambiente do Crontab e, portanto, são conhecidas, o RSYNC sobre SSH funciona sem nenhum problema.

Manteve-me ocupado, mas agora funciona :)

SoniXtrA
fonte
1

Advertência para quem usa o encaminhamento de agente SSH:

Se você observar esse comportamento ao depurar um script em um host remoto, é porque, mesmo com o -e "ssh -i /path/to/key"sinalizador, o ssh usará sua chave local (encaminhada) em vez da chave no servidor.

Exemplo concreto: eu tenho um script no servidor de desenvolvimento que extrai dados do "servidor de dados" usando rsync sobre ssh. Quando eu entro no servidor dev e o executo, tudo está bem, mas ao executar a partir do cron, recebo a permissão negada. Adicionando alguma verbosidade ao processo SSH (flag -vv), observei o seguinte:

debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
debug1: Authentication succeeded (publickey).

O que me chamou a atenção aqui é que, por puro acaso, tenho um nome de usuário diferente no host local ("nighty") do que no servidor de desenvolvimento ("juanr").

Observe como ela marca a chave no servidor de desenvolvimento como "explícita", mas ainda usa a chave encaminhada do meu laptop para efetuar login. Fazer um ssh-copy-idneste momento não resolve nada, porque simplesmente reinstala a chave encaminhada em vez da chave do desenvolvedor servidor. Se você usar o ssh-copy-id com o encaminhamento agente, você precisa especificar qual chave de instalar com a bandeira -i: ssh-copy-id -i ~/.ssh/id_rsa.pub user@host.

jrial
fonte
0

Você já tentou o velho truque de limpar os arquivos de hosts? Quero dizer:

rm ~/.ssh/known_hosts

Vale a pena tentar, pois o ssh o reconstruirá e você se livrará de coisas obsoletas. Obviamente, você também pode remover as partes pertencentes a um determinado IP / host.

Mais perguntas: Seu trabalho do cron está sendo executado sob o seu UID ou como usuário cron ou root?

runlevel0
fonte
1
Os comandos funcionam individualmente, então não vejo como a exclusão ~/.ssh/known_hostsmudaria alguma coisa? E o cron é executado como meu usuário 'tom' na área de trabalho, com a intenção de fazer login no servidor como usuário 'apenas backups' com a chave SSH correspondente (sem senha), que está no usuário tom ~/.ssh.
Tom Brossman
3
@ runlevel0 Nem o sinalizador -rnem o -fsinalizador são necessários para excluir known_hosts- é um arquivo regular (não um diretório) e não é somente leitura. rm .ssh/known-hostsseria consideravelmente mais seguro, considerando que um erro de digitação de um caractere - adicionar acidentalmente um espaço entre .e ssh/known_hostsdepois rm -rf(ou rm -r) geralmente excluiria todo o conteúdo da pasta pessoal do usuário!
Eliah Kagan 15/09/14
Oi Eliah, excelente ponto de fato !! Eu uso o sinalizador -rf como uma ação reflexa, mas você está absolutamente certo. Eu mal.
runlevel0
0

Use o rrsyncscript junto com uma chave ssh dedicada, da seguinte maneira:

Servidor remoto

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

Computador LOCAL

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub [email protected]:/home/devel/.ssh

Computador remoto

cat id_remote_backup.pub >> authorized_keys

Anexe à linha recém-adicionada o seguinte

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

Para que o resultado pareça

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

LOCAL

Coloque seu crontabscript a seguir com xpermissão:

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP [email protected]:/ /home/user/servidor 

Fonte: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/

Alessandro Cuttin
fonte
0

Para tentar depurar, adicione à parte ssh "ssh -v" dessa maneira, você pode obter o modo detalhado com algumas informações úteis.

Editar: Na página de manual:

-v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
             authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.
Pedro Luz
fonte
-1

Eu acho que você não configurou o arquivo sshd_config corretamente. Verifique isso PermitRootLogin yese PubkeyAuthentication yes para manutenção remota.

Anandu M Das
fonte
1
Ele não está tentando fazer login como root e provavelmente tem a autenticação de chave pública configurada corretamente, porque ele pode ssh e até executar o comando backup do terminal com sucesso.
Alaa Ali
1
Obrigado pelo conselho, mas eu definitivamente não o PermitRootLoginhabilitei e não tenho planos de mudar isso. A melhor prática é desabilitá-lo e ssh apenas como um usuário normal (adicione-o aos seus 'sudoers' se necessário) e nunca como root.
Tom Brossman