Chiavi crittografiche

Per collegarsi ad un computer remoto tramite SSH, è normalmente sufficiente utilizzare nome utente e password. Un metodo più pratico e sicuro per autenticarsi è quello di utilizzare una chiave crittografica asimmetrica.

L'idea alla base della crittografia asimmetrica (forzatamente un po' semplificata) è la seguente:

Consideriamo una conversazione fra due soggetti, A e B. Se A vuole inviare un messaggio $x$ a B, è sufficiente che lo cripti calcolando $y = f(x)$, e inviando $y$ a destinazione. A quel punto solo B, in possesso dell'informazione aggiuntiva, sarà in grado di decifrare il messaggio calcolando $x = g(y)$.

Un'idea simile si può utilizzare per verificare l'identità di B. Si supponga che A voglia determinare se sta davvero parlando con B. A questo scopo, A sceglie un messaggio casuale $x$, e lo cripta con la chiave pubblica di B ottenendo $f(x)$. A questo punto chiede a B: "Se sei veramente B, sai dirmi cosa contiene questo messaggio criptato, perché possiedi la chiave segreta".

Una $f(x)$ che soddisfi i requisiti è e spesso usata in crittografia è quella legata al problema del del logaritmo discreto, a base dell'algoritmo DSA, oppure la fattorizzazione di interi per RSA. Entrambi gli algoritmi possono essere utilizzati da ssh.

Generare una chiave crittografica

Vogliamo ora provare a generare una chiave crittografica per poter fare il login fra due qualsiasi computer in Aula 4, senza dover inserire la password. Possiamo utilizzare il comando ssh-keygen.

Collegarsi ad un computer a scelta in Aula 4 (o continuare a usare la connessione precedente, se ancora attiva). Digitare il comando ssh-keygen, e premere INVIO (selezionando l'opzione di default) a tutte le domande che verranno poste.

L'output ottenuto dal precedente comando sarà simile al seguente:

utente@lab10:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/utente/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/utente/.ssh/id_rsa
Your public key has been saved in /home/utente/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:4tTYkZV0ltI585eG2flQy0xyYY7n1fX72siofLvtGwU utente@lab10
The key's randomart image is:
+---[RSA 3072]----+
|         .oooo oo|
|         ooo*.+o=|
|        o  . =E+B|
|       + .   o=X+|
|      + S     .=o|
|     o .       .o|
|      .       . .|
|         .  .+ = |
|          oo++B..|
+----[SHA256]-----+
In particolare, si osservi che:

Si stampino sul terminale la chiave pubblica e privata utilizzando il comando cat, come fatto per il database known_hosts nell'esercizio precedente, ad esempio con il comando
$ cat ~/.ssh/id_rsa
e analogo per la chiave pubblica. Avere stampato la chiave pubblica sarà uno step essenziale per l'esercizio successivo!

Comunicare la propria identità ad un altro PC

Si supponga ora di essere loggati su lab10, e voler comunicare la propria identità a lab11 (i numeri sono ovviamente indicativi, si possono scegliere due macchine qualunque).

Per comunicare a lab11 la nostra chiave pubblica, necessaria per farci riconoscere, dobbiamo collegarci e inserirla in un file apposito di "chiavi autorizzate", che si chiama appunto authorized_keys. Impareremo più avanti come utilizzare un editor di testo nel terminale, quindi per il momento possiamo utilizzare un comando che faccia quest'operazione per noi.

Utilizzare il comando ssh-copy-id per copiare la propria chiave pubblica sulla macchina di destinazione scelta. Nell'esempio sopra, il comando necessario sarebbe
$ ssh-copy-id lab11
Questo comando avrà bisogno della password per collegarsi a lab11. Come al solito, si omette il nome utente perché coincide sulle due macchine. Una volta terminato il comando, si provi ad utilizzare ssh lab11 per collegarsi alla nuova macchina, e verificare che non venga chiesta la password.

Una volta collegati all'altro PC, è possibile controllare che la nostra chiave pubblica sia stata effettivamente copiata nella giusta destinazione.

Stampare la lista delle chiavi pubbliche accettate per l'autenticazione utilizzando il comando
$ cat ~/.ssh/id_rsa.pub
La chiave coincide con quella stampata prima?