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:
- Si seleziona un problema che è molto facile formulare, ma difficile da risolvere; in termini matematici, si può pensare di avere una funzione bigettiva $f(x)$ che è semplice da valutare, ma molto difficile da invertire, a meno di non possedere delle informazioni aggiuntive.
- La funzione $f(x)$ diventa la chiave pubblica, ovvero tutto quello che è necessario per criptare un messaggio; l'informazione aggiuntiva che rende facile invertire $f(x)$ è detta chiave privata, ed è quello che serve per decriptare un messaggio. Possiamo pensare la chiave priva come la funzione $g(y)$ tale che $g \circ f = id$, ovvero $g = f^{-1}$.
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
.
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:
- Senza informazioni aggiuntive,
ssh
ha deciso di utilizzare l'algoritmo RSA. Si sarebbe potuto selezionare l'algoritmo DSA usando il comandossh-keygen -t dsa
. - La chiave privata è stata salvata in
~/.ssh/id_rsa
. - La chiave pubblica è stata salvata in
~/.ssh/id_rsa.pub
.
cat
, come fatto per il database known_hosts
nell'esercizio
precedente, ad esempio con il comando
$ cat ~/.ssh/id_rsae 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.
ssh-copy-id
per copiare la propria chiave pubblica
sulla macchina di destinazione scelta. Nell'esempio sopra, il comando necessario sarebbe
$ ssh-copy-id lab11Questo 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.
$ cat ~/.ssh/id_rsa.pubLa chiave coincide con quella stampata prima?