Escolha identidade do ssh-agent pelo nome do arquivo

9

Problema: tenho cerca de 20 a 30% de identidadesssh-agent. A maioria dos servidores recusa a autenticação com Too many failed authentications , já que o SSH normalmente não permite que eu tente 20 chaves diferentes para efetuar login.

No momento, estou especificando o arquivo de identidade para cada host manualmente, usando a diretiva IdentityFile e IdentitiesOnly , para que o SSH tente apenas um arquivo de chave, que funciona.

Infelizmente, isso pára de funcionar assim que as chaves originais não estão mais disponíveis. ssh-add -l mostra os caminhos corretos para cada arquivo de chave e eles correspondem aos caminhos em .ssh/config , mas não funciona. Aparentemente, o SSH seleciona a identidade pela assinatura da chave pública e não pelo nome do arquivo, o que significa que os arquivos originais devem estar disponíveis para que o SSH possa extrair a chave pública.

Existem dois problemas com isso:

  • ele pára de funcionar assim que eu desconecto a unidade flash que segura as teclas
  • torna o encaminhamento do agente inútil, já que os arquivos-chave não estão disponíveis no host remoto

É claro que posso extrair as chaves públicas dos meus arquivos de identidade e armazená-las no meu computador e em todos os computadores remotos em que geralmente faço login. Isso não parece uma solução desejável, no entanto.

O que eu preciso é a possibilidade de selecionar uma identidade do ssh-agent pelo nome do arquivo, para que eu possa selecionar facilmente a chave certa usando .ssh/config ou passando -i /path/to/original/key , mesmo em um host remoto que eu SSH'd para dentro. Seria ainda melhor se eu pudesse "apelidar" as chaves para que eu nem precise especificar o caminho completo.

    
por leoluk 24.06.2012 / 12:06

3 respostas

8

Acho que vou ter que responder minha própria pergunta, já que parece não haver nenhuma maneira de solicitar uma identidade por nome de arquivo.

Eu escrevi um script Python rápido e sujo que cria um arquivo de chave pública em .ssh/fingerprints para cada chave que o agente possui. Em seguida, posso especificar esse arquivo, que não contém nenhuma chave secreta, usando IdentityFile e o SSH selecionará a identidade correta do agente SSH. Funciona perfeitamente bem e permite que eu use o agente para quantas chaves privadas eu desejar.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()
    
por 24.06.2012 / 15:19
3

Executar

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

na máquina remota para gerar automaticamente todos os arquivos de chave pública (supondo que as chaves públicas no seu .ssh/config sejam nomeadas privateKeyFileName.pub e não estejam envolvidos caminhos inconsistentes). Chame chown $USER .ssh/* para o seu caso sudo .

    
por 19.10.2012 / 12:18
1

Aprendendo com a solução aceita, e supondo que você queira apenas reutilizar a identidade usada para obter acesso ao servidor inicial, algo como:

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

é suficiente.

    
por 09.01.2017 / 17:28