Ogni volta che scambiamo anche un solo bit in rete tale bit può essere intercettato e “letto” da un hacker, a meno che la connessione non sia protetta da un adeguato standard di crittografia, che impedisce al malintenzionato di leggere i dati anche qualora riuscisse ad intercettarli.
Per questo, già da diversi anni, si è affermato il protocollo di comunicazione SSH, cioè Secure Shell, che applica ai dati una crittografia basata su una coppia di chiavi: una pubblica e una privata. La chiave pubblica SSH è paragonabile ad un username, mentre quella privata è paragonabile ad una password. La seconda, chiaramente, è il cuore del sistema di crittografia e va protetta dagli attacchi.
Per questo sarebbe sempre meglio conservata in locale, sul dispositivo di chi si connette e non sul server al quale ci si connette.
Anche la chiave SSH privata è crittografata, per aumentare ulteriormente la sicurezza della connessione, e per ottenere una sicurezza ancor più alta si può proteggere la chiave privata con una passphrase, cioè un insieme di parole o stringhe che messe insieme formano una password estremamente robusta, davvero difficile da violare.
Il rovescio della medaglia è che è necessario inserire la passphrase ogni volta che è necessario utilizzare una chiave privata, una cosa che diventa ben presto fastidiosa. Per questo la maggior parte dei client SSH è dotata di un cosiddetto "agente SSH", che mantiene in memoria la chiave decrittografata. Grazie ad un agente SSH non è più necessario inserire ogni volta la passphrase, perché ci penserà l'agente a farlo (almeno fino al successivo riavvio del computer).
In pratica a dialogare e a negoziare lo scambio dei dati non saranno realmente il computer client e il server, ma l'agente sul client e l'agente sul server.
Quando chiederemo dei dati ad un server tramite SSH, quindi, tutto sarà più facile e veloce: normalmente, senza Agent Forwarding, il server consulterebbe i propri file id_rsa per identificarci, chiedendoci e poi confrontando la nostra la chiave privata con quella presente nei suoi registri, ma se l'Agent Forwarding è attivo inoltrerà la richiesta di autenticazione direttamente all’agente presente sul computer locale.
A quel punto sul nostro dispositivo locale l'Agent utilizzerà la nostra passphrase per accertare la nostra identità e quindi invierà la risposta, positiva, al server (senza che sia necessario inviare a quest’ultimo anche la nostra chiave privata, aumentando così la sicurezza delle nostre comunicazioni), il che finalmente abiliterà la connessione e l'interscambio sicuro dei dati.
Questo sistema ci permette di scambiare dati con una unica autenticazione iniziale, effettuata in locale e quindi intrinsecamente meno soggetta all’intercettazione di dati sensibili, anche in caso di comunicazione tra computer locale e cloud, indipendentemente dall'area geografica di appartenenza e in modo assolutamente decentralizzato.
I comandi da usare per abilitare l'Agent Forwarding sono simili su macOS e su Linux. Con il sistema operativo di Apple è necessario lanciare il comando:
ssh-add -K ~/.ssh/id_rsa
su Linux si usa in comando:
ssh-add ~/.ssh/id_rsa
Affinché l'Agent Forwarding funzioni, va prima abilitato nel file di configurazione del client, presente sul computer locale all'indirizzo:
~/.ssh/config
All'interno del file è necessario inserire:
Host [XYZ]
ForwardAgent yes
Al posto di “XYZ” dovremo scrivere l'indirizzo IP del server o il nome del dominio al quale vogliamo connetterci. Su alcuni sistemi operativi sono presenti anche dei file specifici per la configurazione di SSH: ad esempio, su Mac si trovano nella cartella /etc/ssh/ssh_config, su Ubuntu nella cartella /etc/ssh_config.
In questi file vanno inserite le stesse informazioni per abilitare l'Agent Forwarding, stando attenti a non fare errori altrimenti le due impostazioni potrebbero entrare in conflitto e impedire l'abilitazione della funzione.
La maggior parte dei client SSH per Windows, invece, ha una interfaccia grafica di configurazione dalla quale è possibile selezionare e impostare agevolmente l'Agent Forwarding senza dover lanciare alcun comando dalla shell.