Scegli identità da ssh-agent in base al nome del file


9

Problema: ho circa 20-30 ssh-agentidentità. La maggior parte dei server rifiuta l'autenticazione Too many failed authentications, poiché SSH di solito non mi consente di provare 20 chiavi diverse per accedere.

Al momento, sto specificando manualmente il file di identità per ogni host, usando IdentityFilela IdentitiesOnlydirettiva e, in modo che SSH proverà solo un file chiave, che funziona.

Sfortunatamente, questo smette di funzionare non appena le chiavi originali non sono più disponibili. ssh-add -lmi mostra i percorsi corretti per ogni file chiave e corrispondono ai percorsi in .ssh/config, ma non funziona. Apparentemente, SSH seleziona l'indentità con la firma della chiave pubblica e non con il nome del file, il che significa che i file originali devono essere disponibili in modo che SSH possa estrarre la chiave pubblica.

Ci sono due problemi con questo:

  • smette di funzionare non appena scollego il flash drive tenendo i tasti
  • rende inutile l'inoltro dell'agente poiché i file chiave non sono disponibili sull'host remoto

Certo, potrei estrarre le chiavi pubbliche dai miei file di identità e memorizzarle sul mio computer e su ogni computer remoto a cui di solito accedo. Tuttavia, questa non sembra una soluzione desiderabile.

Ciò di cui ho bisogno è la possibilità di selezionare un'identità da ssh-agent in base al nome del file, in modo che io possa facilmente selezionare la chiave giusta usando .ssh/configo passando -i /path/to/original/key, anche su un host remoto in cui ho SSH. Sarebbe ancora meglio se potessi "soprannome" le chiavi in ​​modo da non dover nemmeno specificare il percorso completo.


1
Perché hai bisogno di molte identità ssh? Se è per evitare che una chiave privata compromessa dia accesso a tutti i tuoi account, perché conservarli tutti su una singola unità flash? Non è la prima volta che sento parlare di problemi legati alla gestione di più identità ssh, ma non ho mai avuto la possibilità di chiedere perché fossero necessari.
Dmitri Chubarov,

Non ho mai detto che sono tutti su un'unità flash.
leoluk,

3
@DmitriChubarov Una possibile applicazione per più identità ssh è un authorized_keysfile che, a seconda della chiave utilizzata, esegue diversi comandi, senza mai consentire l'accesso diretto alla shell.
Tobias Kienzler,

Risposte:


8

Immagino che dovrò rispondere alla mia domanda, poiché non sembra esserci alcun modo per richiedere un'identità in base al nome del file.

Ho scritto uno script Python veloce e sporco che crea un file di chiave pubblica .ssh/fingerprintsper ogni chiave in possesso dell'agente. Posso quindi specificare questo file, che non contiene chiavi segrete, usando IdentityFilee SSH sceglierà l'identità corretta dall'agente SSH. Funziona perfettamente e mi consente di utilizzare l'agente per tutte le chiavi private che desidero.

#!/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()

Bel lavoro, ci proverò presto
Tobias Kienzler,

3

Correre

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

sul computer remoto per generare automaticamente tutti i file delle chiavi pubbliche (supponendo che le chiavi pubbliche nel proprio .ssh/confignome siano nominate privateKeyFileName.pube che non siano coinvolti percorsi incoerenti). Chiama chown $USER .ssh/*per il tuo sudocaso.


1

Raccogliendo dalla soluzione accettata e supponendo che desideri solo riutilizzare l'identità utilizzata per ottenere l'accesso al server iniziale, quindi qualcosa del tipo:

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

è sufficiente.


questo non funziona per me. Quando il file di identità ha una sola chiave pubblica, funziona, ma non quando è multiplo.
Ygrek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.