Una serie di eventi contribuisce a salvaguardare l'integrità di una comunicazione SSH tra due host.
Viene fatta una introduzione criptografica in modo tale che il client possa verificare che stia comunicando con il server corretto.
Il livello di trasporto della connessione tra il client e host remoto viene cifrato usando una cifra simmetrica.
Il client autentica se stesso al server.
il client remoto potrá ora interagire tranquillamente con l'host remoto attraverso la connessione cifrata.
Lo scopo principale del livello di trasporto è quello di facilitare una comunicazione sicura tra due host al momento dell'autenticazione e subito dopo. Il livello di trasporto, cerca di raggiungere tale scopo cifrando e decifrando i dati, e fornendo la protezione integrale di pacchetti di dati in fase di trasmissione e ricezione. Inoltre, il livello di trasporto può fornire la compressione dei dati, aumentando la velocità di trasferimento delle informazioni.
Quando un client SSH contatta un server, avviene uno scambio di informazioni in modo che i due sistemi possano creare correttamente il livello di trasporto. Durante questo scambio ecco cosa succede:
Scambio delle chiavi
Algoritmo della chiave pubblica
Algoritmo della cifratura simmetrica
Algoritmo per l'autenticazione del messaggio
Algoritmo hash
Durante lo scambio delle chiavi il server si fa riconoscere dal client tramite una chiave host. Se il client non ha mai comunicato con questo particolare server, non è; in grado di riconoscere la chiave del server e non verrà effettuata la connessione. OpenSSH aggira questo problema accettando la chiave host del server dopo che l'utente è stato notificato e verifica che venga accettata la nuova chiave dell'host. Nelle connessioni successive, la chiave host del server viene verificata con una versione salvata sul client, in modo che il client sia "sicuro" di comunicare con il server corretto. Se in futuro la chiave host non sarà più corrispondente, l'utente dovrà rimuovere la versione salvata nel client prima di effettuare una nuova connessione.
![]() | Attenzione |
|---|---|
Un malintenzionato potrebbe "mascherarsi" da utente del server SSH durante il contatto iniziale, poiché il sistema non conosce necessariamente la differenza tra il server corretto e quello "mascherato". Per evitare che questo accada, dovreste verificare l'integrità del nuovo server SSH contattando l'amministratore del server prima di collegarvi per la prima volta o dopo la modifica della chiave host. |
SSH è stato ideato per funzionare con quasi ogni tipo di algoritmo per le chiavi pubbliche o formato di codifica. Dopo lo scambio iniziale delle chiavi che genera un valore hash usato per gli scambi e un valore segreto condiviso, i due sistemi iniziano immediatamente a calcolare nuove chiavi e algoritmi per proteggere l'autenticazione e i dati futuri inviati tramite la connessione.
Dopo la trasmissione di una certa quantità di dati con l'utilizzo di una chiave e un algoritmo particolari (la quantità esatta dipende dall'implementazione di SSH), avviene un altro scambio di chiavi, che genera a sua volta una ulteriore serie di valori hash e un nuovo valore segreto condiviso. In questo modo, anche se un hacker riuscisse a determinare tali valori, dovrebbe rideterminarli dopo ogni scambio delle chiavi.
Dopo aver costruito un tunnel sicuro per inviare le informazioni da un sistema all'altro, il server indica al client i diversi metodi di autenticazione supportati, come per esempio una firma privata codificata o la digitazione di una password. Il client tenta, poi, di autenticarsi al server tramite uno dei metodi supportati.
Poiché i server SSH e i client possono essere configurati per autorizzare diversi tipi di autenticazione, questo metodo offre un ottimo controllo a entrambe le parti. Il server stabilisce i metodi di cifratura supportati e il client può scegliere l'ordine dei metodi di autenticazione da utilizzare. Grazie alla sicurezza del livello di trasporto SSH, è possibile utilizzare senza problemi perfino metodi di autenticazione apparentemente non sicuri, come l'autenticazione basata sull'host.
Dopo un'autenticazione corretta su un livello di trasporto SSH, vengono aperti dei canali mediante il multiplexing[1].Ognuno di questi canali gestisce la comunicazione per una diversa sessione di terminale di informazioni X11 inviate.
Entrambi i client e i server possono creare un nuovo canale. A ogni canale viene assegnato un numero diverso per ogni estremità della connessione. Quando il client tenta di aprire un nuovo canale, viene inviato, insieme alla richiesta, il suo numero per il canale. Questa informazione viene archiviata sul server e utilizzata per indirizzare una particolare comunicazione di servizio per il canale. In questo modo i diversi tipi di sessione non si disturbano a vicenda e i canali possono essere chiusi senza interrompere la connessione primaria SSH tra i due sistemi.
I canali supportano inoltre il controllo del flusso, che consente loro di inviare e ricevere i dati ordinatamente. In questo modo i dati non vengono inviati attraverso il canale finché il client non riceve un messaggio che lo avverte che il canale è in grado di ricevere.
Il client e il server negoziano le caratteristiche di ogni canale automaticamente, a seconda del tipo di servizio che il client richiede e del tipo di connessione di rete che l'utente usa. I diversi tipi di connessioni remote possono essere gestiti in modo flessibile senza dover modificare l'infrastruttura di base del protocollo.
| [1] | Una connessione multiplexed è costituita da diversi segnali inviati tramite un supporto condiviso. Con SSH, canali differenti vengono inviati tramite una connessione comune sicura. |