Benchmarking delle Cifrature SSH: Scegliere la Crittografia più Veloce per la Tua Rete
Esegui il benchmark delle cifrature SSH in sicurezza con scp, ssh, dd e pv, quindi scegli AES-GCM o ChaCha20 in base al tuo hardware effettivo.
Benchmarking delle Cifrature SSH: Scegliere la Crittografia più Veloce per la Tua Rete
Il benchmarking delle cifrature SSH è utile quando i trasferimenti crittografati sono più lenti di quanto la rete dovrebbe consentire. La cifratura non è sempre il collo di bottiglia, ma su collegamenti veloci o CPU piccole può determinare se scp, sftp o rsync -e ssh saturano la connessione.
La risposta giusta dipende dal tuo client, server, funzionalità della CPU, build di OpenSSH e percorso di rete. Testa nel tuo ambiente prima di modificare le impostazioni predefinite su larga scala.
Comprendere le Cifrature SSH e il Loro Ruolo
Una cifratura SSH è un algoritmo utilizzato per crittografare e decrittografare i dati scambiati tra un client e un server SSH. Il suo obiettivo principale è garantire la riservatezza, l'integrità e l'autenticità della comunicazione. Quando avvii una connessione SSH, il client e il server negoziano un insieme di algoritmi (cifrature, MAC, metodi di scambio di chiavi) che entrambi supportano, concordando infine sulle opzioni più forti e preferite. Questo processo di negoziazione è fondamentale per stabilire un canale sicuro.
Diverse cifrature impiegano operazioni matematiche distinte, portando a richieste computazionali variabili. Alcune cifrature sono ottimizzate per l'accelerazione hardware, sfruttando istruzioni specializzate della CPU, mentre altre sono progettate per funzionare in modo efficiente in software su una gamma più ampia di processori. La scelta della cifratura, quindi, influisce direttamente sull'utilizzo della CPU e sulle velocità di trasferimento dati risultanti.
Principali Cifrature SSH Moderne per le Prestazioni
Negli ambienti SSH moderni, due famiglie di cifrature di crittografia autenticata si distinguono per il loro eccellente equilibrio tra sicurezza e prestazioni: AES-GCM e ChaCha20-Poly1305. Entrambe forniscono crittografia autenticata con dati associati (AEAD), il che significa che crittografano i dati e forniscono il controllo dell'integrità in un unico passaggio, il che è più efficiente e sicuro rispetto ai vecchi approcci crittografa-poi-MAC.
AES-GCM (Advanced Encryption Standard - Galois/Counter Mode)
AES-GCM è un cifrario a blocchi molto popolare e ampiamente adottato che opera in modalità Galois/Counter. Offre una forte sicurezza ed è particolarmente veloce su sistemi con supporto hardware per AES. La maggior parte delle CPU moderne (Intel, AMD e sempre più processori ARM) includono set di istruzioni dedicati (come AES-NI sulle architetture x86/x64) che accelerano drasticamente le operazioni AES, rendendo AES-GCM estremamente efficiente.
- Pro: Prestazioni eccellenti su CPU con accelerazione hardware, forte sicurezza, ampio supporto.
- Contro: Può essere più lento nelle implementazioni solo software (ad esempio, su CPU più vecchie o specializzate senza AES-NI).
ChaCha20-Poly1305
ChaCha20-Poly1305 è un cifrario a flusso sviluppato da Daniel J. Bernstein. È noto per il suo design amichevole per il software, funzionando molto bene anche su CPU senza specifica accelerazione hardware crittografica. Questo lo rende una scelta eccellente per una vasta gamma di hardware, inclusi sistemi embedded, processori più vecchi o ambienti in cui l'accelerazione hardware non è costantemente disponibile o ottimizzata per altri algoritmi.
- Pro: Eccellenti prestazioni software, forte sicurezza, resistenza agli attacchi di canale laterale temporale.
- Contro: Generalmente non veloce come AES-GCM con accelerazione hardware su CPU desktop/server moderne.
Fattori che Influenzano le Prestazioni della Cifratura
La cifratura "più veloce" non è universalmente fissa; dipende da diversi fattori chiave:
- Architettura della CPU e Accelerazione Hardware: Questo è il fattore più significativo. Se la tua CPU ha AES-NI o istruzioni simili, AES-GCM supererà quasi certamente ChaCha20-Poly1305. Senza di esso, ChaCha20-Poly1305 potrebbe prendere il comando.
- Implementazioni del Client e del Server SSH: L'efficienza del software SSH (ad esempio, OpenSSH) e delle librerie crittografiche che utilizza (ad esempio, OpenSSL) può influire sulle prestazioni reali. Le versioni più recenti spesso includono ottimizzazioni.
- Condizioni di Rete: Sebbene non siano direttamente correlate alla velocità della cifratura, la latenza di rete e la larghezza di banda disponibile possono mascherare o amplificare la differenza percepita nelle prestazioni della cifratura. Su una rete molto lenta, il costo della CPU per la crittografia potrebbe essere trascurabile rispetto ai limiti di rete. Su una rete molto veloce (ad esempio, 10 Gbps o più), la crittografia legata alla CPU può diventare il collo di bottiglia.
- Volume e Tipo di Dati: Il benchmarking con diverse dimensioni di dati (file piccoli vs. file grandi) e tipi (comprimibili vs. non comprimibili) può rivelare diverse caratteristiche prestazionali. Ad esempio, trasferimenti molto piccoli potrebbero essere dominati dal sovraccarico di configurazione della connessione piuttosto che dalla velocità della cifratura.
Come Eseguire il Benchmark delle Prestazioni della Cifratura SSH
Il benchmarking implica dire esplicitamente a SSH di utilizzare una cifratura specifica e quindi misurare il tempo impiegato per trasferire una quantità nota di dati. Ciò consente un confronto diretto.
1. Identificare le Cifrature Supportate
Prima di iniziare, controlla quali cifrature supporta il tuo client SSH:
ssh -Q cipher
Quindi usa l'output SSH verboso per vedere cosa negozia una connessione reale:
ssh -vvv user@your_server
Cerca righe simili a debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none. La politica del server è controllata da Ciphers in sshd_config, ma il supporto effettivo dipende sia dal client che dal server.
2. Specificare le Cifrature con ssh -c
Il client ssh ti consente di specificare la cifratura desiderata utilizzando il flag -c. Puoi fornire un elenco separato da virgole e il client tenterà di utilizzare la prima cifratura supportata dall'elenco.
Cifrature comuni da testare:
3. Scegliere un Metodo di Trasferimento e una Fonte di Dati
Per un benchmarking coerente, avrai bisogno di un modo per trasferire una quantità nota di dati.
scp(Secure Copy): Ideale per trasferire file. Utilizza un file grande e non comprimibile per garantire che la cifratura sia il collo di bottiglia, non la compressione o l'I/O del disco.sftp(SSH File Transfer Protocol): Simile ascp, utile se preferisci quel protocollo.dd(Data Duplicator): Può generare un flusso di dati da inviare tramite SSH, utile per test di pura velocità effettiva senza sovraccarico del file system sul lato client.
Passaggi Pratici per il Benchmarking
Supponiamo che tu voglia eseguire il benchmark dei trasferimenti da un client a un server. Avrai bisogno di un file di test sul client (o server) che sia abbastanza grande (ad esempio, 1 GB) da consentire una misurazione significativa, ma non così grande che i test richiedano troppo tempo. Un buon modo per creare un file di test non comprimibile è utilizzare /dev/urandom. Usa /dev/zero solo quando la compressione SSH è disabilitata, perché i dati tutti zero sono altamente comprimibili.
Sul client (per creare un file fittizio da 1 GB):
pwd=$(pwd)
dd if=/dev/urandom of=$pwd/dummy_1GB.bin bs=1M count=1024 iflag=fullblock
Benchmarking con scp:
Test AES256-GCM:
echo "Test AES256-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_gcm.binTest ChaCha20-Poly1305:
echo "Test ChaCha20-Poly1305..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_chacha.binTest AES128-GCM (spesso il più veloce):
echo "Test AES128-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_aes128_gcm.bin
Benchmarking con dd e pv (per la velocità effettiva in tempo reale):
Questo metodo invia dati tramite SSH e può mostrare le velocità in tempo reale, riducendo l'I/O del disco come collo di bottiglia. pv (Pipe Viewer) ti fornisce informazioni sullo stato di avanzamento e sulla velocità effettiva.
Per installare pv (se non già installato):
sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv # RHEL/CentOS
sudo brew install pv # macOS
Test AES256-GCM con
ddepv:echo "Test AES256-GCM con dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] user@your_server "cat > /dev/null"Test ChaCha20-Poly1305 con
ddepv:echo "Test ChaCha20-Poly1305 con dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] user@your_server "cat > /dev/null"
Suggerimento: Esegui ogni test più volte (ad esempio, 3-5 volte) e prendi la media per tenere conto delle fluttuazioni di rete o del carico di sistema.
Interpretare i Risultati e Raccomandazioni
Dopo aver eseguito i tuoi benchmark, confronta il tempo real dagli output del comando time o la velocità effettiva media riportata da pv. Probabilmente osserverai modelli distinti:
- CPU moderne con AES-NI: Troverai quasi certamente che
[email protected]e[email protected]offrono la massima velocità effettiva. AES-128 è spesso leggermente più veloce di AES-256 a causa di meno round, ma la differenza potrebbe essere trascurabile sui sistemi con accelerazione hardware. - CPU più vecchie, ARM (senza estensioni crittografiche specifiche) o Macchine Virtuali: ChaCha20-Poly1305 può funzionare in modo comparabile o addirittura superare AES-GCM, poiché il suo design ottimizzato per il software brilla in questi scenari.
Raccomandazioni:
- Per server ad alte prestazioni con CPU Intel/AMD moderne (e AES-NI): Dai la priorità ad AES-GCM (specialmente
[email protected]). Sfrutta l'accelerazione hardware per velocità e sicurezza superiori. - Per ambienti diversificati, hardware più vecchio, sistemi basati su ARM o situazioni che favoriscono le prestazioni software: ChaCha20-Poly1305 è una scelta eccellente, fornendo una forte sicurezza con prestazioni elevate e costanti su varie architetture senza fare affidamento su funzionalità hardware specifiche.
- Sicurezza Prima di Tutto: Scegli sempre cifrature che forniscono crittografia autenticata (AEAD). Sia AES-GCM che ChaCha20-Poly1305 sono cifrature AEAD e sono considerate forti. Evita le vecchie cifrature non AEAD come
aes*-cbcse possibile.
Altre Considerazioni sulle Prestazioni SSH
Sebbene la selezione della cifratura sia cruciale, ricorda che fa parte di un quadro prestazionale più ampio:
- Compressione: SSH può comprimere i dati prima della crittografia (
-o Compression=yesoCompression yesin~/.ssh/config). Per dati altamente comprimibili su collegamenti lenti, questo può migliorare drasticamente la velocità percepita, anche se aggiunge un leggero sovraccarico della CPU. Per dati già compressi o collegamenti molto veloci, potrebbe ridurre le prestazioni. - Multiplexing della Connessione: Funzionalità come
ControlMasterin OpenSSH consentono a più sessioni SSH di riutilizzare una singola connessione TCP sottostante, riducendo il sovraccarico di handshake per le connessioni successive. - MTU (Maximum Transmission Unit): Assicurati che l'MTU della tua rete sia ottimizzato per prevenire la frammentazione, che può degradare le prestazioni.
- Versione del Client/Server SSH: Mantieni aggiornati il software del client e del server SSH. Le versioni più recenti spesso includono miglioramenti delle prestazioni e supporto per cifrature più nuove e veloci.
Scegli dalle Tue Misurazioni
Ottimizzare la selezione della cifratura SSH può migliorare le prestazioni del trasferimento sicuro, ma solo quando la crittografia è il fattore limitante. Esegui diversi test, mantieni coerenti compressione e dimensione del file e confronta l'utilizzo della CPU oltre al tempo di trasferimento.
Per molti server moderni, AES-GCM funziona bene grazie all'accelerazione hardware. Su sistemi più vecchi, hardware embedded e alcuni ambienti virtualizzati, ChaCha20-Poly1305 potrebbe essere la scelta migliore. Tieni le vecchie cifrature CBC fuori dall'uso normale a meno che tu non abbia un requisito di compatibilità che puoi isolare e documentare.