Permissão ssh negada apenas no trabalho cron

13

Tendo um problema muito estranho. Eu criei um pequeno script bash que executa um comando em um host remoto via ssh (usando autenticação de chave pública).

Quando executo esse script manualmente a partir da linha de comando, ele funciona bem, mas quando colocado em /etc/cron.hourly, falha com Permission denied, please try again.erro.

  • Eu defini explicitamente a chave no script usando ssh -i /root/.ssh/id_rsa user@remote "command";
  • o script está sendo executado como root (adicionei um echo `id` > /tmp/whoami.logpara verificar novamente); e
  • a chave ssh não é protegida por senha ...

O sistema é o servidor Ubuntu 12.04, não tenho muito acesso no lado remoto para solucionar problemas, mas como eu disse, executar o ssh manualmente ou o mesmo script bash na linha de comando funciona.

Alguma idéia de por que isso está acontecendo ou como corrigi-lo?

atualizar

Acontece que eu estava enganado, e a chave ssh estava protegida por senha (com as chaves carregando o ssh-agent), por isso, falhou em um script, mas não ao executar a partir da sessão do bash. A adição . ~/.keychain/$HOSTNAME-shao meu script resolveu o problema (graças a @grawity, que me indicou a direção certa e forneceu uma resposta abrangente).

Yoav Aner
fonte
Tem certeza de que a execução manual usa essa chave específica? Teste novamente após desarmar SSH_AUTH_SOCKe KRB5CCNAMEvariáveis ​​de ambiente.
user1686
Obrigado pela sugestão. Não tenho certeza se eu te entendo completamente. Tenho certeza de que está usando essa chave específica, porque consigo conectar / executar um comando no host remoto ao executar manualmente. O que exatamente devo testar novamente depois de desmarcar essas variáveis?
Yoav Aner
Além disso - não estou usando o ssh-agent, por isso não tenho certeza de como SSH_AUTH_SOCKestá relacionado (embora tenha prazer em tentar qualquer coisa). Estou acessando o arquivo de chave diretamente e o arquivo de chave não está protegido por senha. Quanto a KRB5CCNAMEuma pesquisa rápida mostrou que isso tem algo a ver com o Kerberos. Mais uma vez - não vê a ligação a este problema, mas talvez eu estou faltando alguma coisa aqui ...
Yoav Aner
Teste seu script, é claro. Você não pode ter "certeza de que está usando essa chave específica" até fazer isso, porque os trabalhos cron são executados em um ambiente diferente dos comandos interativos. Seria ainda melhor se você adicionou uma -vopção para que ssho comando ...
user1686
Mas eu faço isso. Eu uso explicitamente a chave usando o ssh -icomando nos dois casos ... Vou tentar desmarcar essas variáveis ​​no script e ver. Boa sugestão para adicionar -v- eu vou adicioná-lo também.
Yoav Aner

Respostas:

11

Comandos interativos e tarefas cron executadas em ambientes diferentes - em particular, uma sessão interativa pode ter um agente SSH em execução ou um Kerberos TGT armazenado. Devido à maneira como os sshmétodos de autenticação são solicitados, você não pode ter certeza de que sua chave é usada apenas porque você adicionou a -iopção.

  • Se um agente SSH estiver em execução, o sshcliente sempre tenta as chaves do agente antes de usar qualquer chave especificada explicitamente.

  • Se a rede usa Kerberos e um Kerberos TGT estiver presente, o OpenSSH o usará antes de tentar a autenticação de chave pública.

Não sei nada sobre o seu ambiente, mas é fácil verificar essas duas possibilidades:

  1. Adicione unset SSH_AUTH_SOCKe unset KRB5CCNAMEantes do sshcomando e, em seguida , execute manualmente o script modificado.

    Isso impedirá que o script veja o agente ou os tíquetes Kerberos e usará apenas a chave especificada explicitamente.

  2. Adicione a -vopção a ssh. Isso exibirá mais detalhes sobre como a autenticação acontece.

Você também pode adicionar -oIdentitiesOnly=yesao sshcomando; isso forçará o uso da chave especificada .


E se você adicionar dicas sobre como acessar o agente a partir do cron - melhor ainda

Geralmente, isso não é recomendado, pois o agente geralmente está intimamente ligado à sua sessão de logon interativo. Em particular, ele é iniciado apenas quando você faz login e mata quando você faz logoff - e ele precisa de sua senha para desbloquear as chaves SSH (supondo que elas estejam protegidas por senha).

Você mencionou "Keychain" - este é o programa OS X ou o script Linux? (Não sei muito sobre a arquitetura do Mac OS X, mas o AFAIK torna muito mais difícil acessar o agente ssh do usuário a partir de um cronjob ...)

user1686
fonte
1
Você pode usar o ssh-cron para configurar conexões SSH agendadas para proteger servidores sem expor suas chaves SSH, mas usando o agente SSH. superuser.com/questions/463540/…
Luchostein
5

Outra solução alternativa para esse problema é definir cron como ssh na caixa local para, por sua vez, executar o comando ssh em vez de executar o arquivo ou comando por seu caminho absoluto local. Isso armazena em cache o KRB5CCNAME e funciona onde / path / command não.

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh
mmond
fonte
1

Você pode usar o ssh-cron para configurar conexões SSH agendadas para proteger servidores sem expor suas chaves SSH, mas usando o agente SSH.

Luchostein
fonte
As dependências não estão disponíveis no Homebrew, portanto, a instalação parece ser complicada. Chave sem senha, eu acho ...: - /
Charlie Gorichanaz
-1

você pode executar seu script ou comando no crontab como:

0 * * * * bash -c -l "/home/user/sshscript.sh"

ou

0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"

Pawan
fonte
1
O OP já está tentando executar o script via cron; portanto, isso realmente não parece fornecer uma resposta.
bertieb