Introduzione
SSH, o shell sicura, è un protocollo sicuro e il modo più comune per amministrare in modo sicuro server remoti. Utilizzando diverse tecnologie di crittografia, SSH fornisce un meccanismo per stabilire una connessione criptograficamente sicura tra due parti, autenticando ciascuna parte con l’altra e passando comandi e output avanti e indietro.
In questa guida, esamineremo le tecniche di crittografia sottostanti che SSH impiega e i metodi che usa per stabilire connessioni sicure. Queste informazioni possono essere utili per comprendere i vari strati di crittografia e i diversi passaggi necessari per formare una connessione e autenticare entrambe le parti.
Comprensione della Crittografia Simmetrica, della Crittografia Asimmetrica e degli Hash
Per garantire la trasmissione sicura delle informazioni, SSH impiega diversi tipi di tecniche di manipolazione dei dati in vari punti della transazione. Queste includono forme di crittografia simmetrica, crittografia asimmetrica e hash.
Crittografia simmetrica
Il rapporto tra i componenti che cifrano e decifrano i dati determina se uno schema di crittografia è simmetrico o asimmetrico.
La crittografia simmetrica è un tipo di crittografia in cui una chiave può essere utilizzata per cifrare messaggi per la parte opposta e anche per decifrare i messaggi ricevuti dall’altro partecipante. Ciò significa che chiunque possieda la chiave può cifrare e decifrare messaggi per chiunque altro che tenga la chiave.
Questo tipo di schema di crittografia è spesso chiamato crittografia “condivisa”, o crittografia “a chiave segreta”. Di solito c’è una sola chiave che viene utilizzata per tutte le operazioni o una coppia di chiavi dove la relazione è scopribile ed è banale derivare la chiave opposta.
Le chiavi simmetriche vengono utilizzate da SSH per crittografare l’intera connessione. Contrariamente a quanto alcuni utenti presumono, le coppie di chiavi asimmetriche pubbliche/private che possono essere create vengono utilizzate solo per l’autenticazione, non per crittografare la connessione. La crittografia simmetrica consente anche che l’autenticazione tramite password sia protetta contro lo spionaggio.
Il client e il server contribuiscono entrambi a stabilire questa chiave, e il segreto risultante non è mai noto a terze parti. La chiave segreta viene creata attraverso un processo noto come un algoritmo di scambio chiave. Questo scambio porta il server e il client a giungere indipendentemente alla stessa chiave condividendo determinati pezzi di dati pubblici e manipolandoli con determinati dati segreti. Questo processo è spiegato più dettagliatamente in seguito.
La chiave di crittografia simmetrica creata da questa procedura è basata sulla sessione e costituisce la crittografia effettiva per i dati inviati tra server e client. Una volta stabilito ciò, il resto dei dati deve essere crittografato con questo segreto condiviso. Questo viene fatto prima di autenticare un client.
SSH può essere configurato per utilizzare una varietà di diversi sistemi di cifratura simmetrica, tra cui Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 e Arcfour. Il server e il client possono decidere entrambi un elenco delle loro cifrature supportate, ordinato per preferenza. La prima opzione dall’elenco del client che è disponibile sul server viene utilizzata come algoritmo di cifratura in entrambe le direzioni.
Su Ubuntu 20.04, sia il client che il server sono configurati per impostazione predefinita come segue:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
Questo significa che se due macchine Ubuntu 20.04 si collegano tra loro (senza sovrascrivere le cifre predefinite attraverso le opzioni di configurazione), utilizzeranno sempre per impostazione predefinita il cifrario [email protected]
per crittografare la loro connessione.
Crittografia Asimmetrica
La crittografia asimmetrica è diversa dalla crittografia simmetrica perché per inviare dati in una singola direzione sono necessarie due chiavi associate. Una di queste chiavi è nota come chiave privata, mentre l’altra è chiamata chiave pubblica.
La chiave pubblica può essere liberamente condivisa con qualsiasi parte. È associata alla sua chiave accoppiata, ma la chiave privata non può essere derivata dalla chiave pubblica. La relazione matematica tra la chiave pubblica e la chiave privata consente alla chiave pubblica di crittografare messaggi che possono essere decifrati solo dalla chiave privata. Questa è una capacità unidirezionale, il che significa che la chiave pubblica non ha la capacità di decifrare i messaggi che scrive, né può decifrare nulla che la chiave privata possa inviarle.
La chiave privata dovrebbe essere mantenuta completamente segreta e non dovrebbe mai essere condivisa con un’altra parte. Questo è un requisito fondamentale affinché il paradigma della chiave pubblica funzioni. La chiave privata è l’unico componente in grado di decifrare i messaggi che sono stati crittografati utilizzando la chiave pubblica associata. In virtù di questo fatto, qualsiasi entità in grado di decifrare questi messaggi ha dimostrato di essere in possesso della chiave privata.
SSH utilizza la crittografia asimmetrica in diversi punti. Durante il processo iniziale di scambio delle chiavi utilizzato per configurare la crittografia simmetrica (utilizzata per crittografare la sessione), viene utilizzata la crittografia asimmetrica. In questa fase, entrambe le parti producono coppie di chiavi temporanee e scambiano la chiave pubblica per produrre il segreto condiviso che sarà utilizzato per la crittografia simmetrica.
L’uso più discusso della crittografia asimmetrica con SSH proviene dall’autenticazione basata su chiave SSH. Le coppie di chiavi SSH possono essere utilizzate per autenticare un client su un server. Il client crea una coppia di chiavi e quindi carica la chiave pubblica su qualsiasi server remoto a cui desidera accedere. Questa viene inserita in un file chiamato authorized_keys
all’interno della directory ~/.ssh
nella directory home dell’account utente sul server remoto.
Dopo che la crittografia simmetrica è stata stabilita per garantire le comunicazioni tra il server e il client, il client deve autenticarsi per essere autorizzato ad accedere. Il server può utilizzare la chiave pubblica in questo file per crittografare un messaggio di sfida al client. Se il client può dimostrare di essere stato in grado di decifrare questo messaggio, ha dimostrato di possedere la chiave privata associata. Quindi il server può configurare l’ambiente per il client.
Hashing
Un’altra forma di manipolazione dei dati che SSH sfrutta è l’hashing crittografico. Le funzioni di hash crittografiche sono metodi per creare una “firma” sintetica o un riassunto di un insieme di informazioni. Le loro principali caratteristiche distintive sono che non sono mai pensate per essere invertite, sono praticamente impossibili da influenzare in modo prevedibile e sono praticamente uniche.
Usando la stessa funzione di hash e il messaggio dovrebbe produrre lo stesso hash; modificare qualsiasi parte dei dati dovrebbe produrre un hash completamente diverso. Un utente non dovrebbe essere in grado di produrre il messaggio originale da un determinato hash, ma dovrebbe essere in grado di capire se un determinato messaggio ha prodotto un determinato hash.
Data queste proprietà, gli hash sono principalmente utilizzati per fini di integrità dei dati e per verificare l’autenticità della comunicazione. Il principale utilizzo in SSH è con HMAC, o codici di autenticazione dei messaggi basati su hash. Questi sono utilizzati per garantire che il testo del messaggio ricevuto sia intatto e non modificato.
Come parte della negoziazione della crittografia simmetrica descritta in precedenza, viene selezionato un algoritmo di codice di autenticazione dei messaggi (MAC). L’algoritmo è scelto lavorando attraverso l’elenco delle scelte di MAC accettabili del client. Il primo di questa lista supportato dal server sarà utilizzato.
Ogni messaggio inviato dopo che la crittografia è stata negoziata deve contenere un MAC in modo che l’altra parte possa verificare l’integrità del pacchetto. Il MAC è calcolato dal segreto condiviso simmetrico, il numero di sequenza del pacchetto del messaggio e il contenuto effettivo del messaggio.
Il MAC stesso viene inviato all’esterno dell’area criptata in modo simmetrico come parte finale del pacchetto. In generale, i ricercatori raccomandano questo metodo di crittografia dei dati prima e poi il calcolo del MAC.
Comprendere Come Funziona SSH
Probabilmente hai già una comprensione di base di come funziona SSH. Il protocollo SSH impiega un modello client-server per autenticare due parti e crittografare i dati tra di esse.
Il componente server è in ascolto su una porta designata per le connessioni. È responsabile della negoziazione della connessione sicura, dell’autenticazione della parte che si connette e della creazione dell’ambiente corretto se le credenziali vengono accettate.
Il client è responsabile di avviare il protocollo di trasmissione iniziale del controllo di trasmissione (TCP) con il server, di negoziare la connessione sicura, di verificare che l’identità del server corrisponda alle informazioni precedentemente registrate e di fornire credenziali per l’autenticazione.
Una sessione SSH viene stabilita in due fasi separate. La prima consiste nel concordare e stabilire la crittografia per proteggere le comunicazioni future. La seconda fase consiste nell’autenticare l’utente e scoprire se l’accesso al server deve essere concesso.
Negoziazione dell’Encryptazione per la Sessione
Quando un client stabilisce una connessione TCP, il server risponde con le versioni del protocollo supportate. Se il client può corrispondere a una delle versioni del protocollo accettabili, la connessione continua. Il server fornisce anche la sua chiave host pubblica, che il client può usare per verificare se questo era l’host previsto.
A questo punto, entrambe le parti negoziano una chiave di sessione utilizzando una versione di qualcosa chiamata l’algoritmo Diffie-Hellman. Questo algoritmo (e le sue varianti) rendono possibile per ciascuna parte combinare i propri dati privati con i dati pubblici dell’altro sistema per arrivare a una chiave di sessione segreta identica.
La chiave di sessione verrà utilizzata per criptare l’intera sessione. Le coppie di chiavi pubbliche e private utilizzate per questa parte della procedura sono completamente separate dalle chiavi SSH utilizzate per autenticare un client presso il server.
La base di questa procedura per il classico Diffie-Hellman è:
- Entrambe le parti concordano su un grande numero primo, che servirà da valore di inizializzazione.
- Entrambe le parti concordano su un generatore di cifratura (tipicamente AES), che sarà utilizzato per manipolare i valori in un modo predefinito.
- Indipendentemente, ciascuna parte elabora un altro numero primo che viene tenuto segreto dall’altra parte. Questo numero viene utilizzato come chiave privata per questa interazione (differentemente dalla chiave SSH privata utilizzata per l’autenticazione).
- La chiave privata generata, il generatore di crittografia e il numero primo condiviso vengono utilizzati per generare una chiave pubblica derivata dalla chiave privata, ma che può essere condivisa con l’altra parte.
- Entrambi i partecipanti scambiano quindi le loro chiavi pubbliche generate.
- L’entità ricevente utilizza la propria chiave privata, la chiave pubblica dell’altra parte e il numero primo condiviso originale per calcolare una chiave segreta condivisa. Anche se calcolata indipendentemente da ciascuna parte, utilizzando chiavi private e pubbliche opposte, ciò porterà alla stessa chiave segreta condivisa.
- La chiave segreta condivisa viene quindi utilizzata per crittografare tutte le comunicazioni successive.
Questo processo consente a ciascuna parte di partecipare in modo equo alla generazione della chiave segreta condivisa, impedendo a un’estremità di controllare il segreto. Inoltre, si riesce a generare una chiave segreta condivisa identica senza mai dover inviare quelle informazioni su canali non sicuri. La crittografia della chiave segreta condivisa utilizzata per il resto della connessione è chiamata protocollo di pacchetti binari.
La chiave segreta generata è una chiave simmetrica, il che significa che la stessa chiave utilizzata per crittografare un messaggio può essere utilizzata per decifrarlo dall’altra parte. Lo scopo di questo è avvolgere tutte le comunicazioni future in un tunnel crittografato che non può essere decifrato da estranei.
Dopo che è stata stabilita la crittografia della sessione, inizia la fase di autenticazione dell’utente.
Autenticazione dell’accesso dell’utente al server
Il passo successivo consiste nell’autenticare l’utente e decidere sull’accesso. Ci sono alcuni metodi che possono essere utilizzati per l’autenticazione, in base a ciò che il server accetta.
Il metodo generale è l’autenticazione tramite password, che avviene quando il server richiede all’utente la password dell’account con cui sta cercando di accedere. La password viene inviata tramite la crittografia negoziata, quindi è sicura da parte di terze parti.
Anche se la password sarà crittografata, questo metodo non è generalmente raccomandato a causa delle limitazioni sulla complessità della password. Gli script automatizzati possono violare facilmente le password di lunghezze normali rispetto ad altri metodi di autenticazione.
La soluzione alternativa più popolare e raccomandata è l’uso delle coppie di chiavi SSH. Le coppie di chiavi SSH sono chiavi asimmetriche, il che significa che le due chiavi associate svolgono funzioni diverse.
La chiave pubblica viene utilizzata per crittografare dati che possono essere decifrati solo con la chiave privata. La chiave pubblica può essere liberamente condivisa, perché, anche se può crittografare per la chiave privata, non esiste un metodo per derivare la chiave privata dalla chiave pubblica.
L’autenticazione utilizzando le coppie di chiavi SSH inizia dopo che la crittografia simmetrica è stata stabilita come descritto nella sezione precedente. La procedura avviene come segue:
- Il client inizia inviando un ID per la coppia di chiavi con cui desidera autenticarsi al server.
- Il server controlla il file
authorized_keys
dell’account a cui il client sta cercando di accedere per l’ID della chiave. - Se una chiave pubblica con un ID corrispondente viene trovata nel file, il server genera un numero casuale e utilizza la chiave pubblica per criptare il numero.
- Il server invia al client questo messaggio criptato.
- Se il client ha effettivamente la chiave privata associata, sarà in grado di decifrare il messaggio utilizzando quella chiave, rivelando il numero originale.
- Il client combina il numero decifrato con la chiave di sessione condivisa che viene utilizzata per criptare la comunicazione, e calcola l’hash MD5 di questo valore. MD5 è un algoritmo di digestione del messaggio che utilizza la funzione di hash per generare un valore di hash a 128 bit.
- Il client invia quindi questo hash MD5 al server come risposta al messaggio del numero criptato.
- Il server utilizza la stessa chiave di sessione condivisa e il numero originale che ha inviato al client per calcolare il valore MD5 da solo. Confronta il proprio calcolo con quello inviato dal client. Se questi due valori corrispondono, si dimostra che il client era in possesso della chiave privata e il client è autenticato.
In sintesi, l’asimmetria delle chiavi consente al server di crittografare i messaggi per il client utilizzando la chiave pubblica. Il client può quindi dimostrare di possedere la chiave privata decifrando correttamente il messaggio. I due tipi di crittografia utilizzati (segreto condiviso simmetrico e chiavi pubbliche/ private asimmetriche) sono in grado di sfruttare le loro specifiche capacità in questo modello.
Conclusioni
Apprendere i passaggi della negoziazione della connessione e i livelli di crittografia coinvolti in SSH può aiutarti a comprendere meglio cosa succede quando accedi a un server remoto. Ora puoi riconoscere la relazione tra vari componenti e algoritmi e capire come tutte queste parti si integrano. Per saperne di più su SSH, consulta le seguenti guide:
- Come configurare l’autenticazione basata su chiavi SSH su un server Linux
- Come utilizzare SSH per connettersi a un server remoto
- Come configurare le chiavi SSH per vari sistemi operativi
SSH Essentials: Lavorare con server SSH, client e chiavi - SSH Essentials: Lavorare con Server SSH, Client e Chiavi