Questa è una guida per la creazione di una connessione sicura in SSH o SCP senza obbligatoriamente utilizzare una password da scrivere nel terminale ma al suo posto utilizzando delle chiavi criptografate. Oltre ad una maggiore sicurezza questa soluzione offre la possibilità di lanciare degli script o procedure remote tra più server in maniera del tutto sicura e senza necessariamente che l’utente debba intervenire inserendo la password manualmente o scrivendo un echo con la password in chiaro nello script.
La logica è la seguente, la connessione avviane tra due terminali, nella maniera tradizionale l’utente ha l’obbligo di autenticarsi puntando lo username e inserendo la password dopo la connessione, mentre nella maniera delle chiavi , passatemi il termine, l’utente non deve fare niente dopo l’avvenuta connessione senza rinunciare alla sicurezza. Utilizzando le chiavi saranno queste ad essere garanti dell’accesso sicuro tra i due terminali. Chiavi perché per l’appunto sono due, una Privata e un Pubblica, la prima da utilizzare sul terminale utente (es. client host) l’altra da utilizzare sul terminale remoto (es. un server).
La Private Key e la Public Key vanno immaginate come una chiave vera e propria ed un lucchetto. La chiave privata (Private Key) è la chiave vera e propria quella che voi avete nel vostro portachiavi, deve stare in un luogo sicuro e non deve essere mai smarrita, un po’ come le vostre chiavi di casa. Mentre la chiave pubblica (Public Key) deve essere immaginata come la serratura di casa o il lucchetto della nostra bici, tutti possono vedere, guardare e toccare l’esterno ma solo con grande dispendio di tempo e di energie può essere rotto il cilindro per carpire gli ingranaggi o pistoni al suo interno e successivamente, dagli ingranaggi o pistoni, ricostruire la chiave per sbloccare la serratura. Converrete con me che la cosa è parecchio lunga e complicata.
Vediamo nel dettaglio come costruire la chiave, il lucchetto e sopratutto come utilizzare questo metodo di autenticazione. Dall’esempio che segue capirete anche il perché questo metodo di autenticazione è più sicuro del tradizionale username e password.
Supponiamo di avere due terminali, il nostro computer locale (client, host da cui dobbiamo connetterci) e il nostro computer remoto (server LINUX, host sul quale dobbiamo connetterci) con IP pubblico 1.2.3.4
Nell’esempio che segue utilizzerò una via che dal mio punta di vista aiuta gli utenti poco pratici a capire il funzionamento ma ognuno può eseguire queste operazioni propedeutiche con il metodo o il protocollo preferito.
E’ importante che il l’host remoto (server) utilizzi come OS Linux
Creiamo le chiavi
Su Linux o Mac installare openssh o simile. Eseguire:
0 1 2 |
ssh-keygen -t rsa |
da questo comando saranno salvati2 file sulla vostra root del terminale.
Su Windows installare PuTTY ed eseguire il tool PuTTYgen seguire le istruzioni e salvare le due chiavi sull’host windows.
A questo punto avremo 2 chiavi una pubblica e una privata. Come detto nella premessa a questo articolo, la chiave privata va tenuta al sicuro sul nostro client mentre la pubblica va utilizzata sul server e quindi dobbiamo procedere a caricare il file della chiave pubblica sul server remoto.
Carichiamo la nostra chiave pubblica (il lucchetto) sul server
Inanzi tutto dobbiamo conneterci sul server remoto tramite connessione SSH e con il metodo tradizionale di username e password.
Linux o Mac
Da terminale testiamo la connessione ssh
0 1 2 3 4 |
$ ssh username@1.2.3.4 username@1.2.3.4's password: [Enter Your Password Here] # come vedete ci viene richiesta la password |
Se adesso facciamo un paio di operazioni preliminari controlliamo se esiste la cartella nascosta .ssh e controlliamo i permessi utilizzando il comando ls -l adesso per comodità usciamo dalla connessione ssh sul server tramite il comando exit e lavoriamo sul nostro terminale.
Se la cartella .ssh non esiste creiamola
0 1 2 |
ssh username@1.2.3.4 mkdir -p ∼/.ssh |
Carichiamo la nostra chiave pubblica precedentemente creata sul server remoto ci sono due strade
Supponiamo la nostra public key che sia stata salvata in .ssh e che sia nominata come id_rsa.pub il nostro intento è quello di caricarla sul server nella cartella .ssh all’intenro della root utente e rinominiamola come authorized_keys che come ci aiuta a capire la traduzione sono le chiavi autorizzate ad accedere al server
0 1 2 |
cat ∼/.ssh/id_rsa.pub | ssh username@1.2.3.4 'cat >> ∼/.ssh/authorized_keys' |
Oppure
0 1 2 |
ssh-copy-id username@1.2.3.4 |
Caricata la chiave sul server remoto, impostiamo permessi più sicuri sulla cartella .ssh e sul file authorized_keys
0 1 2 |
ssh username@1.2.3.4 'chmod 700 ∼/.ssh; chmod 640 ∼/.ssh/authorized_keys' |
Con Windows utilizziamo PuTTY e WinSCP tramite il primo ci connettiamo tramite SSH e con WinSCP carichiamo, rinominiamo la chiave pubblica e impostiamo i permessi. Le chiavi generate con PuTTYgen saranno salvate in percorsi e con nomi che noi abbiamo scelto, pertanto sono diversi da quelli presenti nell’esempio. La logica di funzionamento è identica ma per il momento, se non sapete come utilizzare la chiave privata con PuTTY e WinSCP, vi consiglio di leggere qualche topic sui forum ufficiali ma vi garantisco che il tutto è molto semplice.
Comunque gli step da fare sono:
- Creare le chiavi, pubblica e privata, tramite PuTTYgen
- Caricare la chiave pubblica sul server remoto all’interno della cartella .ssh dentro la root dell’utente autorizzato alla connessione. Per caricare il file potete utilizzare SCP, FTP o altri metodi e protocolli che avete a disposizione.
- Rinominare la chiave pubblica all’interno della cartella .ssh come authorized_keys
- Impostare PuTTY o WinSCP ad utilizzare la nostra chiave privata per la connessione sul server. Per questo vi consiglio di consultare i forum o le guide ufficiali dei due software.
Testiamo la connessione tramite il metodo delle chiavi
Dal nostro client
0 1 2 |
ssh username@1.2.3.4 |
E vedrete che non ci verrà richiesta alcuna password pertanto se volessimo utilizzare degli script o SCP per il trasferimento dei file possiamo connetterci senza obbligatoriamente inserire password manualmente.
Come dicevo il metodo delle chiavi è molto più sicuro dell’utilizzo di username e password. Questo perché?
- Il file che contiene la chiave privata contiene una stringa con molti più caratteri di una password tradizionale anche se complessa.
- Sia la chiave e il lucchetto devono essere compatibili tra di loro al 100%. Immaginatevi le vostre chiavi di casa e la serratura della porta di casa, vi è mai capitato che la chiave è usurata e la serratura non gira? Oppure avete inserito una chiave simile ma non era quella corretta? Converrete che in questi casi non è possibile entrare in casa.
- Inoltre sulla chiave pubblica può essere protetta da password in questo caso per accedere sul server remoto oltre ad essere in possesso della chiave privata dobbiamo conoscere la password della chiave pubblica altrimenti non sarà possibile neppure lo scambio d’informazioni tra le due chiavi, immaginate un blocco sulla serratura che impedisce persino di inserire la chiave al suo interno. E’ importante specificare che nel caso venga utilizzata una password sulla chiave pubblica l’esecuzione di script remoti automatizzati sarà più complessa, in quanto è necessario che l’utente immetta la password della chiave pubblica manualmente o che negli script venga lanciata in chiaro.
Buona connessione 😉
I commenti sono chiusi.