Utilizzo di ssh-agent per la memorizzazione della password della chiave privata

From RVM Wiki
Jump to navigation Jump to search

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} doesn’t 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.

Riferimenti