Quem está iniciando meu ssh-agent e por que não terminará corretamente?

7

Este é um problema que eu tenho tendo há muito tempo, mas toda vez que eu tento descobrir algo me perco, então achei melhor perguntar aqui onde talvez alguém mais experiente pudesse me ajudar.

Antecedentes

Meu Raspberry Pi está executando o Raspbian Jessie, e eu uso o SSH com frequência para fazer login nele e executar comandos remotamente. Durante minhas primeiras sessões SSH notei que um processo ssh-agent foi gerado no RPi toda vez que eu entrei, mas nunca matei quando exit ing: logar e sair várias vezes causou um monte de ssh-agent processa para ser gerado apenas para ficar pendurado lá sem fazer nada. Brincando e lendo man pages e respostas aqui e ali eu recentemente entendi o propósito de ssh-agent , e eu também aprendi que normalmente deveria ser morto quando sair, então eu comecei a me perguntar por que não era. Além disso, notei que a emissão de source ~/.bashrc faz com que outra instância de ssh-agent seja gerada. Eu li na página de manual relativa que a variável de ambiente SSH_AGENT_PID deveria ser definida porque a ssh-agent programa deve ser iniciado dentro de um eval para executar sua saída e definir tais variáveis, que são então usadas por outros comandos relacionados ao SSH, incluindo ssh-agent -k (para matar o agente em relação à sessão atual), então corri echo $SSH_AGENT_PID e echo $SSH_AUTH_SOCK , mas ambos estavam vazios. De repente, percebi: provavelmente o processo não é morto no logout porque ssh-agent -k tenta ler seu PID da variável de ambiente que não está definida.

O problema

Como ssh-agent nã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 pode significar apenas uma coisa: quem chama ssh-agent no login provavelmente não faça isso da maneira apropriada (que seria eval "$(ssh-agent -s)" ) . Então eu pensei: bem, qual é o problema? Apenas localizarei qualquer arquivo de configuração, serviço ou script de login executado para iniciar o agente e corrigi-lo manualmente! Onde na terra poderia ser?

O que eu tentei

Como percebi que um ssh-agent é gerado toda vez que eu chamo source ~/.bashrc , esse foi o primeiro arquivo que eu inspecionei, mas nada lá remotamente referenciava nada relacionado ao SSH. Continuei pesquisando usando vi para a string ssh dentro de todos os arquivos a seguir, 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 pode estar envolvido em source ~/.bashrc ? Eu não sei realmente.

Em seguida, pesquisei systemd services relevante, mas encontrei apenas ssh.service , que é WantedBy=multi-user.target , e, portanto, não é executado no login (e bem, isso é óbvio, pois esse é o Daemon do servidor SSH).

Eu também tentei mover todos os arquivos da minha pasta /home/pi para uma pasta temporária e fazer logout e voltar, mas ssh-agent ainda gerou.

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

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

Eu renomei o verdadeiro /usr/bin/ssh-agent e o substitui pelo falso, definindo as permissões / usuário / grupo corretas, executei source ~/.bashrc novamente e imprimi o arquivo LOG :

-bash
-bash

Não há uma única pista sobre o que está acontecendo.

Mais alguns detalhes

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

  • Eu criei um novo usuário chamado dummy usando useradd -m dummy , e fazer login não inicia nenhum ssh-agent (acho que isso pode significar alguma coisa). O diff /home/pi/.bashrc /home/dummy/.bashrc mostra basicamente nada (apenas um comentário que fiz), mesmo para diff /home/pi/.profile /home/dummy/.profile .

  • O soquete do agente é criado sem problemas, mesmo que SSH_AUTH_SOCK nã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 imediatamente anterior ao PID do processo ssh-agent .

  • 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 a 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 de ssh-agent -s recursivamente usando grep em /etc e /lib não produz resultados.

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

Conclusão

Agora, para simplificar o processo, só tenho duas perguntas:

  1. Onde e como esse ssh-agent é gerado, quem emite o comando?
  2. Por que ele não é chamado da maneira correta, sem definir as variáveis de ambiente necessárias e, portanto, deixando o processo suspenso indefinidamente?
por Marco Bonelli 28.01.2018 / 00:05

1 resposta

1

Eu conheço algumas possíveis razões:

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

  • se você estiver usando gpg-agent , pode, opcionalmente, executar a tarefa do ssh-agent também. Seu encerramento é tratado de maneira diferente, portanto, haverá apenas a variável de ambiente SSH_AUTH_SOCK , não a SSH_AGENT_PID

  • se você tiver o SSH-agent (por exemplo, Pageant do PuTTY) em execução em sua estação de trabalho e estabelecer uma conexão SSH com o encaminhamento de agente ativado (e o controle remoto sshd permitir), no host remoto você verá novamente SSH_AUTH_SOCK sem o SSH_AGENT_PID ... porque o soquete do agente vai para sshd , que o direciona de volta ao agente SSH da sua estação de trabalho local.

por 28.01.2018 / 02:58