La Secure Shell (SSH) è spesso essenziale per fornire un canale crittografato su Internet e come tale viene utilizzata in molte applicazioni web. Eppure, nonostante ciò, molti sviluppatori non ne sanno molto. Questo è un problema perché con solo un paio di trucchi puoi risparmiare un sacco di tempo ed energia.
Impara questo popolare protocollo di rete crittografica e diventa molto più efficiente nell’uso con questo rapido tutorial SSH.
Cos’è SSH
SSH, o Secure Shell, è un protocollo di amministrazione remota che consente agli utenti di controllare e modificare i propri server remoti su Internet. Il servizio è stato creato come sostituto sicuro del Telnet non crittografato e utilizza tecniche crittografiche per garantire che tutte le comunicazioni da e verso il server remoto avvengano in modo crittografato. Fornisce un meccanismo per l’autenticazione di un utente remoto, il trasferimento degli input dal client all’host e l’inoltro dell’output al client.
La figura seguente mostra una tipica finestra SSH. Qualsiasi utente Linux o macOS può accedere tramite SSH al proprio server remoto direttamente dalla finestra del terminale. Gli utenti Windows possono sfruttare i client SSH come Putty . È possibile eseguire i comandi della shell nello stesso modo in cui si farebbe se si stesse operando fisicamente sul computer remoto.
Questo tutorial SSH tratterà le basi di come funziona ssh, comprese le tecnologie utilizzate dal protocollo per offrire un metodo sicuro di accesso remoto. Coprirà i diversi livelli e i tipi di crittografia utilizzati, insieme allo scopo di ciascun livello.
Come funziona SSH?
Se stai usando Linux o Mac, usare SSH è molto semplice. Se usi Windows, dovrai utilizzare un client SSH per aprire le connessioni SSH. Il client SSH più popolare per Windows è PuTTY.
Per gli utenti Mac e Linux, vai al tuo programma terminale e quindi segui la seguente procedura:
Il comando SSH è composto da 3 parti distinte:
ssh {utente}@{host}
Il comando chiave SSH indica al sistema che si desidera aprire una connessione Secure Shell crittografata. {utente} rappresenta l’account a cui vuoi accedere. Ad esempio, potresti voler accedere all’utente root , che è sostanzialmente sinonimo di amministratore di sistema con diritti completi per modificare qualsiasi cosa sul sistema. {host} si riferisce al computer a cui si desidera accedere. Può essere un indirizzo IP (es. 244.235.23.19) o un nome di dominio (es. www.miodominio.com).
Quando premi invio, ti verrà chiesto di inserire la password per l’account richiesto. Quando lo digiti, non apparirà nulla sullo schermo, ma la tua password viene, in effetti, trasmessa. Una volta che hai finito di digitare, premi di nuovo invio. Se la tua password è corretta, sarai accolto con una finestra di terminale remoto.
Comprendere le diverse tecniche di crittografia SSH
Il vantaggio significativo offerto da SSH rispetto ai suoi predecessori è l’uso della crittografia per garantire il trasferimento sicuro delle informazioni tra l’host e il client. Host si riferisce al server remoto a cui stai tentando di accedere, mentre il client è il computer che stai utilizzando per accedere all’host. Esistono tre diverse tecnologie di crittografia utilizzate da SSH:
- Crittografia simmetrica
- Crittografia asimmetrica
- Hashing.
Crittografia simmetrica
La crittografia simmetrica è una forma di crittografia in cui viene utilizzata una chiave segreta sia per la crittografia che per la decrittografia di un messaggio sia dal client che dall’host. In effetti, chiunque possieda la chiave può decifrare il messaggio che viene trasferito.
La crittografia simmetrica è spesso chiamata chiave condivisa o crittografia segreta condivisa . Di solito viene utilizzata solo una chiave o talvolta una coppia di chiavi dove una chiave può essere facilmente calcolata utilizzando l’altra chiave.
Le chiavi simmetriche vengono utilizzate per crittografare l’intera comunicazione durante una sessione SSH. Sia il client che il server derivano la chiave segreta utilizzando un metodo concordato e la chiave risultante non viene mai divulgata a terzi. Il processo di creazione di una chiave simmetrica viene eseguito da un algoritmo di scambio di chiavi . Ciò che rende questo algoritmo particolarmente sicuro è il fatto che la chiave non viene mai trasmessa tra il client e l’host. Invece, i due computer condividono dati pubblici e poi li manipolano per calcolare indipendentemente la chiave segreta. Anche se un’altra macchina acquisisce i dati condivisi pubblicamente, non sarà in grado di calcolare la chiave perché l’algoritmo di scambio della chiave non è noto.
Va notato, tuttavia, che il token segreto è specifico per ogni sessione SSH e viene generato prima dell’autenticazione del client. Una volta che la chiave è stata generata, tutti i pacchetti che si muovono tra le due macchine devono essere crittografati dalla chiave privata. Ciò include la password digitata nella console dall’utente, quindi le credenziali sono sempre protette dagli sniffer di pacchetti di rete.
Esiste una varietà di cifrari di crittografia simmetrica, inclusi, ma non limitati a, AES (Advanced Encryption Standard), CAST128, Blowfish ecc. Prima di stabilire una connessione protetta, il client e un host decidono quale cifra usare, pubblicando un elenco di cifrari supportati in ordine di preferenza. La cifratura preferita tra quelle supportate dai client che è presente nell’elenco dell’host viene utilizzata come cifratura bidirezionale.
Ad esempio, se due macchine Ubuntu 14.04 LTS comunicano tra loro su SSH, utilizzeranno aes128-ctr come cifratura predefinita.
Crittografia asimmetrica
A differenza della crittografia simmetrica, la crittografia asimmetrica utilizza due chiavi separate per la crittografia e la decrittografia. Queste due chiavi sono note come chiave pubblica e chiave privata . Insieme, entrambe queste chiavi formano una coppia di chiavi pubblica-privata .
La chiave pubblica, come suggerisce il nome, è apertamente distribuita e condivisa con tutte le parti. Sebbene sia strettamente collegata alla chiave privata in termini di funzionalità, la chiave privata non può essere calcolata matematicamente dalla chiave pubblica. La relazione tra le due chiavi è molto complessa: un messaggio crittografato con la chiave pubblica di una macchina può essere decifrato solo dalla chiave privata della stessa macchina. Questa relazione unidirezionale significa che la chiave pubblica non può decifrare i propri messaggi, né può decifrare nulla crittografato dalla chiave privata.
La chiave privata deve rimanere privata, ovvero affinché la connessione sia protetta, nessuna terza parte deve conoscerla. La forza dell’intera connessione risiede nel fatto che la chiave privata non viene mai rivelata, in quanto è l’unico componente in grado di decrittare i messaggi che sono stati crittografati utilizzando la propria chiave pubblica. Pertanto, qualsiasi parte con la capacità di decifrare i messaggi firmati pubblicamente deve possedere la chiave privata corrispondente.
A differenza della percezione generale, la crittografia asimmetrica non viene utilizzata per crittografare l’intera sessione SSH ma viene utilizzata solo durante l’algoritmo di scambio delle chiavi di crittografia simmetrica. Prima di avviare una connessione protetta, entrambe le parti generano coppie di chiavi pubbliche-private temporanee e condividono le rispettive chiavi private per produrre la chiave segreta condivisa.
Una volta stabilita una comunicazione simmetrica protetta, il server utilizza la chiave pubblica del client per generarla, verificarla e trasmetterla al client per l’autenticazione. Se il client riesce a decifrare con successo il messaggio, significa che possiede la chiave privata richiesta per la connessione. Quindi inizia la sessione SSH.
Hashing
L’hashing unidirezionale è un’altra forma di crittografia utilizzata nelle connessioni Secure Shell. Le funzioni di hash unidirezionale differiscono dalle due forme di crittografia precedenti nel senso che non sono mai destinate a essere decrittografate. Generano un valore univoco di lunghezza fissa per ogni input che non mostra un andamento chiaro che può essere sfruttato. Questo li rende praticamente impossibili da invertire.
È facile generare un hash crittografico da un dato input, ma impossibile generare l’input dall’hash. Ciò significa che se un client possiede l’input corretto, può generare l’hash crittografico e confrontarne il valore per verificare se possiede l’input corretto.
SSH utilizza gli hash per verificare l’autenticità dei messaggi. Questo viene fatto utilizzando HMAC, o Hash-based Message Authentication Codes. Ciò garantisce che il comando ricevuto non venga in alcun modo manomesso.
Mentre viene selezionato l’algoritmo di crittografia simmetrica, viene selezionato anche un algoritmo di autenticazione del messaggio adatto. Funziona in modo simile a come viene selezionato il cifrario, come spiegato nella sezione sulla crittografia simmetrica.
Ciascun messaggio trasmesso deve contenere un MAC, calcolato utilizzando la chiave simmetrica, il numero di sequenza del pacchetto e il contenuto del messaggio. Viene inviato all’esterno dei dati crittografati simmetricamente come sezione conclusiva del pacchetto di comunicazione.
Come funziona SSH con queste tecniche di crittografia?
Il modo in cui funziona SSH consiste nell’utilizzare un modello client-server per consentire l’autenticazione di due sistemi remoti e la crittografia dei dati che passano tra di loro.
SSH opera sulla porta TCP 22 per impostazione predefinita (sebbene questa possa essere modificata se necessario). L’host (server) è in ascolto sulla porta 22 (o su qualsiasi altra porta assegnata da SSH) per le connessioni in entrata. Organizza la connessione sicura autenticando il client e aprendo l’ambiente shell corretto se la verifica ha esito positivo.
Il client deve iniziare la connessione SSH avviando l’handshake TCP con il server, garantendo una connessione simmetrica protetta, verificando se l’identità visualizzata dal server corrisponde ai record precedenti (tipicamente registrati in un file di archivio chiavi RSA) e presentando le credenziali utente richieste per autenticare la connessione.
Ci sono due fasi per stabilire una connessione: in primo luogo entrambi i sistemi devono concordare gli standard di crittografia per proteggere le comunicazioni future e, in secondo luogo, l’utente deve autenticarsi. Se le credenziali corrispondono, all’utente viene concesso l’accesso.
Negoziazione della crittografia di sessione
Quando un client tenta di connettersi al server tramite TCP, il server presenta i protocolli di crittografia e le rispettive versioni che supporta. Se il client ha una coppia corrispondente di protocollo e versione, viene raggiunto un accordo e viene avviata la connessione con il protocollo accettato. Il server utilizza anche una chiave pubblica asimmetrica che il client può utilizzare per verificare l’autenticità dell’host.
Una volta stabilito questo, le due parti utilizzano il cosiddetto algoritmo di scambio di chiavi Diffie-Hellman per creare una chiave simmetrica. Questo algoritmo consente sia al client che al server di arrivare a una chiave di crittografia condivisa che verrà utilizzata d’ora in poi per crittografare l’intera sessione di comunicazione.
Ecco come funziona l’algoritmo a un livello molto semplice:
- Sia il client che il server concordano su un numero primo molto grande, che ovviamente non ha alcun fattore in comune. Questo valore del numero primo è anche noto come valore seed .
- Successivamente, le due parti concordano su un meccanismo di crittografia comune per generare un altro insieme di valori manipolando i valori di inizializzazione in un modo algoritmico specifico. Questi meccanismi, noti anche come generatori di crittografia, eseguono grandi operazioni sul seed. Un esempio di tale generatore è AES (Advanced Encryption Standard).
- Entrambe le parti generano indipendentemente un altro numero primo. Questa viene utilizzata come chiave privata segreta per l’interazione.
- Questa chiave privata appena generata, con il numero condiviso e l’algoritmo di crittografia (es. AES), viene utilizzata per calcolare una chiave pubblica che viene distribuita all’altro computer.
- Le parti utilizzano quindi la propria chiave privata personale, la chiave pubblica condivisa dell’altra macchina e il numero primo originale per creare una chiave condivisa finale. Questa chiave viene calcolata indipendentemente da entrambi i computer ma creerà la stessa chiave di crittografia su entrambi i lati.
- Ora che entrambe le parti hanno una chiave condivisa, possono crittografare simmetricamente l’intera sessione SSH. La stessa chiave può essere utilizzata per crittografare e decrittografare i messaggi (leggi: sezione sulla crittografia simmetrica).
Ora che è stata stabilita la sessione crittografata simmetricamente protetta, l’utente deve essere autenticato.
Autenticazione dell’utente
La fase finale prima che all’utente venga concesso l’accesso al server è l’autenticazione delle sue credenziali. Per questo, la maggior parte degli utenti SSH utilizza una password. All’utente viene chiesto di inserire il nome utente, seguito dalla password. Queste credenziali passano in modo sicuro attraverso il tunnel crittografato simmetricamente, quindi non c’è possibilità che vengano acquisite da terzi.
Sebbene le password siano crittografate, non è comunque consigliabile utilizzare password per connessioni sicure. Questo perché molti bot possono semplicemente effettuare brute force con password facili o predefinite e ottenere l’accesso al tuo account. L’alternativa consigliata è invece SSH Key Pairs .
Si tratta di un insieme di chiavi asimmetriche utilizzate per autenticare l’utente senza la necessità di inserire alcuna password.
Conclusione
Acquisire una comprensione approfondita del funzionamento di SSH può aiutare gli utenti a comprendere gli aspetti di sicurezza di questa tecnologia. La maggior parte delle persone considera questo processo estremamente complesso e incomprensibile, ma è molto più semplice di quanto pensi. Se ti stai chiedendo quanto tempo impiega un computer a calcolare un hash e autenticare un utente, beh, succede in meno di un secondo. In effetti, la quantità massima di tempo viene spesa nel trasferimento dei dati su Internet.
Si spera che questo tutorial SSH ti abbia aiutato a vedere il modo in cui diverse tecnologie possono essere messe insieme per creare un sistema solido in cui ogni meccanismo ha un ruolo molto importante da svolgere. Inoltre, ora sai perché Telnet è diventato un ricordo del passato non appena è apparso SSH.
Buon lavoro.