Ricerca nel sito web

Comprensione della crittografia SSH e del processo di connessione


introduzione

SSH, o secure shell, è un protocollo sicuro e il modo più comune per amministrare in modo sicuro i server remoti. Utilizzando una serie di tecnologie di crittografia, SSH fornisce un meccanismo per stabilire una connessione crittograficamente protetta tra due parti, autenticare ciascuna parte all'altra e passare avanti e indietro comandi e output.

In questa guida, esamineremo le tecniche di crittografia sottostanti impiegate da SSH e i metodi che utilizza per stabilire connessioni sicure. Queste informazioni possono essere utili per comprendere i vari livelli di crittografia e i diversi passaggi necessari per formare una connessione e autenticare entrambe le parti.

Comprendere la crittografia simmetrica, la crittografia asimmetrica e gli hash

Per proteggere la trasmissione delle informazioni, SSH impiega una serie di diversi tipi di tecniche di manipolazione dei dati in vari punti della transazione. Questi includono forme di crittografia simmetrica, crittografia asimmetrica e hashing.

Crittografia simmetrica

La relazione dei componenti che crittografano e decrittografano 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 crittografare i messaggi inviati alla parte opposta e anche per decrittografare i messaggi ricevuti dall'altro partecipante. Ciò significa che chiunque detenga la chiave può crittografare e decrittografare i messaggi inviati a chiunque altro detenga la chiave.

Questo tipo di schema di crittografia è spesso chiamato crittografia \segreto condiviso o crittografia \chiave segreta. In genere esiste una sola chiave utilizzata per tutte le operazioni o una coppia di chiavi in cui la relazione è rilevabile ed è banale derivare la chiave opposta.

Le chiavi simmetriche vengono utilizzate da SSH per crittografare l'intera connessione. Contrariamente a quanto presumono alcuni utenti, 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 di proteggere anche l'autenticazione della password dallo snooping.

Il client e il server contribuiscono entrambi a stabilire questa chiave e il segreto risultante non è mai noto alle parti esterne. La chiave segreta viene creata tramite un processo noto come algoritmo di scambio di chiavi. Questo scambio fa sì che il server e il client arrivino entrambi alla stessa chiave in modo indipendente condividendo determinati 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 vera e propria per i dati scambiati tra server e client. Una volta stabilito questo, 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 simmetrici, tra cui Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 e Arcfour. Il server e il client possono entrambi decidere su un elenco delle loro crittografie supportate, ordinate per preferenza. La prima opzione dall'elenco del client disponibile sul server viene utilizzata come algoritmo di cifratura in entrambe le direzioni.

Su Ubuntu 20.04, sia il client che il server sono impostati come segue:

  • chacha20-poly1305@openssh.com
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • aes128-gcm@openssh.com
  • aes256-gcm@openssh.com

Ciò significa che se due macchine Ubuntu 20.04 si connettono l'una all'altra (senza sovrascrivere le crittografie predefinite tramite le opzioni di configurazione), utilizzeranno sempre per impostazione predefinita la cifra chacha20-poly1305@openssh.com per crittografare la loro connessione .

Crittografia asimmetrica

La crittografia asimmetrica è diversa dalla crittografia simmetrica perché per inviare i dati in un'unica 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 condivisa liberamente con qualsiasi parte. È associato 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 i messaggi che possono essere decifrati solo dalla chiave privata. Questa è un'abilità unidirezionale, il che significa che la chiave pubblica non ha la capacità di decrittografare i messaggi che scrive, né può decrittografare nulla che la chiave privata possa inviarle.

La chiave privata dovrebbe essere tenuta completamente segreta e non dovrebbe mai essere condivisa con un'altra parte. Questo è un requisito fondamentale per il funzionamento del paradigma a chiave pubblica. La chiave privata è l'unico componente in grado di decrittografare i messaggi crittografati utilizzando la chiave pubblica associata. In virtù di questo fatto, qualsiasi entità in grado di decifrare questi messaggi ha dimostrato di avere il controllo della chiave privata.

SSH utilizza la crittografia asimmetrica in alcuni punti diversi. 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 si scambiano la chiave pubblica per produrre il segreto condiviso che verrà utilizzato per la crittografia simmetrica.

L'uso più discusso della crittografia asimmetrica con SSH deriva 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. Questo viene inserito in un file chiamato authorized_keys all'interno della directory ~/.ssh nella home directory dell'account utente sul server remoto.

Dopo aver stabilito la crittografia simmetrica per proteggere le comunicazioni tra il server e il client, il client deve autenticarsi per poter 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 decrittografare 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 di cui SSH si avvale è l'hashing crittografico. Le funzioni hash crittografiche sono metodi per creare una firma succinta o un riepilogo di un insieme di informazioni. I loro principali attributi distintivi sono che non sono mai destinate a essere annullate, sono praticamente impossibili da influenzare in modo prevedibile, e sono praticamente unici.

L'utilizzo della stessa funzione di hashing e dello stesso messaggio dovrebbe produrre lo stesso hash; la modifica di qualsiasi parte dei dati dovrebbe produrre un hash completamente diverso. Un utente non dovrebbe essere in grado di produrre il messaggio originale da un dato hash, ma dovrebbe essere in grado di dire se un dato messaggio ha prodotto un dato hash.

Date queste proprietà, gli hash vengono utilizzati principalmente per scopi di integrità dei dati e per verificare l'autenticità della comunicazione. L'uso principale in SSH è con HMAC, o codici di autenticazione dei messaggi basati su hash. Questi vengono utilizzati per garantire che il testo del messaggio ricevuto sia intatto e non modificato.

Come parte della negoziazione della crittografia simmetrica delineata in precedenza, viene selezionato un algoritmo MAC (message authentication code). L'algoritmo viene scelto elaborando l'elenco del client di scelte MAC accettabili. Verrà utilizzato il primo in questo elenco supportato dal server.

Ogni messaggio inviato dopo la negoziazione della crittografia deve contenere un MAC in modo che l'altra parte possa verificare l'integrità del pacchetto. Il MAC viene calcolato dal segreto condiviso simmetrico, dal numero di sequenza del pacchetto del messaggio e dal contenuto effettivo del messaggio.

Il MAC stesso viene inviato al di fuori dell'area crittografata simmetricamente come parte finale del pacchetto. I ricercatori generalmente raccomandano questo metodo per crittografare prima i dati e quindi calcolare il MAC.

Capire come funziona SSH

Probabilmente hai già una conoscenza di base di come funziona SSH. Il protocollo SSH utilizza un modello client-server per autenticare due parti e crittografare i dati tra di loro.

Il componente server è in ascolto su una porta designata per le connessioni. È responsabile della negoziazione della connessione protetta, dell'autenticazione della parte che si connette e della generazione dell'ambiente corretto se le credenziali vengono accettate.

Il client è responsabile dell'avvio dell'handshake TCP (Transmission Control Protocol) iniziale con il server, della negoziazione della connessione sicura, della verifica che l'identità del server corrisponda alle informazioni registrate in precedenza e della fornitura delle credenziali per l'autenticazione.

Una sessione SSH viene stabilita in due fasi separate. Il primo è concordare e stabilire la crittografia per proteggere le comunicazioni future. La seconda fase consiste nell'autenticare l'utente e scoprire se deve essere concesso l'accesso al server.

Crittografia di negoziazione per la sessione

Quando un client effettua una connessione TCP, il server risponde con le versioni del protocollo che supporta. Se il client può corrispondere a una delle versioni di protocollo accettabili, la connessione continua. Il server fornisce anche la sua chiave host pubblica, che il client può utilizzare per verificare se questo era l'host previsto.

A questo punto, entrambe le parti negoziano una chiave di sessione utilizzando una versione di qualcosa chiamato algoritmo Diffie-Hellman. Questo algoritmo (e le sue varianti) consente a ciascuna parte di 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 crittografare l'intera sessione. Le coppie di chiavi pubblica e privata utilizzate per questa parte della procedura sono completamente separate dalle chiavi SSH utilizzate per autenticare un client sul server.

Le basi di questa procedura per il classico Diffie-Hellman sono:

  • Entrambe le parti concordano su un grande numero primo, che fungerà da valore iniziale.
  • Entrambe le parti concordano su un generatore di crittografia (in genere AES), che verrà utilizzato per manipolare i valori in un modo predefinito.
  • Indipendentemente, ogni parte esce con un altro numero primo che viene tenuto segreto all'altra parte. Questo numero viene utilizzato come chiave privata per questa interazione (diversa 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 si scambiano quindi le 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 questo viene calcolato in modo indipendente da ciascuna parte, utilizzando chiavi private e pubbliche opposte, risulterà nella stessa chiave segreta condivisa.
  • Il segreto condiviso viene quindi utilizzato per crittografare tutte le comunicazioni successive.

Questo processo consente a ciascuna parte di partecipare equamente alla generazione del segreto condiviso, il che non consente a un'estremità di controllare il segreto. Svolge anche il compito di generare un segreto condiviso identico senza mai dover inviare tali informazioni su canali non sicuri. La crittografia del segreto condiviso utilizzata per il resto della connessione è chiamata protocollo a pacchetto binario.

Il segreto generato è una chiave simmetrica, il che significa che la stessa chiave utilizzata per crittografare un messaggio può essere utilizzata per decrittografarlo dall'altra parte. Lo scopo è avvolgere tutte le ulteriori comunicazioni in un tunnel crittografato che non può essere decifrato da estranei.

Dopo aver stabilito la crittografia della sessione, inizia la fase di autenticazione dell'utente.

Autenticazione dell'accesso dell'utente al server

Il passaggio successivo prevede l'autenticazione dell'utente e la decisione sull'accesso. Esistono alcuni metodi che possono essere utilizzati per l'autenticazione, in base a ciò che il server accetta.

Il metodo generale è l'autenticazione della password, ovvero quando il server richiede al client la password dell'account con cui sta tentando di accedere. La password viene inviata tramite la crittografia negoziata, quindi è protetta da parti esterne.

Anche se la password verrà crittografata, questo metodo non è generalmente consigliato a causa delle limitazioni sulla complessità della password. Gli script automatici possono violare le password di lunghezza normale molto facilmente rispetto ad altri metodi di autenticazione.

L'alternativa più popolare e consigliata è l'uso di 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 i dati che possono essere decrittografati solo con la chiave privata. La chiave pubblica può essere liberamente condivisa, poiché, sebbene possa crittografare per la chiave privata, non esiste alcun metodo per derivare la chiave privata dalla chiave pubblica.

L'autenticazione tramite coppie di chiavi SSH inizia dopo che è stata stabilita la crittografia simmetrica come descritto nella sezione precedente. La procedura avviene come segue:

  • Il client inizia inviando al server un ID per la coppia di chiavi con cui desidera autenticarsi.
  • Il server controlla il file authorized_keys dell'account a cui il client sta tentando di accedere per l'ID chiave.
  • Se nel file viene trovata una chiave pubblica con un ID corrispondente, il server genera un numero casuale e utilizza la chiave pubblica per crittografare il numero.
  • Il server invia al client questo messaggio crittografato.
  • Se il client ha effettivamente la chiave privata associata, sarà in grado di decrittografare il messaggio utilizzando quella chiave, rivelando il numero originale.
  • Il client combina il numero decrittografato con la chiave di sessione condivisa utilizzata per crittografare la comunicazione e calcola l'hash MD5 di questo valore. MD5 è un algoritmo di digest dei messaggi che utilizza la funzione hash per generare un valore hash a 128 bit.
  • Il client invia quindi questo hash MD5 al server come risposta al messaggio numerico crittografato.
  • Il server utilizza la stessa chiave di sessione condivisa e il numero originale che ha inviato al client per calcolare autonomamente il valore MD5. Confronta il proprio calcolo con quello inviato dal cliente. Se questi due valori corrispondono, 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 al client utilizzando la chiave pubblica. Il client può quindi dimostrare di detenere la chiave privata decrittografando correttamente il messaggio. I due tipi di crittografia utilizzati (segreto condiviso simmetrico e chiavi pubbliche/private asimmetriche) sono ciascuno in grado di sfruttare i propri punti di forza specifici in questo modello.

Conclusione

Conoscere le fasi di negoziazione della connessione e i livelli di crittografia al lavoro in SSH può aiutarti a capire meglio cosa sta succedendo quando accedi a un server remoto. Ora puoi riconoscere la relazione tra vari componenti e algoritmi e capire come tutti questi pezzi si incastrano. Per ulteriori informazioni su SSH, consulta le seguenti guide:

  • Come configurare l'autenticazione basata su chiave SSH su un server Linux
  • Come utilizzare SSH per connettersi a un server remoto
  • Come configurare le chiavi SSH per vari sistemi operativi
  • Nozioni di base su SSH: utilizzo di server, client e chiavi SSH