Disclaimer :
La versione originale di questo articolo è stata pubblicata da IBM
developerWorks ed è di proprietà di Westtech Information Services. Questo
documento è una versione aggiornata dell'articolo originale, e contiene
numerosi miglioramenti apportati dal Gentoo Linux Documentation team.
Questo documento non è mantenuto attivamente.
|
OpenSSH gestione delle chiavi, Parte 1
1.
Capire l'autenticazione RSA/DSA
Molti di noi stanno gia utilizzando l'ottimo OpenSSH (vedi
Risorse più avanti in questo capitolo) come
alternativa sicura, e criptata per i comandi vulnerabili di telnet e
rsh. Una delle più intriganti caratteristiche è la possibilità di
autenticare gli utenti usando i protocolli RSA e DSA, i quali sono basati
su una coppia complementare di chiavi completamente numeriche. Tra le sue
migliori caratteristiche, RSA and DSA hanno la capacità di stabilire
connessioni a sistemi remoti senza digitare la password. Per questa
caratteristica, i nuovi utenti di OpenSSH configurano spesso RSA/DSA in modo
rapido e grossolano con conseguenti login privi di password, ma aprendo grandi
e gravi falle di sicurezza nel processo.
Cos'è l'autenticazione RSA/DSA ?
SSH, per l'esattezza OpenSSH (un'implementazione free di SSH), è uno
strumento incredibile. Come telnet o rsh, il client ssh può
essere utilizzato per loggarsi ad una macchina remota. Tutto quello che è
richiesto sulla macchina remota è che sia in esecuzione sshd, il
server del processo ssh. A differenza di telnet, il protocollo
ssh è veramente sicuro. Esso utilizza uno speciale algoritmo di criptatura del
flusso di dati, aumentando e garantendo l'integrità di essi, realizzando
autenticazioni in modo sicuro.
Tuttavia anche se ssh è realmente grande, c'è un certo componente
della sue funzionalità che è spesso ignorato o pericolosamente abusato o
semplicemente mal compreso. Questo componente di OpenSSH è il sistema di
autenticazione a chiave RSA/DSA, un'alternativa al sistema standard di
autenticazione che OpenSSH utilizza di default.
I protocolli di autenticazione RSA e DSA di OpenSSH sono basati su di una
copia speciale generata di chiavi cifrate, chiamate private key
(chiave privata) e public key(chiave pubblica). Il vantaggio di
utilizzare questo sistema di autenticazione basato su chiavi è che in molti
casi è possibile stabilire connessioni sicure senza aver digitato manualmente
la password.
Mentre i protocolli basati su chiavi di autenticazione sono relativamente
sicuri, i problemi si presentano quando gli utenti prendono determinate
scorciatoie in nome di convenienza, senza aver completamente capito le loro
implicazioni sulla sicurezza. In questo articolo, daremo una buona occhiata a
come usare correttamente i protocolli di autenticazione DSA ed RSA senza
esporsi a rischi inutili di sicurezza.
Nel mio seguente articolo vi mostrerò come usare ssh-agent per
nascondere le chiavi private ed introdurre keychain, un ssh-agent
front-end che offre un certo numero di vantaggi della convenienza senza
sacrificare la sicurezza. Se tu sei interessato ad apprendere più in dettaglio
le caratteristiche di OpenSSH, continua a leggere.
Come lavorano le chiavi RSA/DSA
Ora una breve e generale spiegazione di come lavorano le chiavi RSA/DSA.
Partiamo con un ipotetico scenario dove vogliamo usare l'autenticazione RSA
per permettere ad una workstation locale con sistema linux (di nome
localbox) di aprire una shell su remotebox, una macchina del
tuo ISP. Bene adesso, noi proveremo a connetterci a remotebox
utilizzando ssh client, noi otterremmo il seguente prompt:
Codice 1.1: Connessione a remotebox |
$ ssh drobbins@remotebox
drobbins@remotebox's password:
|
Qui si vede un esempio di autenticazione di default di ssh.
Normalmente questo chiede la password dell'account drobbins su
remotebox. Se noi digitiamo la nostra password per remotebox,
ssh utilizza il suo protocollo sicuro di autenticazione della password,
trasmettendola al remotebox per la verifica.
Tuttavia diversamente da come fa telnet, qui la nostra password è
cifrata così da non essere intercettata da nessuno che stia catturando i dati
della nostra connessione. Appena remotebox autentica la password che
abbiamo fornito con il suo database, se ha successo, noi siamo abilitati al
logon, remotebox ci offre il prompt della shell.
. Mentre il metodo di autenticazione di default di ssh sembra
essere abbastanza sicuro, l'autenticazione di RSA e DSA apre nuove
possibilità.
Tuttavia, diversamente dall'autenticazione sicura della password ssh,
l'autenticazione RSA richiede qualche configurazione iniziale. Noi abbiamo
bisogno di eseguire questi passi iniziali una sola volta. Dopo di che l'
autenticazione RSA tra localbox e remotebox sarà totalmente
senza paura. Per impostare l'autenticazione RSA, noi dobbiano dapprima
generare una coppia di chiavi, una privata ed una pubblica. Queste due chiavi
hanno delle proprietà molto importanti. La chiave pubblica può essere
utilizzata per cifrare un messaggio e solo il proprietario della rispettiva
chiave privata può decifrarlo. La chiave pubblica può solo essere usata per
criptare(encryption), e la chiave privata può solo essere utilizzata
per decriptare(decryption) di un messaggio codificato dalla
corrispondente chiave pubblica. Il Protocollo di autenticazione RSA (e DSA)
utilizza questa speciale peculiarità della coppia di chiavi per realizzare
l'autenticazione sicura senza dover trasmettere nessuna informazione riservata
sulla rete.
Per far si che l'autenticazione RSA o DSA funziona, noi dobbiamo fare il
primo passo. Copiamo la nostra public key su remotebox.
La chiave pubblica è chiamata "pubblica" per una ragione. Visto che essa
è utilizzata solo per cifrare i nostri messaggi, noi non dobbiamo
preoccuparci che vada in mani sbagliate. Cosi una volta che abbiamo
copiato la nostra chiave pubblica su remotebox e la abbiamo messa
nel file speciale (~/.ssh/authorized_keys) così che il servizio
sshd su remotebox la possa trovare, noi siamo pronti a loggarci
su remotebox.
Per far ciò, scriviamo semplicemente ssh drobbins@remotebox dalla
nostra console su localbox. Però questa volta, ssh lascia al
servizio sshd su remotebox decidere se preferisce utilizzare
l'autenticazione del protocollo RSA. Cosa succede adesso è molto
interessante. Il servizio sshd di Remotebox genera un numero
casuale, e lo cifra utilizzando la nostra chiave pubblica (Quella che noi
abbiamo copiato prima). Cosi sshd spedisce questo numero casuale
cifrato al nostro ssh funzionante su localbox. Dopodiche il
nostro ssh utilizza la nostra private key per decifrare questo
numero, e lo spedisce di ritorno a remotebox, come se dicesse "Vedi, io
ho la corrispondente chiave privata; Sono stato in grado di decifrare il
tuo messaggio!" Cosi, sshd conclude che noi possiamo fare il log in, in
quando possediamo la corrisponente chiave privata. Di fatto noi dobbiamo
possedere la chiave privata per avere l'accesso a remotebox.
Due osservazioni
Ci sono due importanti osservazioni riguardo l'autenticazione RSA e DSA.
La prima è che noi dobbiamo per forza generare la coppia di chiavi. Noi
possiamo poi copiare la chiave pubblica nelle macchine remote per averne
accesso tramite la nostra sola chiave privata. In altre parole, non abbiamo
bisogno di una copia di chiavi per ogni sistema al quale vogliamo
avere accesso, me è sufficiente una sola una copia.
L'altra osservazione è che la nostra chiave privata non deve assolutamente
finire nelle mani sbagliate.
La chiave privata è l'unica cosa che ci garantisce l'accesso ai sistemi
remoti, ed ognuno che la possiede ha accesso esattamente come noi. Così come
non ci farebbe piacere che qualcunaltro avesse le nostre chiavi di casa, nello
stesso modo dobbiamo proteggere la nostra chiave privata da ogni utilizzo
inappropriato. Nel mondo dei bits and bytes, questo significa che nessuno deve
essere in grado di leggere o copiare la nostra chiave privata.
Sicuramente gli sviluppatori di ssh conoscono l'importanza della chiave
privata ed hanno creato alcune sicurezze all'interno di ssh e
ssh-keygen così che la nostra chiave privata non venga abusata. Primo,
ssh è configurato per visualizzare un avviso nel caso in cui la nostra
chiave privata abbia dei permessi che concedono a qualcuno di leggerla.
Secondo, quando creiamo la nostra copia di chiavi pubblica/privata utilizzando
ssh-keygen, ssh-keygen ci chiederà di inserire una
parola-segreta (passphrase). Se noi la inseriamo, la nostra chiave privata
viene cifrata utilizzando quest'ultima, così se qualcuno ci ruba la chiave
privata essa sarà inutilizzabile a chiunque non conosca anche la nostra parola
segreta. Armati di queste conoscenze andiamo a vedere come configurare
ssh per utilizzare il protocollo di autenticazione RSA e DSA.
ssh-keygen passo passo
Il primo passo per impostare l'autenticazione RSA è quello di generare la
copia pubblica/privata di chiavi. In origine l'autenticazione RSA fu
implementata in ssh, così RSA può funzionare con qualsiasi versione di
OpenSSH, anche se io raccomando sempre che nel sistema sia installata la
versione disponibile più recente, ad esempio, mentro sto scrivendo questo
articolo, openssh-2.9_p2. Ora generiamo una copia di chiavi come segue:
Codice 1.2: Utilizzando ssh-keygen |
$ ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/drobbins/.ssh/identity):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/drobbins/.ssh/identity.
Your public key has been saved in /home/drobbins/.ssh/identity.pub.
The key fingerprint is:
a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox
|
Quando ssh-keygen chiede dove salvare la chiave, premiamo invio per
accettare la posizione predefinita di
/home/drobbins/.ssh/identity. ssh-keygen memorizzerà la
chiave privata nel percorso sopra definito e la chiave pubblica sarà
anchessa nella stessa posizione, in un file chiamato identity.pub.
Da tenere presente anche che ssh-keygen domanda di inserire la parola
chiave. Quando richiesto noi inseriamo una buona parola chiave ( sette o
più caratteri difficili da prevedere). ssh-keygen allora cifra la
nostra chiave privata (~/.ssh/identity) utilizzando questa parola
chiave, in modo tale che nessuno possa utilizzarla senza conoscere la nostra
parola chiave.
Il piccolo compromesso
Quando specifichiamo la parola chiave, abilitiamo ssh-keygen a prevenire
degli abusi, ma questo crea un piccolo inconveniente. Ora, ogni volta che
vogliamo connetterci al nostro drobbins@remotebox account utilizzando
ssh, ssh chiederà di inserire la parola chiave, in modo tale da
poter decifrare la nostra chiave privata e da poter utilizzare per
l'autenticazione RSA. Ma attenzione noi non dobbiamo digitare la nostra
password per l'account di drobbins su remotebox, dobbiamo
digitare la parola chiave necessaria per decifrare localmente la chiave
privata. Dopo che la chiave privata è stata decifrata, il nostro client
ssh si prenderà cura del resto. Visto che il meccanismo di utilizzare
la nostra password remota è completamente differente, noi stiamo digitando
la "frase segreta" di ssh.
Codice 1.3: Loggarsi con l'utilizzo della parola chiave |
$ ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
$
|
E qui gli utenti molto spesso vengono fuorviati da un semplice compromesso.
Mote volte essi creeranno chiavi private non criptate cosicchè successivamente
occorre digitare una password. In questo modo basta digitare il comando ssh per
venire immediatamente autenticati tramite RSA (o DSA) ed effettuare la
procedura di login.
Codice 1.4: Loggarsi con l'utilizzo della parola chiave |
$ ssh drobbins@remotebox
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
$
|
Tuttavia anche non si è capito bene l'impatto sulla sicurezza è meglio
utilizzare questo piccolo inconveniente. Con una chiave privata non cifrata,
se qualcuno attaccasse il nostro sistema, egli avrebbe pieno accesso a
remotebox ed a tutti gli altri host che sono configurati con la
rispettiva chiave pubblica.
So quello che stai pensando. Autenticazioni senza password sono belle ma
hanno sempre qualche rischio. Ma c'è un modo migliore!
Stai con me e capirai come trarre vantaggi da un autenticazione priva di
password senza compromettere la sicurezza della tua chiave privata.
Mostrerò come usare ssh-agent (ciò che rende sicura
l'autenticazione senza password) nel prossimo articolo. Siamo pronti
a usare ssh-agent per impostare autenticazione RSA e DSA.
Ecco passo passo quello che si fa.
Generazione della copia di chiavi RSA
Per impostare l'autenticazione RSA dobbiamo fare alcuni piccoli passi per
generare la copia di chiavi pubblica/privata. Per fare questo scriviamo :
Codice 1.5: Generazione delle chiavi... |
$ ssh-keygen
|
Accettare la locazione di default per le chiavi quando richiesto (di norma
~/.ssh/identity e ~/.ssh/identity.pub per la chiave
pubblica), e fornire ad ssh-keygen una sicura parola chiave. Quando
ssh-keygen ha finito, otterrai una chiave pubblica ed una chiave privata
cifrata.
Installazione della chiave pubblica RSA
Il prossimo passo consiste nel configurare il sistema remoto dove sia in
esecuzione il servizio sshd ad utilizzare la nostra chiave
pubblica per l'autenticazione RSA. Normalmente lo si fa copiando
la chiave pubblica nel sistema remoto nel modo seguente :
Codice 1.6: Copiare la chiave pubblica |
$ scp ~/.ssh/identity.pub drobbins@remotebox:
|
Dato che ancora la configuarazione dell'autenticazione RSA non è completata
dobbiamo inserire la nostra password su remotebox. Fatto questo ,
aggiungiamo la chiave pubblica al seguente file ~/.ssh/authorized_keys
così:
Codice 1.7: Installazione delle chiave pubblica |
$ ssh drobbins@remotebox
drobbins@remotebox's password:
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
$ cat identity.pub >> ~/.ssh/authorized_keys
$ exit
|
Adesso con l'autenticazione RSA configurata saremo invitati a digitare la
nostra parola chiave (anzichè la nostra password) quando
proveremo a connetterci a remotebox utilizzando ssh.
Codice 1.8: Loggarsi tramite l'autenticazione a chiave pubblica |
$ ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':
|
Evvai!, l'autenticazione RSA è completata! Se non sei riuscito ad ottenere
il prompt della parola chiave ci sono alcune cose da verificare. Prima cosa
proviamo ad effettuare il login scrivendo ssh -1 drobbins@remotebox.
Questo dirà ad ssh di utilizzare la versione 1 del protocollo, che potrebbe
essere per qualche ragione l'autenticazione di default nel sistema remoto.
Se anche così non dovesse funzionare prova a verificare che tu non abbia una
linea simile a questa RSAAuthentication no nel tuo
/etc/ssh/ssh_config. Se così fosse, prova a commentarla
aggiungendo questo "#" all'inizio. Altrimenti prova a contattare l'
amminitratore di sistema di remotebox e verificare che abbia abilitato
l'autenticazione RSA nel suo sistema, ed eventualmente a verificare i
parametri di /etc/ssh/sshd_config.
Generazione della chiave DSA
Mentre le chiavi di RSA utilizzano la versione 1 del protocollo dello
ssh, le chiavi DSA sono utilizzate per il Livello 2, una versione
aggiornata del protocollo dello ssh. Una qualsiasi versione
recente di OpenSSH dovrebbe essere in grado di utilizzare sia le chiavi DSA
che RSA. Le chiavi DSA generate utilizzando ssh-keygen di OpenSSH
sono simili alle chiavi RSA nel seguente modo :
Codice 1.9: Generazione di una copia di chiavi DSA |
$ ssh-keygen -t dsa
|
Nuovamente ci viene richiesto di inserire la parola chiave. Digitarne una
corretta dal punto di vista della sicurezza. Ci verrà anche richiesto il
percorso per salvare le nostre chiavi DSA. Normalmente
~/.ssh/id_dsa e ~/.ssh/id_dsa.pub, dovrebbero andare
bene. Dopodichè la nostra generazione DSA è completata, è ora di installare
la nostra chiave pubblica sul sistema remoto.
Installazione di chiave pubblica DSA
Nuovamente l'installazione della chiave pubblica DSA è identica a quella
RSA. Nel caso della DSA, dobbiamo copiare il nostro file
~/.ssh/id_dsa.pub su remotebox, ed appenderlo al file
~/.ssh/authorized_keys2 sempre su remotebox.
Da notare che questo file ha un nome diverso da quello RSA
authorized_keys . Una volta configurato siamo in grado di fare un
login su remotebox scrivendo la nostra parola chiave per la chiave
privata di DSA anzichè la nostra normale password di remotebox.
Nota:
Al giorno d'oggi si dovrebbe utilizzare soltanto la versione 2 del protocollo
ssh, poichè la versione 1 presenta alcune debolezze.
|
La prossima volta
Bene, adesso dovresti avere le autenticazioni RSA e DSA funzionanti ma con
la necessità di dover digitare la parola chiave per ogni nuova connessione.
Nel prossimo articolo, noi vedremo come utilizzare ssh-agent, un
comodo metodo per abilitarci a stabilire connessioni senza fornire la
parola chiave, ma comunque ad avere la chiave privata cifrata sul nostro disco.
Introdurrò inoltre keychain, un front-end molto comodo di
ssh-agent che lo rende ancora più sicuro, comodo e facile da usare.
Fino ad allora tieni a portata di mano le risorse qua sotto.
2.
Risorse
|