Voglio comunicare tra diversi computer sulla mia rete (Ethernet statico), tramite SSH. Per fare ciò devo eseguire ssh-add ogni volta che accedo su una macchina specifica, come posso farlo in modo che sia configurato una volta e non mi chieda la passphrase ogni volta che accedo o riavvio la mia macchina?
So che c'è un modo per aggiungere alcune righe a bash_profile
file, ma devo comunque digitare la password ogni volta che riavvio/accedo a una macchina specifica.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Risposta accettata:
Questo è un tipico esempio di compromesso tra sicurezza e convenienza. Fortunatamente ci sono un certo numero di opzioni. La soluzione più appropriata dipende dallo scenario di utilizzo e dal livello di sicurezza desiderato.
tasto ssh con passphrase, no ssh-agent
Ora è necessario inserire la passphrase ogni volta che si utilizza la chiave per l'autenticazione. Sebbene questa sia l'opzione migliore dal punto di vista della sicurezza, offre la peggiore usabilità. Ciò può anche portare alla scelta di una passphrase debole per ridurre l'onere di inserirla ripetutamente.
tasto ssh con passphrase, con ssh-agent
Aggiunta di quanto segue a ~/.bash_profile
avvierà automaticamente ssh-agent
e carica i tasti ssh all'accesso:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Ora la passphrase deve essere inserita ad ogni accesso. Anche se leggermente migliore dal punto di vista dell'usabilità, questo ha lo svantaggio che ssh-agent
richiede la passphrase indipendentemente dal fatto che la chiave debba essere utilizzata o meno durante la sessione di accesso. Ogni nuovo accesso genera anche un distinto ssh-agent
istanza che rimane in esecuzione con le chiavi aggiunte in memoria anche dopo il logout, a meno che non venga uccisa in modo esplicito.
Per uccidere ssh_agent
al logout, aggiungi quanto segue a ~/.bash_logout
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
o quanto segue a ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Creazione di più ssh-agent
le istanze possono essere evitate creando un socket di comunicazione persistente con l'agente in una posizione fissa nel file system, come nella risposta di Collin Anderson. Questo è un miglioramento rispetto alla generazione di più istanze di agenti, tuttavia, a meno che non venga eliminata in modo esplicito, la chiave decrittografata rimane ancora in memoria dopo il logout.
Sui desktop, gli ssh-agents inclusi nell'ambiente desktop, come Gnome Keyring SSH Agent, possono essere un approccio migliore poiché in genere possono essere impostati per richiedere la passphrase la prima volta che la ssh-key viene utilizzata durante una sessione di accesso e salva in memoria la chiave privata decifrata fino al termine della sessione.
tasto ssh con passphrase, con ssh-ident
ssh-ident
è un'utilità in grado di gestire ssh-agent
per tuo conto e caricare le identità secondo necessità. Aggiunge le chiavi solo una volta quando sono necessarie, indipendentemente dal numero di terminali, sessioni ssh o login che richiedono l'accesso a un ssh-agent
. Può anche aggiungere e utilizzare un agente diverso e un diverso set di chiavi a seconda dell'host a cui è connesso o della directory da cui viene richiamato ssh. Ciò consente di isolare le chiavi quando si utilizza l'inoltro dell'agente con host diversi. Consente inoltre di utilizzare più account su siti come GitHub.
Per abilitare ssh-ident
, installalo e aggiungi il seguente alias al tuo ~/bash_profile
:
alias ssh='/path/to/ssh-ident'
tasto ssh con passphrase, con keychain
keychain
è una piccola utility che gestisce ssh-agent
per tuo conto e
consente l'ssh-agent
per rimanere in esecuzione al termine della sessione di accesso. Negli accessi successivi, keychain
si collegherà all'ssh-agent
esistente esempio. In pratica, questo significa che la passphrase deve essere inserita solo durante il primo login dopo un riavvio. Negli accessi successivi, la chiave non crittografata dall'ssh-agent
esistente viene utilizzata l'istanza. Questo può essere utile anche per consentire l'autenticazione RSA/DSA senza password in cron
lavori senza chiavi ssh senza password.
Per abilitare il keychain
, installalo e aggiungi qualcosa come il seguente a ~/.bash_profile
:
eval `keychain --agents ssh --eval id_rsa`
Dal punto di vista della sicurezza, ssh-ident
e keychain
sono peggio di ssh-agent
istanze limitate alla durata di una particolare sessione, ma offrono un elevato livello di praticità. Per migliorare la sicurezza del keychain
, alcune persone aggiungono il --clear
opzione al loro ~/.bash_profile
invocazione del portachiavi. In questo modo le passphrase devono essere reinserite al login come sopra, ma cron
i lavori continueranno ad avere accesso alle chiavi non crittografate anche dopo la disconnessione dell'utente. Il keychain
la pagina wiki contiene ulteriori informazioni ed esempi.
tasto ssh senza passphrase
Dal punto di vista della sicurezza, questa è l'opzione peggiore poiché la chiave privata non è completamente protetta nel caso in cui venga esposta. Questo è, tuttavia, l'unico modo per assicurarsi che la passphrase non debba essere reinserita dopo un riavvio.
tasto ssh con passphrase, con ssh-agent
, passando la passphrase a ssh-add
da script
Anche se potrebbe sembrare un'idea semplice passare la passphrase a ssh-add
da uno script, ad es. echo "passphrase\n" | ssh-add
, non è così semplice come sembra ssh-add
non legge la passphrase da stdin
, ma apre /dev/tty
direttamente per la lettura.
Questo può essere risolto con expect
, uno strumento per automatizzare le applicazioni interattive. Di seguito è riportato un esempio di uno script che aggiunge una chiave ssh utilizzando una passphrase memorizzata nello script:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
Si noti che poiché la passphrase è memorizzata in chiaro nello script, dal punto di vista della sicurezza, questo non è certo meglio che avere una chiave ssh senza password. Se deve essere utilizzato questo approccio, è importante assicurarsi che expect
lo script contenente la passphrase ha le autorizzazioni appropriate impostate, rendendolo leggibile, scrivibile ed eseguibile solo dal proprietario della chiave.