agente e tela ssh

8

Há algum tempo, no StackOverflow, fiz essa pergunta sobre ssh-agent e crontab . Agora tenho uma pergunta semelhante sobre ssh-agent e screen em sistemas linux.

Portanto, no meu Mac, o ssh-agent é iniciado na inicialização do sistema, para que esteja sempre disponível para mim. Eu acho que seria verdade no meu linux (redhat el5 / fedora) se eu estivesse usando o X-Windows. No entanto, esta é uma máquina de servidor remoto e estou sempre efetuando login via ssh.

Eu adoraria ter as chaves ssh configuradas corretamente, para não precisar digitar minha senha várias vezes durante uma atualização ou confirmação do svn. Fico feliz em digitar minha senha uma vez por sessão e desencorajo nossa equipe a ter chaves ssh sem senha.

Por um breve momento, parecia que "eval` ssh-agent -s` "no meu .bash_profile, emparelhado com um comando para matar o ssh-agent quando eu saí, funcionaria. No entanto, fazemos uso intenso da tela para gerenciar programas interativos de longa duração e ambientes de desenvolvimento. Se você iniciar e parar o ssh-agent como acabei de descrever, ele será morto quando você sair do terminal e as sub-sessões da tela que costumavam se referir a essa instância do ssh-agent serão abandonadas.

Então ... como posso ser um usuário do console, que usa a tela, que usa uma senha com as teclas ssh, que não precisa digitar a senha constantemente?

Michael H.
fonte

Respostas:

4

Com a configuração a seguir, você não precisará de nenhum invólucro para chamar screen. Além disso, evita o uso /tmp(com os consequentes riscos de segurança).

  1. Verifique se você possui um diretório ~ / tmp:

    mkdir ~/tmp
    
  2. Adicione à .screenrcseguinte linha:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • Isso garante que screen, dentro , sshprocure o soquete sempre no mesmo local, em vez de um caminho alterado.
    • Você deve usar setenvo shell que usar, já que é uma tela e não um comando do shell.
  3. Adicione à .bash_profileseguinte linha:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • Isso será vinculado do local fixo (onde sshestá a aparência) ao local real e deve aparecer após o início ssh-agent.
    • O uso [ -n "$SSH_AUTH_SOCK" ]evitará corretamente os erros quando SSH_AUTH_SOCKnão estiver definido.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]impedirá que as sessões de tela vinculem $ HOME / tmp / ssh-agent-screen a si próprio, se as fontes de tela .bash_profile.
  4. Em vez de começar ssh-agentem .bash_profile, você pode considerar se conectar com ssh -A(para usar o encaminhamento de agente e fazer o uso da máquina remota seu agente).

Após esta configuração, você pode apenas usar o comando de tela padrão. Você só precisará recriar sessões existentes ou definir manualmente SSH_AUTH_SOCK dentro delas para o local fixo da etapa 2.

Créditos a este site para a ideia; Eu evitei usar /tmp. Essa resposta é semelhante, mas usa aliases extras.

Blaisorblade
fonte
2

Você pode iniciar o ssh-agent a partir de um initscript em vez de .bash_profile? Por exemplo, eu poderia colocar

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

na parte apropriada de /etc/conf.d/local, embora o RHEL / Fedora provavelmente use um sistema diferente. Como você apontou no seu comentário, as sessões do terminal precisarão se conectar ao agente, razão pela qual esse comando cria o arquivo .ssh_agent_envno diretório inicial do usuário. Então você pode adicionar

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

no .bash_profile.

Outra coisa que você pode fazer é colocar o seguinte em .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

que será iniciado ssh-agentapenas se ainda não estiver em execução. Então você não precisa matá-lo.

Como uma alternativa ligeiramente diferente da segunda sugestão, em vez de verificar a existência de um ssh-agentprocesso, você pode verificar a existência do arquivo ~/.ssh_agent_env,

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

Se tudo funcionar corretamente, não deve haver nenhuma diferença significativa entre as duas maneiras.

David Z
fonte
A idéia initscript é interessante - basicamente, basta iniciá-la na inicialização do sistema para todos os usuários que a desejarem? Isso poderia funcionar. Não temos muitos usuários que se importariam. Se é ou não significativamente melhor do que não ter uma frase secreta, é uma pergunta interessante, pois suspeito que isso significa que você precisaria inseri-la apenas uma vez por reinicialização da máquina. Hmm. Tanto isso quanto a segunda sugestão dependem de novas sessões de terminal poderem se conectar ao ssh-agent se ele já estiver em execução. Não tenho certeza absoluta de que é tão fácil, mas ainda não tentei. Obrigado pelas idéias!
Michael H.
@khedron: Sim, mas você teria que colocar uma linha /etc/conf.d/local(ou seu equivalente) para cada usuário que usa o agente, para iniciar um ssh-agentprocesso separado por usuário. Se, como você diz, não tiver um grande número de usuários, isso não seria muito ruim. Você levanta um bom argumento (que eu esqueci de considerar) sobre sessões de terminal anexadas ao agente; veja minha edição para a resposta.
David Z
2

Confira chaveiro . Faz todas as opções acima. Veja especialmente as opções --cleare --timeout.

Neil Mayhew
fonte
2

Uma abordagem melhor é usar o encaminhamento de agente ssh ( -Aopção). Isso permite que a pessoa que usa o ssh use as chaves do agente ssh em execução na máquina da qual eles são originários, presumivelmente na estação de trabalho em que estão realmente sentados.

Neil Mayhew
fonte
Isso também permite que um invasor que comprometa sua conta comprometa contas em outras máquinas que esse agente pode acessar. Portanto, tento manter o encaminhamento do agente ssh no mínimo.
Paul Price
2

para acompanhar o encaminhamento do agente ssh, você descobrirá que, por padrão, as credenciais encaminhadas do ssh não estarão disponíveis para a sessão da tela depois que você sair, efetuar login novamente e anexar novamente à sua sessão.

Você pode contornar isso, no entanto, fazendo com que a tela defina a variável de ambiente SSH_AUTH_SOCK como algo bem conhecido e faça com que esse local conhecido seja atualizado para o soquete de autenticação atual.

Eu uso essa função shell para entrar novamente na tela e corrigir a meia ssh auth:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

e eu tenho isso no meu .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

Espero que isto ajude.

Dan Pritts
fonte
Usar / tmp significa que qualquer outra pessoa na máquina pode atropelar qualquer um dos seus arquivos, se ele souber o caminho deles.
Blaisorblade 19/09/2013
1

Se eu entendi direito, você quer apenas uma sessão de tela, que você desanexa e reconecta algumas vezes, mas nunca mais deseja inserir novamente as senhas do ssh-agent (sua senha de chave privada).

Eu acho que a maneira mais fácil é iniciar a tela, do que iniciar o ssh-agent com um sub shell e depois permanecer nesse sub shell. Ou seja,

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running
erik
fonte
Isso é essencialmente o que eu faço. Eu uso a tela para rotular uma das "abas" internas como possuindo os poderes do ssh-agent, e uso isso para o trabalho svn, etc. é basicamente onde estou.
Michael H.