Utilizzo di ssh-agent per la memorizzazione della password della chiave privata
E' possibile memorizzare la password della propria chiave privata tramite il comando ssh-agent.
Descrizione di ssh-agent
Ssh-agent si occupa di gestire la comunicazione tra il client ssh e la chiave privata, che viene resa disponibile tramite il comando ssh-add
Ssh-agent avvia l'agente, e stampa a video i comandi necessari per settare le variabili necessarie al suo utilizzo:
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-QTtE2EQGKT/agent.1936; export SSH_AUTH_SOCK; SSH_AGENT_PID=760; export SSH_AGENT_PID; echo Agent pid 760;
Per usarlo, sarà necessario eseguire i comandi stampati, per settare le variabili, cioè:
SSH_AUTH_SOCK=/tmp/ssh-QTtE2EQGKT/agent.1936; export SSH_AUTH_SOCK; SSH_AGENT_PID=760; export SSH_AGENT_PID;
Per completezza, si potrebbe anche verificare che esista il file socket $SSH_AUTH_SOCK e che il processo ssh-agent abbia come pid $SSH_AGENT_PID:
$ ls $SSH_AUTH_SOCK
srw------- 1 mnt.vvngrl Nessuno 53 Jun 10 17:13 /tmp/ssh-QTtE2EQGKT/agent.1936
$ ps -a | grep ssh-agent
760 1 760 760 ? 1005 17:13:29 /usr/bin/ssh-agent
Utilizzo pratico di ssh-agent
Invece di lanciare i comandi e poi settare le variabili, si può quindi 'evaluare' ssh-agent , ottenendo l'effetto doppio di avviarlo e settare le variabili stesse:
eval $(ssh-agent) > /dev/null
Verificare che abbia settato le variabili:
set | grep SSH
Aggiunta della chiave privata
Una volta avviato l'agente e creato l'ambiente (variabili), si aggiunge la propria chiave privata:
ssh-add Enter passphrase for /home/mnt.vvngrl/.ssh/id_rsa: Identity added: /home/mnt.vvngrl/.ssh/id_rsa (/home/mnt.vvngrl/.ssh/id_rsa)
Per verificare che la chiave sia stata memorizzata, interrogare ssh-add:
ssh-add -l 1024 61:bd:d4:8f:19:8d:26:fe:63:d2:8e:7f:3d:f3:b7:ec /home/mnt.vvngrl/.ssh/id_rsa (RSA)
D'ora in poi, ogni volta che ci si collega con ssh, esso testerà i valori delle varibili di ambiente, e se li troverà, utilizzerà la chiave privata aggiunta con ssh-add, senza richiedere nuovamente la password.
Utilizzo dell'agente in sessioni multiple
Cosa succede se si apre un'altra sessione di login ? Semplice: le variabili per l'utilizzo dell'agente non saranno presenti, quindi ssh non interrogherà l'agente (che sarà comunque attivo in background), e chiederà quindi la password per aprire la chiave privata.
Per ovviare a questo problema, si possono usare due metodi.
Creazione di uno script per la gestione di ssh-agent
Ogni volta che si fa login, viene eseguito .bash_profile.
Inserire in questo file il seguente che script che testa se è attivo ssh-agent e setta l'ambiente necessario:
vi $HOME/.bash_logout
...
SSH_ENV=$HOME/.ssh/environment
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
echo succeeded
chmod 600 ${SSH_ENV}
. ${SSH_ENV} > /dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
#ps ${SSH_AGENT_PID} doesnt work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh- agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
...
Oppure, una versione più semplice (fatta_io):
vi $HOME/.bash_logout
...
if [ -n "$(ps | grep ssh-agent | head -n1)" ] ; then
echo ssh-agent already running
. $HOME/tmp/ssh-agent-script
else
echo Starting ssh-agent
ssh-agent >> $HOME/tmp/ssh-agent-script
. $HOME/tmp/ssh-agent-script
ssh-add
fi
Utilizzo di keychain per la gestione di ssh-agent
Qualora si desideri una gestione più complessa, e possibile usare il pacchetto keychain, uno script creato da degli sviluppatori gentoo.
Una volta installato il pacchetto (apt o cygwin), inserire in .bash_profile:
vi $HOME/.bash_logout
...
keychain --nocolor --nogui -q id_rsa
[[ -f $HOME/.keychain/$HOSTNAME-sh ]] && \
source $HOME/.keychain/$HOSTNAME-sh
...
Ad ogni login verrà verificato se esiste un agente, altrimenti ne verrà avviato uno, e verrà settato l'ambiente necessario, e verrà anche aggiunta la chiave.
L'agent forwarding
Se è stato attivato l'agent forwarding, la chiave privata memorizata sarà usata anche nelle sessioni aperte via ssh, cioè, se da locale mi collago all'host A usando la chiave, e da dentro l'host A mi collego all'host B, verrà usata la stessa chiave privata, che viene forwardata.