Mettiamoci comodi - lo scambio di chiavi

L'idea di base di questa sezione del tutorial è quella di "alleggerire" un po' la sintassi dei comandi ssh e soprattutto annullare operazioni ripetitive che alle volte possono risultare tediose da compiere, specie se ci si deve collegare diverse volte al giorno su diverse macchine.

Una delle prime cose da fare è creare sul proprio client una coppia di chiavi (se non esiste di già): una chiave pubblica ed una privata.

La chiave pubblica andrà "appesa" in un determinato modo (vedremo poi come) in un determinato file del server.

La chiave privata (adeguatamente lunga) non si tocca e non si deve dare a nessuno. Sarà infatti proprio questa che ci permetterà di decriptare.

Per capire meglio il significato di tutto ciò, riporto un esempio tratto da wikipedia:

"L'idea base della crittografia con coppia di chiavi diviene più chiara se si usa un'analogia postale, in cui il mittente è Alice ed il destinatario Bob e i lucchetti fanno le veci delle chiavi pubbliche e le chiavi recitano la parte delle chiavi private:
  • Alice chiede a Bob di spedirle il suo lucchetto, già aperto. La chiave dello stesso verrà però gelosamente conservata da Bob.
  • Alice riceve il lucchetto e, con esso, chiude il pacco e lo spedisce a Bob.
  • Bob riceve il pacco e può aprirlo con la chiave di cui è l'unico proprietario.
Se adesso Bob volesse mandare un altro pacco ad Alice, dovrebbe farlo chiudendolo con il lucchetto di Alice, che lei dovrebbe mandare a Bob e che solo lei potrebbe aprire."

Lo scopo di tutto ciò è abbastanza semplice. Oltre alla sicurezza di un procedere simile, vi è anche un risvolto pratico: invece di doversi ricordare le password collegate a 20 server, si "passerà" la propria chiave pubblica ad ogni server (che servirà a criptare i dati dal server) mentre si decripteranno i dati dai vari server semplicemente dopo aver immesso la propria chiave privata.

Quindi, per ogni server al quale mi collegherò, avrò da ricordare sempre e solo la mia chiave privata per accedere.

Vediamo adesso un po' più nei dettagli come procedere:

Generazione della coppia di chiavi:

ssh-keygen -t rsa

dalla macchina arriverà una risposta del tipo

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ikee/.ssh/id_rsa):

Per accettare il percorso indicato dal programma semplicemente premere enter.
Comparirà poi una richiesta di password ed una seconda richiesta di riconferma password (mi raccomando bella lunga, questa sarà la password della vostra chiave privata, quella che vi servirà per poter decriptare il tutto)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/ikee/.ssh/id_rsa.
Your public key has been saved in /Users/ikee/.ssh/id_rsa.pub.
The key fingerprint is:
......ecc.......

che altro non mi dice che keygen mi ha creato due chiavi:
id_rsa è la chiave privata e non si tocca
id_rsa.pub è la chiave pubblica, che andrà "appesa" in ~/.ssh/authorized_keys su ogni server al quale ci vorremo collegare.
La procedura in quest'ultimo caso sarà la seguente:

cat ~/.ssh/id_rsa.pub | ssh -p porta user@host.o.ip.remoto "cat >> ~/.ssh/authorized_keys"

comando che, per dirla in pillole, altro non fa che tradurmi, appendendo, verso il file authorized_keys l'output del contenuto di id_rsa.pub. Mi raccomando!! >> è mooooolto diverso da > !! infatti > riporta lo standard output del comando cat in authorized_keys eliminando tutto il contenuto precedente (sovrascrivendo)

Una volta effettuato quello che in gergo prende il nome di scambio di chiavi, l'unica password che dovremo digitare per ogni host al quale ci collegheremo sarà solo la nostra password della chiave privata. Messa così non convince molto, in quanto all'apparenza non abbiamo snellito di molto il lavoro che facevamo in precedenza. L'unica differenza tangibile è che ad host diversi corrisponde un'unica password. Tutto il resto resta invariato: ad ogni accesso ci si deve autenticare comunque, si deve comunque digitare tutto quell'ambarabam sintattico dell'ssh del tipo "ssh -p numeroporta -l user host.o.ip.remoto" dovendosi, volta per volta ricordare l'ip o nome host remoto, quale user viene solitamente abbinato all'accesso a quel host e quale porta usa il server ssh remoto. Tradotto ancora più in spicci, se avete 30 server ai quali dovete collegarvi, siete costretti a ricordarvi una novantina di parametri...scusate se è poco


Mettiamoci comodi - la configurazione del file ~/.ssh/config

Adesso vediamo di ridurre almeno di 2/3 la mole di lavoro.
Dal titolo si può facilmente evincere che il trucco consta proprio nel "modificare opportunamente" il file ~/.ssh/config che altro non è che il file di configurazione "per user" del client ssh.

Dal nostro oramai inseparabile terminale scriviamo
nano ~/.ssh/config
o più in generale
editor ~/.ssh/config
dove "editor" altro non è che il vostro porgramma editor di testo preferito: nano, vi, kate, ecc..
A me piace nano, quindi l'esempio lo completo con questo editor di testo ;)

comparirà una finestra simile a questa:


GNU nano 2.0.7 File: /home/ikee/.ssh/config



[ Nuovo file ]
^G Guida ^O Salva ^R Inserisci ^Y Pag Prec. ^K Taglia ^C Posizione
^X Esci ^J Giustifica ^W Cerca ^V Pag Succ. ^U Incolla ^T Ortografia

Da notare che se il file config non esiste, salvando con ctrl+x lo si crea. Per contro, se il file esiste di già, significa che ci avete già smanettato ;) e quindi vi ritroverete il contenuto dei precedenti lavori :D

A questo punto vediamo con cosa infarcire il nostro file config:

GNU nano 2.0.2 File: /home/ikee/.ssh/config

#Connessione a tizio - commento generico relativo alla connessione. Vitale con tanti host
Host tizio
Hostname tizioecaio.com
User tizio1
Port 2222

#Connessione al server di Pincopallo - inizio di un secondo esempio
Host pinco
Hostname pincopallo.net
[ Lette 47 righe ]
^G Guida ^O Salva ^R Inserisci ^Y Pag Prec. ^K Taglia ^C Posizione
^X Esci ^J Giustifica ^W Cerca ^V Pag Succ. ^U Incolla ^T Ortografia

per uscire e salvare ctrl+x, ctrl+y (per confermare), enter (per ritornare al prompt)

Bene, a questo punto della nostra vita...vediammo come abbiamo ridotto il nostro (oramai ripetitivo) lavoro:

la vecchia sintassi
ssh -p 2222 -l tizio1 tizioecaio.com

si trasforma nella nuova sintassi
ssh tizio

Potrebbe sembrare poco, in realtà è un lavoro ridotto di due terzi.
L'utilità di un'impostazione simile la si comprende quando si deve effettuare un tunneling ssh di qualche servizio. Sempre in riferimento all'esempio precedente, supponendo che il servizio in questione sia il vnc sulla porta 5900, la sintassi si trasforma da

ssh -p 2222 -L 5910:localhost:5900 -f -N tizio1@tizioecaio.com
a
ssh -L 5910:localhost:5900 -f -N tizio

Ah, dimenticavo: le impostazioni indicate sopra, ovviamente, valgono anche per i comandi scp ed sftp e relative sintassi :D

A questo punto resta ancora da togliere un sassolino dalla scarpa:"è mai possibile che ogni volta per fare le stesse cose ci si debba autenticare?? Non esiste un modo per automatizzare il tutto??". Ebbene la risposta è "ovviamente si, con ssh-agent"


Mettiamoci comodi - ssh-agent

dalla man page di ssh-agent

"DESCRIPTION
ssh-agent is a program to hold private keys used for public key authenti-
cation (RSA, DSA). The idea is that ssh-agent is started in the begin-
ning of an X-session or a login session, and all other windows or pro-
grams are started as clients to the ssh-agent program. Through use of
environment variables the agent can be located and automatically used for
authentication when logging in to other machines using ssh."

Volendolo definire in maniera molto semplice, lo si potrebbe indicare come un "portachiavi" contenente la nostra chiave privata. Altrimenti detto è un demone (processo che gira in background) che mantiene in memoria la chiave privata fino al momento del logout.
I modi per far girare o richiamare ssh-agent variano da sistema a sistema. Ovviamente io mi soffermerò unicamente su macchine con OSX in particolare fino al 10.4 (da quello che ho capito, con Leopard, le cosa cambiano e pure molto) in quanto non ho macchine più recenti.
Come quasi tutte le cose, in OSX ci sono anche le interfacce grafiche.
Una di queste, che è pure molto comoda, è proprio SSH-Agent.app scaricabile da http://www.phil.uu.nl/~xges/ssh/
Basta mettere l'applicativo tra i programmi di avvio. Infatti SSH-Agent.app altro non fa che attivare il demone ssh-agent. Per fare poi in modo che ssh-agent ricordi la nostra chiave privata fino al prossimo logout, non dobbiamo fare altro che:
1) lanciare il terminale e scrivere
ssh-add
seguirà subito la richiesta di inserire la propria chiave privata

1.bis) Alternativamente, se non si vuole mettere Ssh-agent.app fra gli applicativi di avvio, lo si lancia all'occorrenza da /Applicazioni

screenshot_02

e poi, una volta clickato ed attivo il demone ssh-agent, basta mettere la spunta su
default ed active, come indicato in figura

screenshot_03

da cui, la richiesta della propria chiave privata:

screenshot_05

fatto?

bene, a questo punto, per collegarsi a qualsiasi server, basterà scrivere

ssh alias

dove alias è l'alias del nome host che abbiamo dato in precedenza quando abbiamo modificato il file ~/.ssh/config