Quem está iniciando o meu agente ssh e por que ele não é finalizado corretamente?

9

Esse é um problema que tenho tido há muito tempo, mas toda vez que tento descobrir alguma coisa me perco, então achei melhor perguntar aqui onde talvez alguém mais experiente possa me ajudar.

fundo

Meu Raspberry Pi está executando o Raspbian Jessie, e eu uso o SSH frequentemente para fazer login e executar comandos remotamente. Durante minhas primeiras sessões de SSH, notei que um ssh-agentprocesso era gerado no RPi toda vez que eu fazia login, mas nunca matava ao exitentrar: o login e o logout várias vezes faziam com que vários ssh-agentprocessos fossem gerados apenas para ficar lá sem fazer nada. Brincando e lendo páginas de manual e respostas aqui e ali, eu entendi recentemente o propósito ssh-agente também aprendi que ele normalmente deveria ser morto ao sair, então comecei a me perguntar por que não era. Além disso, notei que a emissão source ~/.bashrcfaz com que outra instância ssh-agentseja gerada. Eu li na página de manual relativaque a variável de ambiente SSH_AGENT_PIDdeve ser definida porque o ssh-agentprograma deve ser iniciado dentro de um evalpara executar sua saída e definir essas variáveis, que são usadas por outros comandos relacionados ao SSH, incluindo ssh-agent -k(para matar o agente em relação à sessão atual), então eu correu echo $SSH_AGENT_PIDe echo $SSH_AUTH_SOCK, mas ambos estavam vazios. De repente, percebi: provavelmente o processo não é interrompido no logout porque ssh-agent -ktenta ler seu PID a partir da variável de ambiente que não está definida.

O problema

Como ssh-agentnão está sendo eliminado no logout, e isso com certeza acontece porque as variáveis ​​de ambiente necessárias não estão definidas, isso só pode significar uma coisa: quem chama o ssh-agentlogin provavelmente não o faz da maneira correta (o que seria eval "$(ssh-agent -s)") . Então pensei: bem, qual é o problema? Vou encontrar o arquivo de configuração, serviço ou script de login executado para iniciar o agente e corrigi-lo manualmente! Onde diabos poderia estar?

O que eu tentei

Desde que notei que um ssh-agenté gerado toda vez que ligo source ~/.bashrc, esse foi o primeiro arquivo que inspecionei, mas nada lá remotamente referenciou algo relacionado ao SSH. Continuei pesquisando usando via string sshdentro de todos os seguintes arquivos, mas não encontrei nada :

~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment

Existe mais algum arquivo que possa estar envolvido source ~/.bashrc? Eu realmente não sei.

Então procurei por systemdserviços relevantes , mas só encontrei ssh.service, o que é WantedBy=multi-user.targete, portanto, não é executado no logon (e bem, isso é óbvio, pois esse é o daemon do servidor SSH).

Também tentei mover todos os arquivos da minha /home/pipasta para uma pasta temporária e sair e entrar novamente, mas ssh-agentainda gerava.

Por fim, também dei o último tiro que tinha na câmara: corri find / -name 'ssh-agent'como root, que apenas imprimia /usr/bin/ssh-agent, um executável, então criei um executável falso que basicamente registrava apenas o comando pai :

#! /bin/bash
ps -o args= $PPID        > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG

Renomeei o real /usr/bin/ssh-agente o substitui pelo falso, definindo as permissões / usuário / grupo corretos, executei source ~/.bashrcnovamente e imprimi o LOGarquivo:

-bash
-bash

Nem uma pista sobre o que está acontecendo.

Mais alguns detalhes

Estou adicionando mais alguns detalhes, não sei se eles podem ser úteis ou não, mas você sabe ... é melhor prevenir do que remediar.

  • Aqui está o meu .bashrc.

  • Eu criei um novo usuário chamado dummyusing useradd -m dummy, e o login nele não inicia nenhumssh-agent (acho que isso pode significar algo). Os diff /home/pi/.bashrc /home/dummy/.bashrcprogramas basicamente nada (apenas um comentário que fiz), o mesmo para diff /home/pi/.profile /home/dummy/.profile.

  • O soquete do agente é criado sem problemas, embora SSH_AUTH_SOCKnão esteja definido:

    pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/
    total 0
    srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
    

    Não sei por que, mas o número no nome do arquivo do soquete é sempre o número imediatamente anterior ao PID do ssh-agentprocesso.

  • Snippet de htop:

     PID  USER  PRI  NI  VIRT   RES   SHR  S  Command
       1  root   20   0  5472  3900  2728  S  /sbin/init
    1329  pi     20   0  3696   224    16  S  └─ ssh-agent -s
    
  • Pacotes instalados correspondentes ssh:

    pi:~$ apt list --installed | grep ssh
    libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed]
    libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic]
    libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic]
    openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed]
    sshpass/oldstable,now 1.05-1 armhf [installed]
    
  • A pesquisa ssh-agent -susando recursivamente usando grepin /etce /libnão produz resultados.

  • Não tenho um ambiente de área de trabalho instalado, mas tenho uma /etc/X11pasta com alguns arquivos de configuração. Tentei renomear a pasta para outra coisa e reiniciar, apenas por precaução, mas o processo ainda é gerado, aparentemente, isso não tem muito a ver com isso.


Conclusão

Agora, para simplificar o máximo possível, só tenho duas perguntas:

  1. Onde e como isso é ssh-agentgerado, quem emite o comando?
  2. Por que não é chamado da maneira correta, sem definir as variáveis ​​de ambiente necessárias e, portanto, deixando o processo travado por tempo indeterminado?
Marco Bonelli
fonte
Eu me pergunto o que você tem no seu ~/.bashrcentão.
precisa saber é o seguinte
@ilkkachu bem, aqui está ...
Marco Bonelli

Respostas:

1

Conheço algumas razões possíveis:

  • se você estiver usando libpam-ssh, ele poderá iniciar automaticamente um agente SSH para você como parte de uma sessão e até carregar automaticamente suas chaves se elas não tiverem uma senha ou a senha for a mesma que sua senha de login.

  • se você estiver usando gpg-agent, ele também pode executar a tarefa opcionalmente ssh-agent. Seu desligamento é tratado de maneira diferente; portanto, haverá apenas a SSH_AUTH_SOCKvariável de ambiente, não a variávelSSH_AGENT_PID

  • se você tiver um agente SSH (por exemplo, o PuTTY's Pageant) em execução na sua estação de trabalho e estabelecer uma conexão SSH com o encaminhamento de agente ativado (e o controle remoto sshdpermitir), no host remoto você verá novamente apenas SSH_AUTH_SOCKsem o SSH_AGENT_PID... porque o soquete do agente vai para o sshdtúnel de volta ao agente SSH da estação de trabalho local.

telcoM
fonte
1
Obrigado pelas sugestões, mas infelizmente nenhuma dessas opções se aplica a mim. Eu não tenho libpam-ssh; ambos SSH_AGENT_PIDe SSH_AUTH_SOCKnão estão definidos (o soquete está presente, de qualquer maneira); Não uso gpg-agente não tenho o encaminhamento de agente ativado no PuTTY. Estou realmente perdido: \
Marco Bonelli