Utilizzare una chiave inoltrata specifica dall'agente SSH?


30

Diciamo che ho una chiave per Github, insieme ad altre chiavi. Ho aggiunto molte chiavi al mio agente ssh ( ssh-add -Lrestituisce molte righe) sul mio computer di casa A. Nel mio .ssh/configho impostato quale chiave usare con quale host, quindi ad es.

ssh -T -vvv git@github.com 2>&1 | grep Offering

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

Viene offerta una sola chiave, come previsto. Ma poi ForwardAgent yesho un rapporto con un host B con e ripetendo lo stesso comando

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.linode2
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.helium
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

nel senso che prova tutte le mie chiavi. Ciò è problematico poiché è possibile provare solo un numero limitato di chiavi prima che i server ritornino Too many authentication failures. Quindi ho provato a modificare .ssh/configl'host B da includere

Host github.com
  IdentityFile /Users/doxna/.ssh/id_rsa.github
  IdentitiesOnly yes

ma poi non ricevo offerte chiave, ma piuttosto

debug2: key: /Users/doxna/.ssh/id_rsa.github ((nil))

che suppongo significhi che la chiave non è stata trovata (?) E dopo tutto, la chiave si trova sul mio computer di casa A, non sull'host B, quindi la domanda è come fare riferimento ad essa nell'host B? Spero di essere riuscito a spiegare la domanda.

Risposte:


28

Hai avuto l'idea giusta. L'unica parte che ti manca è che il file a cui punta IdentityFiledeve esistere. Non è necessario contenere una chiave privata, è sufficiente disporre della sola chiave pubblica disponibile.

Sull'host B è possibile estrarre la chiave pubblica dall'agente digitando ssh-add -L | grep /Users/doxna/.ssh/id_rsa.github > ~/.ssh/id_rsa.github.pube quindi puntare a quel file da~/.ssh/config


Cordiali saluti, il nome della chiave pubblica non ha importanza. Seleziona la chiave corretta dall'agente in base al contenuto.
Akostadinov

@akostadinov True. Se si punta ssha un file di chiave pubblica a cui non è associato alcun file di chiave privata, dovrebbe semplicemente leggere la chiave pubblica dal file e fare in modo che l'agente utilizzi la chiave privata corrispondente per generare la firma.
Kasperd,

Questo salva efficacemente la tua chiave sull'host B! Vedere la risposta di seguito da @ mc0e per una soluzione che non salva la chiave sul server.
Pitt,

2
@Pitt No, non lo è. Memorizza solo la chiave pubblica . E questo non è un problema in quanto la chiave pubblica non avrebbe mai dovuto essere tenuta segreta in primo luogo. L'inoltro dell'agente consente all'host di utilizzare la chiave finché l'inoltro dell'agente è attivo, ma l'agente non invierà mai la chiave segreta da nessuna parte.
Kasperd,

@kasperd non hai bisogno di una copia effettiva della chiave privata mentre hai una connessione attiva a un agente utente con la chiave. Come root puoi accedere alle connessioni degli agenti di altri utenti che hanno effettuato l'accesso.
MC0e

5

Bella risposta di @Kasperd, ma nota anche che se l'host B è compromesso o se non ti fidi di tutti quelli con privilegi di root lì, allora stai ancora esponendo tutte le tue chiavi agli abusi per tutto il tempo che sei loggato su quell'host.

Quindi un approccio migliore potrebbe essere solo di inoltrare l'accesso alle chiavi di cui hai bisogno. Magari prova ssh-agent-filterquale è nei repository debian / Ubuntu o da github .

EDIT: Ho optato per ssh-ident, piuttosto che ssh-agent-filterper l'inoltro chiavi selettivamente, anche se non è più agevole un'esperienza come si potrebbe sperare.


1
Dal commento di @ kasperd sulla sua risposta: "non lo fa. Memorizza solo la chiave pubblica. E questo non è un problema in quanto la chiave pubblica non doveva essere tenuta segreta in primo luogo. L'inoltro dell'agente consente all'host di accedere a utilizzare la chiave finché l'inoltro dell'agente è
attivo

1
@Bdoserror Come root puoi abusare della connessione ssh-agent mentre l'utente associato è loggato. Devi solo copiare le SSH_*variabili d'ambiente e accedere ovunque tu voglia usare la chiave, nonostante non ne abbia mai una copia reale.
MC0e

Per chiarire: questa risposta è davvero sbagliata - mentre lo scenario di abuso da mc0e è reale, non ha nulla a che fare con il salvataggio della chiave pubblica - se l'host intermedio è compromesso, la connessione dell'agente può essere utilizzata per autenticarsi con la chiave privata, indipendentemente da se si salva o meno la chiave pubblica sull'host intermedio. La tua chiave privata non verrà compromessa e il salvataggio della chiave pubblica non lo renderà più semplice, poiché qualsiasi utente malintenzionato che ha una connessione con l'agente può semplicemente chiederle comunque.
Ripristina Monica il

@ marc-lehmann rileggi ciò che ho scritto. Se inoltri le chiavi, queste verranno esposte, ma puoi limitare quali chiavi vengono inoltrate.
MC0e

Seguo ciò che hai scritto - per favore, affronta la sostanza dei nostri commenti, non la persona. Il problema è che la tua risposta è semplicemente sbagliata perché presuppone, mentre scrivi, che le chiavi "vengano inoltrate" all'host remoto. Non succede nulla del genere e le chiavi stesse non sono esposte.
Ripristina Monica il
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.